<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.aigamedev.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>Game AI for Developers</title>
      <description>AiGameDev.com articles, features and news about artificial intelligence in video games.</description>
      <link>http://aigamedev.com/</link>
      <pubDate>Thu, 02 Jul 2009 01:50:35 -0700</pubDate>
      
      <xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://aigamedev.com/feed/" type="application/rss+xml" /><feedburner:emailServiceId>AiGameDev</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Faigamedev.com%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Faigamedev.com%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Faigamedev.com%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://aigamedev.com/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Faigamedev.com%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Faigamedev.com%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Faigamedev.com%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
         <title>Paris Game AI Conference '09: Highlights, Photos &amp; Slides</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/a5ljx2MaS30/</link>
         <description>The Paris Game AI Conference 2009 took place earlier this month on June 10th and 11th, co-organised by AiGameDev.com and the CNAM where it was held. In total, almost 200 people from Europe and beyond attended this two day standalone event with [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/paris09-report/</guid>
         <pubDate>Sun, 28 Jun 2009 05:25:00 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img src="http://files.aigamedev.com/coverage/GAIC09h_AudienceBottom.small.jpg" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>The Paris Game AI Conference 2009 took place earlier this month on June 10th and 11th, co-organised by <tt>AiGameDev.com</tt> and the CNAM where it was held. In total, almost 200 people from Europe and beyond attended this two day standalone event &mdash; with around 170 attendees per session on average. The event was based on last year's innovative workshop that we held for the first time after another conference in Paris, although this year was an complete upgrade in every way: the presenters, content and location were better in all aspects!</p> <p>The whole event was made possible thanks to Stephane Natkin, director of the <a rel="nofollow" target="_blank" href="http://cedric.cnam.fr/">CEDRIC</a> research lab, and Axel Buendia, CEO of the middleware company <a rel="nofollow" target="_blank" href="http://www.spirops.com">Spir.Ops</a>. The rest of the organisational committee was pretty much only myself (Alex Champandard) and Petra (Mrs <tt>AiGameDev.com</tt>) &mdash; which explains the last few quiet weeks as we recover from the hectic months of organisation...</p> <p>In the following post, you'll find the original slides for the presentations, my personal takeaway and executive summary from each session, and some references as appropriate. The recordings will take time to prepare edit, but all audio and video will be published over the next four months in the <tt>AiGameDev.com</tt> Premium area. (<a rel="nofollow" target="_blank" href="http://aigamedev.com/launch/">Sign-up here</a> if you'd like to see this again next year!)</p> <p style="border:1px dashed #444;background-color:#ddd;padding:1em;"><a rel="nofollow" target="_blank" href="http://www.havok.com/"><img src="http://files.aigamedev.com/sponsors/havok.png" style="padding-top:1ex;" style="float:right;margin-left:1em;" align="right" hspace="32"/></a> The coffee breaks on Wednesday were sponsored by <a rel="nofollow" target="_blank" href="http://www.havok.com/">Havok</a>. We'd like to thank Havok for their continuing support of <tt>AiGameDev.com</tt>. Their company has offices in Dublin and San Francisco, and recently <a rel="nofollow" target="_blank" href="http://aigamedev.com/open/article/havok-ai-announced/">released</a> their Havok AI&trade; solution to complement the existing packages like Havok Behavior&trade;. For details, don't hesitate to contact them!</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_AudienceTop.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_AudienceTop.medium.jpg" alt="The Audience at the Paris Game AI Conference"/></a>
<p><br/><u>Photo 1</u>: View from the audience in the amphi-theater during the HTN and Planning panel.</p>
</div> <h3>Table of Content</h3> <p>On this page, you'll find the coverage of the following sessions:</p> <ol>
<li><p><a rel="nofollow" href="#session1">State of the Industry</a></p></li>
<li><p><a rel="nofollow" href="#session2">Emotions in Game Characters</a></p></li>
<li><p><a rel="nofollow" href="#session3">Coordinating Agents with Behavior Trees</a></p></li>
<li><p><a rel="nofollow" href="#session4">Squad Behaviors Discussion</a></p></li>
<li><p><a rel="nofollow" href="#session5">The AI for Killzone 2's Multiplayer Bots</a></p></li>
<li><p><a rel="nofollow" href="#session6">Multithreading AI</a></p></li>
<li><p><a rel="nofollow" href="#session7">The Art of Multithreading</a></p></li>
</ol> <p>That was day one, and day two follows:</p> <ol start="8">
<li><p><a rel="nofollow" href="#session8">Advice and Tales from the Trenches</a></p></li>
<li><p><a rel="nofollow" href="#session9">Coordinating Unit Maneuvers Using HTN and A*</a></p></li>
<li><p><a rel="nofollow" href="#session10">HTN and Planning in Games Discussion</a></p></li>
<li><p><a rel="nofollow" href="#session11">Interactive Narrative Generation and Story Telling</a></p></li>
<li><p><a rel="nofollow" href="#session12">Discussion about Emergent Stories in Games</a></p></li>
<li><p><a rel="nofollow" href="#session13">The Racing AI in Pure</a></p></li>
<li><p><a rel="nofollow" href="#session14"> Game Characters from Animation to AI</a></p></li>
<li><p><a rel="nofollow" href="#session15">Building Navigation Meshes by Voxelization</a></p></li>
</ol> <h3>Other Coverage</h3> <p>There were many active bloggers and game development enthusiasts in the crowd who took notes during the event. You can find them here:</p> <ul>
<li><p><a rel="nofollow" target="_blank" href="http://www.gamedev.net/reference/business/features/parisAI09/">Stefan Maton's Feature</a> on GameDev.net,</p></li>
<li><p><a rel="nofollow" target="_blank" href="http://aarmstrong.org/notes/paris-2009">Andrew Armstrong's Coverage</a> on his own site,</p></li>
<li><p><a rel="nofollow" target="_blank" href="http://forums.aigamedev.com/showthread.php?t=2836#posts">Gonçalo Lopes' Notes</a> in our forums.</p></li>
</ul> <p>Also, special thanks to everyone who helped during the day, and Phil Carlisle for his invaluable support and contribution to the event.</p> <h3 id="session1">State of the Industry</h3> <p>The conference started out with an informal ~30 minute session where I introduced all the speakers, and asked them about the current challenges of AI in the games industry. This session certainly felt experimental, but contributed heavily to the friendly atmosphere that persisted throughout the event &mdash; and many attendees appreciated that compared to other conferences.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09h_Alex.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09h_Alex.medium.jpg" alt="Alex Champandard"/></a>
<p><br/><u>Photo 2</u>: Alex Champandard.</p>
</div> <p>The basic takeaway from this session was a theme that was left open at the end of the <a rel="nofollow" target="_blank" href="http://aigamedev.com/open/coverage/gdc09-slides-highlights/">AI Summit</a>. At the end, a veteran programmer called Brian (who worked on Starcraft's pathfinding system at Blizzard) asked a question along these lines:</p> <blockquote>&ldquo;If you had to sum up the last ten years in game AI in one sentence, what would you say?&rdquo;</blockquote> <p>Obviously, it's a hard question and the answers that were given at the time weren't particularly conclusive. Brian mentioned this at our <tt>AiGameDev.com</tt> Launch Party that evening, and I gave him the following answer &mdash; which he seemed much happier with:</p> <blockquote>&ldquo;We've mastered the technology to the point where the major problems we have now are primarily in production and design.&rdquo;</blockquote> <p>Of course, this doesn't mean there's no innovation to be done in technology, but multiple sessions emphasized the importance of design and its interplay with the technology.</p> <h3 id="session2">Emotions in Game Characters</h3> <p><u>People</u>: Phil Carlisle</p> <h4>Description</h4> <p>Phil presented an overview of recent progress adding character and emotion to in game NPCs, as well as a review recent research in the field for developers who are curious about emotional reactions for game characters. He’ll also discussed this from a practical perspective using his work as the basis, outlining the techniques that are ready to be applied.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_Phil.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_Phil.medium.jpg" alt="Phil Carlisle during Q&A"/></a>
<p><br/><u>Photo 3</u>: Phil Carlisle during Q&A.</p>
</div> <h4>Takeaway</h4> <p>Phil got much more time to share his ideas than the last time I heard him speak, and he's made visible progress since then. Though he could have gone on for another 45 minutes!</p> <ul>
<li><p>There are various emotional models, but they all boil down to a set of floats!</p></li>
<li><p>The usual sense / think / act routine needs to be rethought for including emotions.</p></li>
<li><p>There's a big architectural diagram that most researchers use to implement their emotional systems.</p></li>
<li><p>Phil's behavior tree approach uses a blackboard, very similarly to the Killzone 2 AI presented later.</p></li>
</ul> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Emotions in Game Characters</b>
Phil Carlisle
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_EmotionsInGameCharacters_PhilCarlisle.pdf'>PDF</a> or <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_EmotionsInGameCharacters_PhilCarlisle.ppt'>PPT</a></pre> <h4>References</h4> <h3 id="session3">Coordinating Agents with Behavior Trees</h3> <p><u>People</u>: Ricardo Pillosu</p> <h4>Description</h4> <p>Recently, the concept of Behaviour Trees has been gaining traction and was used in games like Spore or Halo 3. Crytek has adopted and developed this technology to also coordinate different agents in complex situations. After a introduction to Crytek's perspective on Behaviour Trees, Ricardo provided examples on how this concept can be used to simulate group tactics.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_CoordinationRicard1.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_CoordinationRicard1.medium.jpg" alt="Ricardo Pillosu interacting with the audience."/></a>
<p><br/><u>Photo 4</u>: Ricardo Pillosu interacting with the audience.</p>
</div> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Coordinating Agents with Behavior Trees</b>
Ricardo Pillosu
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_CoordinatingAgents_RicardoPillosu.pdf'>PDF</a> or <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_CoordinatingAgents_RicardoPillosu.ppt'>PPT</a></pre> <h4>Takeaway</h4> <p>It was fascinating hearing about Ricardo's behavior tree innovations in contrast to last year's Paris '08 Workshop, when Ricardo wasn't yet fully convinced about BTs. But as a testimony to Crytek's team, and the power of behavior trees, this year he talked about extensions of their implementation.</p> <p>As for key points I took away from this:</p>
<ul>
<li><p>Ricardo's approach deals mainly with coordination via timing, enabling and disabling branches on demand.</p></li>
<li><p>Building more complex squad maneuvers with this approach would require distributing additional information to behaviors using a similar centralized manager.</p></li>
</ul> <p>Ricardo also mentioned simplicity as an explicit goal, though in my mind the complexity is in the problem itself and not the solution. So, there are different ways to achieve this in practice: either hide the complexity from the designer and let programmers do the work, provide a limited set of parameters and sliders to control the behaviors, or use smaller building blocks and combine them as necessary. All of these tricks are generally useful, but my favorite is the third as it results in more modular code &mdash; even though that's not what I'd always expose to designers.</p> <h4>References</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Behavior Trees for Next-Gen AI</b>
Alex J. Champandard
GDC Lyon 2007
<a rel="nofollow" target="_blank" href="http://aigamedev.com/insider/presentations/behavior-trees/">Watch Online</a> (free registration required)
</pre> <h3 id="session4">Squad Behaviors Discussion</h3> <p><u>People</u>: Florent Dotto, Mieszko Zielinski, Mikko Mononen, Ricard Pillosu</p> <h4>Description</h4> <p>This Q&A session follows Ricardo's talk; it features a panel discussion with Mieszko and Mikko, talking about squad behaviors in general. What are the biggest challenges and key points that we need to address going forwards? How can we improve the behaviors and make them easier to author?</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_GroupsSquadPanel1.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_GroupsSquadPanel1.medium.jpg" alt="Florent Dotto, Mieszko Zielinski, Mikko Mononen"/></a>
<p><br/><u>Photo 5</u>: Florent Dotto, Mieszko Zielinski, Mikko Mononen</p>
</div> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_GroupsSquadPanel2.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_GroupsSquadPanel2.medium.jpg"/></a>
<p><br/><u>Photo 6</u>: (Mikko Mononen), Ricard Pillosu</p>
</div> <h4>Takeaway</h4> <p>Since I moderated this panel, many of the questions were very relevant to me :-) So I got a lot out of this session, in particular:</p> <ul>
<li><p><b>Intuitive Control</b> &mdash; Mikko mentioned an idea he had of using war maps, like sketches drawn in the sand indicating how a battle should take place. Obviously this would be a great interface for players to interact with squads, though the bulk of the work would be in the pattern recognition and not the group logic!</p></li>
<li><p><b>Cheating</b> &mdash; Mieszko pointed out that it's relatively simple to make a squad behavior that doesn't cheat, simply sharing information from individual members. I suggested that having "embodied" individuals that don't cheat is possibly enough, then you can have the squad give out orders knowing how to maximize player satisfaction and using more information if necessary.</p></li>
<li><p><b>Top-Down</b> &mdash; There are two choices for building group behaviors: implicit coordination based no shared information (bottom-up), and explicit ordering (top-down). Mikko mentioned he preferred the top-down approach.</p></li>
<li><p><b>Obvious Behaviors</b> &mdash; Everyone emphasized the need to for making the group behaviors over the top, including audio queues and gestures. These can even work on their own without group behaviors as in F.E.A.R. In Crysis, a lot of time was spent making sure the person making gestures was visible on screen!</p></li>
</ul> <p>One fascinating topic we didn't have time to address, is building a mixed squad with NPCs and human players together. The challenges here are two-fold, trying to understand what the player is doing and adapting to that, as well as behaving in a combat situation context sensitively.</p> <h3 id="session5">The AI for Killzone 2's Multiplayer Bots</h3> <p><u>People</u>: Alex J. Champandard, (Tim Verveij), Remco Straatman</p> <h4>Description</h4> <p>This talk will discuss the implementation of bots in Killzone 2’s online and offline multi-player component. We will discuss the overall hierarchical AI framework, the way individual bot behaviors such as badge usage are implemented using our HTN planner, how individual behaviors mix with the overall objectives in multiplayer modes and how we use data acquired at run-time to influence the tactical decisions.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_Killzone2QA.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_Killzone2QA.medium.jpg" alt="Remco Straatman and Alex Champandard"/></a>
<p><br/><u>Photo 7</u>: Remco Straatman, Alex Champandard</p>
</div> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Killzone 2 Multiplayer Bots</b>
Remco Straatman, Tim Verveij, Alex Champandard
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_Killzone2Bots_StraatmanChampandard.pdf'>PDF</a> or <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_Killzone2Bots_StraatmanChampandard.ppt'>PPT</a></pre> <h4>Takeaway</h4> <p>I worked on this project and gave this talk, so my key points made it into the presentation and slides. However, a few are worth emphasizing:</p> <ul>
<li><p><b>HTN Planning</b> &mdash; This conference will mark the advent of Hierarchical Task Networks. It's becoming increasingly hard to make a case for non-hierarchical <a rel="nofollow" target="_blank" href="http://aigamedev.com/open/article/strips-theorem-proving-problem-solving/">STRIPS</a>-like goal-oriented planners.</p></li>
<li><p><b>FPS &amp; RTS AI</b> &mdash; The <a rel="nofollow" target="_blank" href="http://aigamedev.com/open/article/rts-fps/">question</a> of using techniques from RTS games in FPS games came up during multiple GDC panels this year. The multiplayer bots in Killzone 2 made a big stride in this direction!</p></li>
<li><p><b>Incremental Evolution</b> &mdash; Remco mentioned that the team has been working on the AI codebase over numerous years and multiple projects. I think this is very much obvious in the game.</p></li>
</ul> <h4>References</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>HTN Planning: Complexity and Expressivity</b>
K. Erol, J. Hendler, and Dana S. Nau.
<a rel="nofollow" target="_blank" href="http://www.cs.umd.edu/~nau/papers/aaai94.ps">Download PS</a>
</pre> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>SHOP: Simple Hierarchical Ordered Planner</b>
D. Nau, Y. Cao, A. Lotem, and H. Muñoz-Avila.
<a rel="nofollow" target="_blank" href="http://aigamedev.com/open/article/shop-htn/">View Online</a>
</pre> <h3 id="session6">Multithreading AI</h3> <p><u>People</u>: Bjoern Knafla</p> <h4>Description</h4> <p>Bjoern will provide an overview of the concepts and techniques that are the most
commonly used for parallelizing code in the games industry, and present some of
his own results applying multi-threading to a large crowd simulation.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09h_Bjoern.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09h_Bjoern.medium.jpg"/></a>
<p><br/><u>Photo 8</u>: Bjoern Knafla</p>
</div> <h4>Takeaway</h4> <p>I'll combine these notes with the following panel too. Here were my notes:</p> <ul>
<li><p><b>Design for Memory</b> &mdash; When paralellizing code, if you don't think about your memory accesses your game may end up being even slower!</p></li>
<li><p><b>Rethinking OO</b> &mdash; Object oriented design doesn't map directly to nice multi-threaded code. You'll almost be better off thinking at the plain C level!</p></li>
<li><p><b>Clean Code</b> &mdash; There are many patterns that will help you parallelize code, but having a nice codebase that doesn't involve a large <tt>Entity.h</tt> file is a good thing!</p></li>
<li><p><b>Incremental</b> &mdash; Don't try to do everything upfront, take your current code and move it to separate threads one piece at a time.</p></li>
</ul> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Parallelization of Game AI</b>
Bjoern Knafla
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_Parallelization_BjoernKnafla.pdf'>PDF</a></pre> <h3 id="session7">The Art of Multithreading</h3> <p><u>People</u>: Julien Hamaide, Markus Mohr, Bjoern Knafla</p> <h4>Description</h4> <p>Bjoern's presentation will be followed by a panel discussion with Julien and Markus
that looks into some of the more practical aspects of game AI multithreading.
Desining and architecture for concurrency can be a bit of an art, so be prepared
for more subjective and possibly controversial opinions!</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_Parallelism3.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_Parallelism3.medium.jpg" alt="(Alex Champandard), Markus Mohr, Bjoern Knafla, Julien Hamaide"/></a>
<p><br/><u>Photo 9</u>: (Alex Champandard), Markus Mohr, Bjoern Knafla, Julien Hamaide</p>
</div> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_Parallelism2.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_Parallelism2.medium.jpg" alt="Bjoern Knafla, Julien Hamaide"/></a>
<p><br/><u>Photo 10</u>: Bjoern Knafla, Julien Hamaide</p>
</div> <h3 id="session8">Advice and Tales from the Trenches</h3> <p><u>People</u>: Eduardo Jimenez, Phil Carlisle, Mieszko Zielinski</p> <h4>Description</h4> <p>In this interactive discussion panel, these veteran game developers will tell the story about how they got started, share some of their experiences from working in industry, and give advice to developers who are looking to get into the industry as AI Programmers.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_TrenchesPanel.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_TrenchesPanel.medium.jpg" alt="Phil Carlisle, Eduardo Jimenez, Mieszko Zielinski"/></a>
<p><br/><u>Photo 11</u>: Phil Carlisle, Eduardo Jimenez, Mieszko Zielinski</p>
</div> <h4>Takeaway</h4> <p>There were some interesting stories and perspective shared, but I'll save those for a separate blog post. Here's some advice for people trying to get into industry:</p> <ul>
<li><p><b>Generalize</b> &mdash; Even though you're likely to join large teams and work on specific problems, having general knowledge in game development and mastery of C++ will help you being able to solve anything that's thrown at you.</p></li>
<li><p><b>Go Indie!</b> &mdash; Everyone emphasized that the best thing you can do for your career is to build a game yourself. Phil also expressed surprise that so few students are becoming independent developers.</p></li>
<li><p><b>Be Lucky?</b> &mdash; This one I found rather funny. Everyone on the panel, myself included, mentioned that they'd first got into the industry with a bit of luck... So make sure you're in the right places at the right time!</p></li>
</ul> <h3 id="session9">Multi-Unit Planning with HTN and A*</h3> <p><u>People</u>: William van der Sterren</p> <h4>Description</h4> <p>William's presentation will discuss the application of HTN and A* to help plan and coordinate groups of units. In the context of a turn-based strategy game, he’ll show how a planner can be used offline to create stimulating new scenarios for current games without the need for manual scripting.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09h_WilliamvdSterren.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09h_WilliamvdSterren.medium.jpg" alt="William van der Sterren"/></a>
<p><br/><u>Photo 12</u>: William van der Sterren</p>
</div> <h4>Takeaway</h4> <p>This session was enlightening, for multiple reasons:</p> <ul>
<li><p><b>Mission Design</b> &mdash; Using AI to automatically help design missions is a hot topic in the game development community, particularly since Left 4 Dead. It can add lots of depth and replayability to the same game content.</p></li>
<li><p><b>Web Services</b> &mdash; Having the AI as a separate web-service I think is an idea that has potential, similarly to MMO clusters. I'm amazed Ruby's performance was good enough for this!</p></li>
<li><p><b>A* Heuristic Magic</b> &mdash; There's no getting away from the fact that A* based solutions rely heavily on black magic. This is the case also to get good performance, as with any STRIPS-like solution.</p></li>
</ul> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Multi-Unit Planning with HTN and A*</b>
William van der Sterren
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_MultiUnitPlanning_WilliamvanderSterren.pdf'>PDF</a></pre> <h3 id="session10">HTN and Planning in Games Discussion</h3> <p><u>People</u>: Remco Straatman, William van der Sterren</p> <h4>Description</h4> <p>The Q&A session following William's talk will include an informal discussion including Remco about the benefits and risks of using HTN in games, provide advice for developers keen to look into this approach, and look forward for where to move next.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_PlanningPanel.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_PlanningPanel.medium.jpg" alt="(Alex Champandard), Remco Straatman, William van der Sterren"/></a>
<p><br/><u>Photo 13</u>: (Alex Champandard), Remco Straatman, William van der Sterren</p>
</div> <h4>Takeaway</h4> <p>The topic of HTN Planners was one of the biggest ideas to come out of the Paris Game AI Conference '09. They combine many aspects of behavior trees along with the benefits of planning to reduce the authoring burden. You'll be hearing more about these in the future.</p> <p>It was also interesting to hear Remco's perspective on the performance challenges of getting the HTN Planner to run in realtime on the PS3, including using a depth-first "ordered" search.</p> <h3 id="session11">Interactive Narrative Generation and Story Telling</h3> <p><u>People</u>: Daniel Kudenko</p> <h4>Description</h4> <p>Daniel will be providing an overview over approaches to Interactive Drama, highlighting and summarizing the state of academic research on the subject, present an overview of selected systems, and point to potential avenues in industry collaboration to help you figure out where to start looking.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09h_StoryTellingDaniel.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09h_StoryTellingDaniel.medium.jpg" alt="Daniel Kudenko"/></a>
<p><br/><u>Photo 14</u>: Daniel Kudenko</p>
</div> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Approaches to Interactive Drama</b>
Daniel Kudenko
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_InteractiveDrama_DanielKudenko.pdf'>PDF</a></pre> <h3 id="session12">Discussion about Emergent Stories in Games</h3> <p><u>People</u>: Axel Buendia, Vincent Corruble, Daniel Kudenko</p> <h4>Description</h4> <p>Researchers in the field of procedural storytelling will answer questions from developers, and explain how academia would tackle many of the narrative challenges faced by modern games. Axel will act as the industry connection using examples from games like Far Cry 2, GTA 4 and S.T.A.L.K.E.R.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_StoryTellingPanel.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_StoryTellingPanel.medium.jpg" alt="Daniel Kudenko, Vincent Corruble"/></a>
<p><br/><u>Photo 15</u>: Daniel Kudenko, Vincent Corruble</p>
</div> <h4>Takeaway</h4> <p>For this session, my biggest takeaway came from a comment in the audience. It's the idea of using a dual AI representation, which includes character and an actor. One of them is responsible for making sure the story elements are chosen according to a pre-defined personality, and the other is responsible for assuring a certain basic level of human responsiveness.</p> <h3 id="session13">The Racing AI in Pure</h3> <p><u>People</u>: Eduardo Jimenez</p> <h4>Description</h4> <p>Eduardo will explain how the AI for riders is designed to prevent the feeling of rubber band AI that’s symptomatic of many racing games, and will present the solution to the problem applied in Pure which falls into the increasingly popular category of “experience management” for games.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_PureEduardo.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_PureEduardo.medium.jpg"/></a>
<p><br/><u>Photo 16</u>: Eduardo Jimenez</p>
</div> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Race Script: An Alternative to Rubber Band AI</b>
Eduardo Jimenez
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_RaceScript_EduardoJimenez.pdf'>PDF</a> or <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_RaceScript_EduardoJimenez.ppt'>PPT</a></pre> <h4>Takeaway</h4> <p>I very much enjoyed Eduardo's presentation, as it shows the importance of design in the whole process of creating critically acclaimed AI. It also falls into the domain of experience management, which is <i>the</i> area to be involved in at the moment! Some notes:</p> <ul>
<li><p><b>Groups</b> &mdash; Eduardo made it clear from the start that having the AI form groups with the player was a design goal, and this made the game much more fun.</p></li>
<li><p><b>Skills</b> &mdash; Many games actually include the idea of "AI skills" and Eduardo explained how the idea of game balancing could be done in other genres with a similar approach.</p></li>
<li><p><b>Player-Driven Design</b> &mdash; The idea of combining a player-centric approach with mostly autonomous AI is something that every game developer needs to address.</p></li>
</ul> <h3 id="session14">Game Characters from Animation to AI</h3> <h4>Description</h4> <p>This panel brings together an artist/animators, and animation programmers/designers to discuss the challenges of next-gen animation. How can we improve our current animation workflows to get around the usual motion capture problems? How can we improve the quality of characters without having gigabytes of motion capture?</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_CharacterAnimation2.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09w_CharacterAnimation2.medium.jpg"/></a>
<p><br/><u>Photo 16</u>: (Christiaan Moleman), Xavier Dolci, Phil Carlisle, Julien Hamaide</p>
</div> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09h_CharacterChristiaan.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09h_CharacterChristiaan.medium.jpg"/></a>
<p><br/><u>Photo 17</u>: Christiaan Moleman</p>
</div> <h4>Slides</h4> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>AI Characters from Animation to Behaviour</b>
Christiaan Moleman
Download <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_CharacterAnimation_ChristiaanMoleman.pdf'>PDF</a> or <a rel="nofollow" target="_blank" href='http://files.aigamedev.com/coverage/GAIC09_CharacterAnimation_ChristiaanMoleman.ppt'>PPT</a></pre> <h4>Takeaway</h4> <p>This session was setup based on the increasing need to know and understand character animation to build good AI. AI is also the best ally that animators have for improving animation quality. I'm a part-time animation geek, so I got a lot out of this session:</p> <ul>
<li><p><b>Gaze &amp; Head Tracking</b> &mdash; While most AAA games already use some form of eye and head movement, there's still a fair amount to be done in this area. In particular relating to the following...</p></li>
<li><p><b>Animation Timing</b> &mdash; One thing that Christiaan emphasized is that animation is really all about timing. Things like the muppets and the fraggles are more expressive than game characters because they have timing.</p></li>
<li><p><b>Design above Technology</b> &mdash; A recurring theme was that we have already lots of technology that can help us build more expressive characters. The question is more about finding situations and cases where this pays off.</p></li>
<li><p><b>Multi-Disciplinary Teams</b> &mdash; Based on the panelists' experience, having AI and animation programmers work alongside animators helps a lot, and integrating everyone into a "Character Team" made a big difference.</p></li>
</ul> <h3 id="session15">Building Navigation Meshes by Voxelization</h3> <p><u>People</u>: Mikko Mononen</p> <h4>Description</h4> <p>Mikko will talk about an open source R&D project of his called Recast. The project is based on the idea of converting polygon soups into navigation meshes that can be used for pathfinding in space. He’ll present his approach step by step and discuss the benefits of this approach compared to other techniques.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09w_VoxelizationMikko.large.jpg">
<img src="http://files.aigamedev.com/coverage/GAIC09w_VoxelizationMikko.medium.jpg"/></a>
<p><br/><u>Photo 18</u>: Mikko Mononen</p>
</div> <h4>Takeaway</h4> <p>I've seen Mikko's work and masterclasses in the past already, so my takeaways were mostly not technical, instead:</p> <ul>
<li><p><b>Bouncy Lines</b> &mdash; In the latest version of Mikko's library, he uses arcs as connections between nodes to better visualize the links between areas.</p></li>
<li><p><b>Visualization</b> &mdash; It struck me during the presentation how important debug visualizations are, and how useful they can be for explaining concepts.</p></li>
</ul> <h3>Conclusion</h3> <p>Seeing nearly 200 people passionate about game AI come together during these two days was incredible, and certainly one of the most rewarding moments of my professional career. A very large number of programmers from game studios around Europe attended including Ubisoft, Guerrilla Games, Arkane, Recoil Games, People Can Fly, Crytek and more. On top of that, a majority of game AI middleware developers were in the audience, including Wednesday's coffee break sponsors <a rel="nofollow" target="_blank" href="http://havok.com/">Havok</a> and of course <a rel="nofollow" target="_blank" href="http://spirops.com/">Spir.Ops</a> &mdash; with only one notable absence from Germany.</p> <p>What's particularly amazing is that everyone came especially to hear about artificial intelligence in computer games, and not just because this event was an appendix to another bigger conference which they happened to attend. (This was the case last year for our Paris Game AI Workshop '08.) On top of that, we were extremely lucky and thankful for the world-class lineup of speakers, who came not to get a pass to a conference but because they feel genuinely passionate about their topic. This passion and friendly atmosphere was apparently one of the most unique things about this event for attendees.</p> <p>To be honest, this event was a lot of work to prepare and organize &mdash; more so than Petra & I expected. But based on all the feedback, it's been incredibly valuable for both the European community and for game developers outside of the U.S. looking for a more a more accessible industry-oriented conference on game AI. We have pages full of things to improve, and the event will definitely return next year. Some major things will change, but this event will be back next year!</p> <p style="border:1px dashed #444;background-color:#ddd;padding:1em;">If you found any of this interesting, you can get the full edited recordings over the next few months as part of <tt>AiGameDev.com</tt> Premium. Of course, you get all the other benefits of our members-only content too! <a rel="nofollow" target="_blank" href="http://aigamedev.com/launch/">Sign-up here</a>.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/coverage/GAIC09h_AudienceBottom.large.jpg"><img src="http://files.aigamedev.com/coverage/GAIC09h_AudienceBottom.medium.jpg" alt="The Audience at the Paris Game AI Conference"/></a>
<p><br/><u>Photo 19</u>: View of the audience in the CNAM amphi-theater.</p>
</div> <h3>Comments and Feedback</h3> <blockquote>&ldquo;Congrats once again on pulling the conference off: it was by
far the most inspiring work-related event I've ever been to. I hope it will
become a regular event.&rdquo;<br/>&mdash; <small>Remco Straatman, Lead AI Programmer, Guerrilla Games.</small></blockquote> <blockquote>&ldquo;What a great event. Focused, consistently high quality material, inspiring presentations. Well done to everyone involved!&rdquo;<br/>&mdash; <small> Thomas Young, Founder, PathEngine.</small></blockquote> <blockquote>&ldquo;This conference was a real deal &mdash; cutting edge presentations and experienced speakers. My take away list from this one is impressive! I feel this event can really push Game AI forward!&rdquo;<br/>&mdash; <small>Mieszko Zielinski, AI Programmer, People Can Fly.</small></blockquote> <blockquote>&ldquo;I really hope this will become a regular event! I will definitely try to attend next year again. It was really inspiring and useful to see implementations of planners and BT's for example. Emotions in characters was a real eye-opener for me. We will start and try to implement some of these things in our game as fast as we can. Thank you!&rdquo;<br/>&mdash; <small>Joakim Wahlström, Gamplay-Programmer, Fatshark, Sweden.</small></blockquote> <blockquote>&ldquo;Awesome conferences, where professionals are sharing their knowledge, and their passion. It's quickly going to be the reference in the AI community.&rdquo;<br/>&mdash; <small>Xavier Dolci, Lead AI Programmer, Ubisoft Montpellier.</small></blockquote> <blockquote>&ldquo;Very interesting conferences, covering a wide array of subjects (wide enough to be sure that everyone learned something during these two days). I'd definitely want to be there for a second edition...&rdquo;<br/>&mdash; <small>David Steinberg, Senior AI/Gameplay Engineer, Darkworks.</small></blockquote> <blockquote>&ldquo;Great talks, real experts and real solutions for real issues in game AI. Very very interesting.&rdquo;<br/>&mdash; <small>Guillaume Chatelet, Lead Programmer, Mikros Image.</small></blockquote> <blockquote>&ldquo;The very down-to-earth, pragmatic approach of the presentations and panels succeeded in making all the various topics much more approachable. In the end of the day, we all want to apply good ideas to our own games in practice, and I think I can do just that with virtually any of the communications presented at the Paris Game AI Conference '09.&rdquo;<br/>&mdash; <small>Gonçalo Lopes, Software Engineer, YDreams.</small></blockquote> <blockquote>&ldquo;The conference gave me a comprehensive insight into new approaches and solutions for problems I also have been dealing with. Going there will definitely reflect in our project and daily work. This is an event you don't want to miss.&rdquo;<br/>&mdash; <small>Daniel Kollmann, AI Programmer, YAGER Development.</small></blockquote> <blockquote>&ldquo;This conference was very useful, with a lot of subjects being directly applicable in professional projects. Making it also a free conference is also something really nice, as everyone can intend it, whether there student, or belong to a small or big company. Sharing knowledge between everyone is the best step to advance quickly and make better games!&rdquo;<br/>&mdash; <small>David Partouche, AI Programmer, Eden Games</small></blockquote> <blockquote>&ldquo;A very interesting and inspiring event. I've learn a lot and met great people i'm eager to work with in the future!&rdquo;<br/>&mdash; <small>Clodéric Mars, R&D Software Engineer, Golaem</small></blockquote> <blockquote>&ldquo;It was two days packed with diverse and interesting topics. Not only that it was also a great place to meet intersting people from the Game AI-Field. Thanks Alex, I will definitely attend the conference next year!&rdquo;<br/>&mdash; <small> Denis Schluchter, AI Programmer, YAGER Development </small></blockquote><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/a5ljx2MaS30" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/paris09-report/</feedburner:origLink></item>
      <item>
         <title>Inside PathEngine's Collapsible Formations (Exclusive Video) and Latest Release</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/K0bd6S-loOs/</link>
         <description>The game AI navigation middleware industry is moving very fast these days; even we're struggling to keep up! Today, PathEngine released its latest SDK and here at AiGameDev.com we've been sinking our teeth into it to check out the latest develop [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/pathengine-formations/</guid>
         <pubDate>Fri, 29 May 2009 09:49:00 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img src="http://files.aigamedev.com/pathengine-formations.icon.png" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>The game AI &amp; navigation middleware industry is moving very fast these days; even we're struggling to keep up! Today, <a rel="nofollow" target="_blank" href="http://pathengine.com">PathEngine</a> released its latest SDK and here at <tt>AiGameDev.com</tt> we've been sinking our teeth into it to check out the latest developments. In this article, you'll find a behind the scenes description of what's inside the release and how the features are implemented. On top of that, you can find the demo binary and the <i>source code</i> for samples within the "testbed" release available from their <a rel="nofollow" target="_blank" href="http://pathengine.com/downloads.php">download page</a>.</p> <p>The key features of <a rel="nofollow" target="_blank" href="http://www.pathengine.com/changelog.htm">this release</a>, discussed in this page, are the collapsible formations (including a video), support for both automatically generating navigation meshes based on BSP-geometry processing or voxelization (with a comparison), and finally support for run-time off mesh connections to allow agents to jump between arbitrary points in the world.</p> <p style="border:1px dashed #444;background-color:#ddd;padding:1em;"><a rel="nofollow" target="_blank" href="http://www.pathengine.com"><img src="http://files.aigamedev.com/sponsors/pathengine.png" style="padding-top:1ex;" style="float:right;margin-left:1em;" align="right" hspace="32"/></a>
<u>NOTE</u>: Thanks to Thomas Young for giving us access to a pre-release build of the latest SDK, and for letting us post some exclusive details about the technology. PathEngine is a sponsor of <tt>AiGameDev.com</tt>.</p> <h3>Collapsible Formations</h3> <p>This release of PathEngine comes with an advanced sample that shows how formations can be handled. This behavior is not built into the library at the low-level so you can change the way the formations behave via game code. As it is now, each sub-formation <i>always</i> collapses to go through narrow gaps and doesn't considers taking detours to gain some more clearance. As Thomas Young points out, in some situations this would look more natural.</p> <p>A recording of the demo is available as a video just below. (<a rel="nofollow" target="_blank" href="http://aigamedev.com/open/releases/pathengine-formations/#video">Click here</a> to view it.) You can also find the majority of the source code for this sample (excluding the library code) in the testbed release <a rel="nofollow" target="_blank" href="http://pathengine.com/">available</a> on the PathEngine site.</p> <h4 id="video">Audio &amp; Video Screencast</h4> <br/> <p><br/><u>NOTE</u>: The video above is in 720p High Definition. Click on maximize to watch it full screen.</p> <h4>Technical Details</h4> <p>The default behavior in this demo is designed to have a very low update cost per individual agent, a minimal number of long distance pathfinding requests, using pathfinding based on the size of a single agent, and allowing the group to adapt to obstructions. Here's how it works in practice:</p> <ol>
<li><p>A path is planned according to the size of the maximum size of an individual unit in the formation, rather than the formation size.</p></li>
<li><p>The corridor around the path is used to calculate the ideal formation width, and positions available.</p></li>
<li><p>Sub-formations are created based on the distance between entities, so occasionally groups split up to move around obstacles.</p></li>
<li><p>Only one long distance pathfinding request is used per sub-formation, which reduces the cost of searching for paths.</p>
<li><p>While following the path, there's a piece of code responsible for organising movement orders within sub-formations using local queries only.</p></li>
</ol> <p>Thomas Young points out another few interesting details about this demo:</p> <blockquote><p>&ldquo;Local, short distance pathfinding requests are currently used to move to start positions, but in most cases these are not actually required, and will early out on a line collision test direct to goal.</p> <p>This is a good example, I guess, of the extreme usefulness of a paired pathfinding/collision setup, and it should be straightforward to apply this kind of approach to any situation where paired collision and pathfinding queries are available! &rdquo;</p></blockquote> <h3>Voxel &amp; BSP Processing</h3> <p>Voxel-based approaches to processing polygon soup have been <a rel="nofollow" target="_blank" href="http://aigamedev.com/insider/presentations/recast-teaser/">gaining traction</a> lately. However, compared to solutions based on processing polygonal geometry, the decision of which to use is not so clearcut. PathEngine's latest release includes both, so I took a few comparison screenshots to visualize the differences in practice.</p> <p>In the followings images, you'll see the following from left to right:</p> <ul>
<li><p><strong>Blue</strong> &mdash; The original input geometry with polygon outlines.</p></li>
<li><p><strong>Grey</strong> &mdash; Walkable surface extracted with voxel processing.</p></li>
<li><p><strong>Green</strong> &mdash; Same walkable area extracted using BSP processing.</p></li>
</ul> <p>Here are the screenshots. (Click to enlarge.)</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/pathengine-fence.png"><img src="http://files.aigamedev.com/pathengine-fence.jpg"/></a>
<p><u>Screenshot 1</u>: A fence example, showing the aliasing introduced by voxel solutions compared to perfect geometric processing. </div> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/pathengine-boxes.png"><img src="http://files.aigamedev.com/pathengine-boxes.jpg"/></a>
<p><u>Screenshot 2</u>: Example scene with few differences. The voxel floor on the bridge is not as accurate.</p>
</div> <p>I asked Thomas Young (developer of PathEngine) about the distinction between the two. Generally speaking, where do polygon-based approaches shine over voxel based approaches, and how would you decide which to use? Here's what he replied:</p> <blockquote><p>&ldquo;The main point here is that BSP 3D processing has no aliasing. With voxel based approaches, if you have something like a doorway, the actual mesh width at this doorway can vary by a factor on the order of the voxel size being used, and so this is then something that needs to be taken into account if you want to guarantee passability for pathfinding agents &mdash; either by reducing the agent shape used for pathfinding, or by modelling all your doorways a certain amount larger than the actual physical agent size!</p> <p>And then, apart from issues at obstruction boundaries, the BSP 3D processing also provides a much more exact ground representation. Being able to quickly get hold of Z values for agent rendering position is nice, but is something that can potentially be handled by other engine components if required. More importantly, perhaps, is the ability to convert things like content position markers to pathfinding configuration space, absolutely robustly. when you have large numbers of positions to work with, and don't want these to sometimes be assigned to the wrong piece of pathfinding ground then the quality of ground representation can become an important issue.</p> <p>(Remember that with PathEngine we don't search directly through the ground meshes polys, so while representing ground mesh surfaces more exactly does mean larger ground mesh size, this does not then directly affect pathfinding performance.)</p> <p>On the other hand, the extra precision comes at a cost, and having really fast processing times, without needing to do stuff like simplifying geometry or marking stuff up as solid objects, can just be that much more convenient. The great thing is that both content processing methods operate on exactly the same source data representation, and spit out exactly the same run-time mesh format, and so it is possible to switch between approaches without making any changes either to the input content data, or to run-time pathfinding code.&rdquo;</p></blockquote> <p>If you have a commercial project, you can <a rel="nofollow" target="_blank" href="http://pathengine.com/">request an evaluation</a> for the content processing system on their site by filling in a simple form.</p> <h3>Runtime Off-Mesh Connections</h3> <div style="text-align:center;">
<img src="http://files.aigamedev.com/pathengine-connections.jpg"/>
</div> <p>In practice, games with complex navigation will often need runtime changes to the underlying navigation graph. For instance, jumping down from or onto a moving platform can only be done when the platform is accessible from the nearby ledge.</p> <p>PathEngine already supports these kinds of free form connections, but they were extended for this release:</p> <blockquote><p>&ldquo;This feature is based on essentially the same idea as the off-mesh connections in previous releases, but with the difference that connections can now be completely specified at run-time if desired.&rdquo;</p></blockquote> In practice, this was achieved with three new API functions in the <tt>iCollisionContext</tt>. For more information see these following articles: <ul>
<li><p><a rel="nofollow" target="_blank" href="http://www.pathengine.com/Contents/Overview/AdditionalFeaturesOverview/Off-MeshConnections/page.php">Feature Overview: Off-Mesh Connections</a></p></li>
<li><p><a rel="nofollow" target="_blank" href="http://www.pathengine.com/Contents/ProgrammersGuide/ApplyingtheSDK/WorkingwithOff-MeshConnections/page.php">Working with Off-Mesh Connections in the SDK</a></p></li>
</ul> <h3>Summary</h3> <p>If you're interested in these demos and the sample code, you can download and access the SDK in the public testbed release available from the <a rel="nofollow" target="_blank" href="http://pathengine.com/downloads.php">PathEngine download</a> page. This also gives you access to most of the collapsible formations source, as well as a binary for you to experiment with.</p> <p>Congratulations to the PathEngine team on this latest release!</p> <div style="text-align:center;">
<img src="http://files.aigamedev.com/pathengine-formations.jpg"/>
</div><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/K0bd6S-loOs" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/pathengine-formations/</feedburner:origLink></item>
      <item>
         <title>Behavior Capture and Learning Football by Imitation</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/-Mi4uR7hiRY/</link>
         <description>One approach to machine learning that's getting more attention these days is learning by example (also known as imitation). Not only are there more academic papers on the subject, but parts of industry and middleware companies are also turning towards [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/learning-football-imitation/</guid>
         <pubDate>Thu, 21 May 2009 05:45:00 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img src="http://files.aigamedev.com/ThisIsFootball.icon.jpg" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>One approach to machine learning that's getting more attention these days is learning by example (also known as imitation). Not only are there more academic papers on the subject, but parts of industry and middleware companies are also turning towards this kind of ML for answers. Will Wright recently <a rel="nofollow" target="_blank" href="http://twitter.com/AiGameDev/status/1458072545">said</a> that the <i>"Holy Grail is crowd-sourcing the algorithms, AI, and procedures in the game"</i> and Jeff Orkin retired from the comfort of his AI job at Monolith to research data-mining gameplay sessions.</p> <p>Imitation learning is appealing because it puts more control into the hands of the designers, by considering them as trainers who provide example behaviors for a system to learn from. Compared with other solutions, the AI can make fewer assumptions about the kind of results desired, so because there's less room for error it seems to be a good fit for the games industry.</p> <p>Going beyond academic prototypes, there aren't many developers applying these ideas into commercial games &mdash; with the notable exception of <a rel="nofollow" target="_blank" href="http://www.trusoft.com">TruSoft</a>, makers of behavior capture middleware (and sponsors of <tt>AiGameDev.com</tt>). What follows in the article below are video highlights from their Artificial Contender solution (see <a rel="nofollow" target="_blank" href="http://trusoft.com/ac_overview.html">this page</a> for more), and two blog posts that I previously wrote about the system, along with my most recent thoughts.<p> <p style="border:1px dashed #444;background-color:#ddd;padding:1em;"><u>NOTE</u>: This weekend we'll be running an <a rel="nofollow" target="_blank" href="http://forums.aigamedev.com/showthread.php?t=2738#posts">public session</a> about behavior capture with Iskander Umarov, Technical Director on Artificial Contender (a behavior capture middleware), going over the general principles of learning by example, comparing the different solutions available as well as related technology, and discussing how it can be applied to a variety of games ranging from sports to combat training.<br/><br/>
<a rel="nofollow" target="_blank" href="http://www.trusoft.com/"><img src="http://files.aigamedev.com/sponsors/artificialcontender.png" class="right"/></a>
The <a rel="nofollow" target="_blank" href="http://forums.aigamedev.com/showthread.php?t=2738#posts">online presentation</a> this weekend and this article are technically sponsored by TruSoft. However, the open session will cover the behavior capture technology and its applications in general. I have to admit I spent 1h43 talking to Iskander in the pre-interview not only because it's a fascinating topic, but because he's willing to answer all questions on the subject!</p> <h3>Artificial Contender and Behavior Capture</h3> <p><i>This section was originally published via my personal blog on July 11th, 2006. I've made some minor edits since then, added inline comments also, and TruSoft let me repost some of the videos (see them on the site).</i></p> <p><br/><br/>The world cup is over (with a somewhat disappointing ending), but I want to talk about some interesting football-related technology before everyone moves on. I just received news of a new AI SDK for games called <a rel="nofollow" target="_blank" href="http://www.trusoft.com/ac_for_games_developers.html">Artificial Contender</a>, developed by <a rel="nofollow" target="_blank" href="http://www.trusoft.com/">TruSoft</a>. This middleware allows game developers to add behaviour capture into their games, and has been applied successfully in the making of Sony's <em>This Is Football 2005.</em></p> <div style="text-align:center;">
<img alt="This Is Football 2005" src="http://files.aigamedev.com/ThisIsFootball2005.jpg"/>
<p><u>Screenshot 1:</u> This Is Football 2005.</p>
</div> <p>There are a few demos on the site, including videos of gameplay, tools, and a promotional white paper &mdash; but you have to register for them. If you watch the videos, you'll see a rather familiar English football team conceding a few goals, and trying to make up for it by hoofing the ball forward. Except in this case, it's entirely the desired behaviour! The designer used such long passes during training, whereas the Brazilians use shorter passes and dodging runs. Anyway, TruSoft don't give away too many interesting details on the site (as you may expect since they're selling a product), but enough to get a good overview of the product. The system is based on a combination of technology: a directed graph that models the behaviour policy, and a tree-like data-structure and index the captured behaviour samples. Informamlly, the graph stores the samples and the tree provides abstractions for situations.</p> <p>At the base, there's a training mode that allows the designer to record a series of situation &rarr; action pairs. All the behaviour recordings are combined into a "directed semantic graph" (obviously, nodes are situations and edges are actions). To compare this with motion capture solutions, individual training runs made by the designers correspond to single mocap clips, and the semantic graph is analogous to a move-tree or <a rel="nofollow" target="_blank" href="http://www.cs.wisc.edu/graphics/Gallery/kovar.vol/MoGraphs/">motion-graph</a>, built by combining similar animation poses into a single node.</p> <div style="text-align:center;">
<a rel="nofollow" target="_blank" href="http://files.aigamedev.com/AC_Graph.png">
<img alt="Artificial Contender Graph" src="http://files.aigamedev.com/AC_Graph.jpg"/></a>
<p><u>Screenshot 2:</u> Situation Graph structure used by Artificial Contender.<br/> <a rel="nofollow" target="_blank" href="http://www.trusoft.com/principles.html">View Original</a> (TruSoft.com)</p>
</div> <p>To help the system create general graphs from individual trials, there's a database back-end that stores the training samples and allows them to be queried, e.g. find situations similar to this. The graph is created on the fly within the game, and a database &#8212; in the traditional sense &#8212; is only used to fine tune the system's performance. I presume the data-structure is similar to <a rel="nofollow" target="_blank" href="http://citeseer.ifi.unizh.ch/706599.html">R-Trees</a> with a hierarchical index, which they call generalization trees. An important feature that R-Trees provide is they work in n-space, assuming it's possible to obtain a measure of similarity of two situations. The tree can thereby group similar situations under nearby leaf nodes. This makes it possible to build the semantic graph like the motion graphs are built: by merging similar situations together into one node (though with motion capture, this is much easier to accomplish).</p> <div style="text-align:center;"><a rel="nofollow" target="_blank" href="http://files.aigamedev.com/AC_Viewer.png"><img alt="Artificial Contender Viewer" src="http://files.aigamedev.com/AC_Viewer.jpg"/></a>
<p><u>Screenshot 3</u> The AC Viewer, <a rel="nofollow" target="_blank" href="http://www.trusoft.com/showcase.html ">View Original</a> (TruSoft.com)</p>
</div> <p>In practice, it seems the following steps are involved to integrate Artificial Contender into a game:</p> <ol>
<li><p>Model all possible sensors (inputs) and actuators (output) of the AI by using an API provided by the SDK.</p></li>
<li><p>Manually create a hierarchical model of the possible game situations, which allows the algorithm to create zoom levels for the data using generalisation trees.</p></li>
<li><p>Integrate the AC library into the game engine, and make its functionality accessible to the designers from within the game.</p></li>
<li><p>Get the designers to play the game in a particular style, and then train the AC on the sampled data.</p></li>
<li><p>Last but not least, work out a sensible QA plan for testing the resulting behaviours, and apply it until the results are satisfactory!</p></li>
</ol> <p>Overall, this seems like a solid combination of technology, delivered in a well thought-out package. One part that stands out is the use of reinforcement learning, which is mentioned a few times in the white paper. The idea is that NPCs get positive reinforcement for achieving goals, and in the future choose a course of action that increases the likelihood of reinforcement. Intuitively, this seems like an opposite solution to behaviour capture, which does not give NPCs much autonomy in deciding what to do but instead "plays back" a similar training sample. Apparently, the use of RL is optional in the AC product; it helps fine tune the behaviour policy and can provide goal-directed behaviour. This combination of RL with the unsupervised learning algorithm described above allows AC to get around some typical problems with behaviour capture.</p> <p style="border:1px dashed #444;background-color:#ddd;padding:1em;"><u>NOTE:</u> I was originally skeptical of the reinforcement learning when I wrote this, here's a sentence I removed: <i>"On top of that, RL in itself is an exotic choice for game AI middleware, as most implementations are often not very transparent to designers, and in my experience not as reliable as goal-oriented action planners &#8212; among other possibilities."</i> Both my opinion on the subject and the state of the industry has changed; RL is turning out to be a very pragmatic choice to get around the challenges of manually tweaking variables, and it scales better where planners have since been shown to struggle.</p> <p>From a production point of view, from the features mentioned on the <em>Artificial Contender</em> site, I think one is particularly valuable right now in the games industry today: designers are involved directly without having to tweak scripts, and early on in development. I don't believe such middleware will save a substantial amount of time in development, but it'll mean that time is spent (better) elsewhere &mdash; notably integrating, prototyping with- and testing <em>Artificial Contender</em>.</p> <p>It'll be interesting to watch this product in the future; I'm curious if they'll just get bought out by a large publisher of sports franchises, or if they'll manage to find a way into the mainstream market and apply their solution successfully to other games. I expect TruSoft's consulting services will be an important part of making that happen; it'll take a lot of on-site experience with AI systems in general, and this product in particular to get something good out of it. I think those are the necessary conditions for designers to start tackling much <a rel="nofollow" target="_blank" href="http://www.trusoft.com/ac_for_users.html">harder problems</a>.</p> <h3>Interview with Iskander Umarov</h3> <p><i>This section was published about a month after the text above on August 8th, 2006, also via my personal blog. The video is also a new addition though, showing Artificial Contender's tools and underlying representation.</i></p> <div id="d41d8cd98f00b204e9800998ecf8427e"><iframe class="embeddedvideo" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" id="d41d8cd98f00b204e9800998ecf8427e_api" name="d41d8cd98f00b204e9800998ecf8427e_api" height="518px" width="640px"></div> <p>About a month ago, I stumbled upon a game AI middleware solution called Artificial Contender and wrote a brief review. Then, Iskander Umarov, technical director of TruSoft (the company who developed the AC product), sent in a few corrections and clarifications. I've been on a summer vacation for a few weeks, but in the meantime, Iskander was kind enough to answer some of my questions about the product and the technology itself.</p> <p><strong><u>Alex J. Champandard</u>: Typically, how many training samples do the designers use to create a semantic directed graph for an NPC? Does the algorithm perform differently when there are more/less samples?</strong></p> <p><u>Iskander Umarov</u>: The number of training samples depends on:</p> <ul>
<li>The game genre and the game</li>
<li>Complexity of a desired playing style for an NPC</li>
</ul>
<p>Some examples of the typical number of minutes that a designer needs to train an AC agent to create a specific well-rounded playing style are as follows:</p>
<ul>
<li>Fighting games: 15-30 minutes.</li>
<li>Sports games: 30-40 minutes.</li> <li>Real-time strategy games: 40-90 minutes.</li>
</ul>
<p>Notes:</p>
<ul type="circle">
<li>Some simple playing styles can become playable within 3-10 minutes of training.</li>
<li>The actual number of minutes depends on the complexity of the game, type of a playing style being trained, and on the speed.</li>
<li>Depending on a game and depending on a situation within a game, one minute of training can generate about 10 – 120 training samples. For example, a typical fighting game will usually generate about 60-120 training samples a minute. An RTS game will generate 10-60 training samples every minute.</li>
</ul> <p>At any time, a designer can add more training samples. During testing, a designer can always see an indicator of a quality (0-100%) of an AC agent’s decisions and it is usually obvious if more training is required. Moreover, a designer can choose to continue training an AC agent for specific situations only. For example, during the AC agent’s acting, as soon as a designer sees a decrease in AC’s agent’s acting quality, a designer can switch to AC agent’s training. This functionality provides an easy way to train “substitutes” even for end-users: at any moment an end-user can switch between AC agent’s training and acting. For end-users, this functionality can be transparent – during “normal play.” The AC agent is learning, and there is a button providing control to a substitute: trained AC agent.</p> <p>Usually, more training generates superior, more human-like AC agents. The performance of an AC acting algorithm increases with the number of training samples, i.e. more the AC agent knows, the faster it works.</p> <p><strong><u>AJC</u>: You mentioned that reinforcement learning is used to improve the behaviour generated by the graph. Is this necessary because a hierarchical pattern matching approach is not necessarily always purposeful? To what extent does RL improve this situation?</strong></p> <p><u>IU</u>: RL isn’t necessary by any means. All of our behavior-capture AI agents (i.e. agents with a purpose to copy a teacher’s behavior) were created without the use of RL. To clarify, the answer to the question “Is this necessary because a hierarchical pattern matching approach is not necessarily always purposeful?” is no. We used RL for the following purposes:</p> <ul>
<li><p>Increase / decrease the difficulty level, i.e. the usage of RL helps to create stronger or weaker opponents compared to what was originally trained by a designer.</p></li>
<li><p>Create an adaptive AC agent that will be changing its behavior to achieve set goals. (Note: the behavior can still be within the boundaries of a trained style.)</p></li>
</ul> <p><strong><u>AJC</u>: In many large problems, I&#8217;ve found RL has trouble scaling in practice. Does the combination of RL with the graphs address this problem?</strong></p> <p><u>IU</u>: Yes. In our experiments with RL, the combination with graphs helps with scaling due to the fact that graphs help preserving sequencing in the situation, action space. Also, Artificial Contender technology’s game situation classification and generalization subsystems provide help with reducing the number of potential game situations and with the speed of search respectively.</p> <div style="text-align:center;">
<img alt="Football Player Dribbling" src="http://files.aigamedev.com/AC_ThisIsFootball.jpg"/>
<p><u>Screenshot 4:</u> Artificial Contender was applied to multiple sports and simulation games.</p>
</div> <p><strong><u>AJC</u>: How well do you think your solution will &#8220;scale up&#8221; to games that are not so confined like sports games?</strong></p> <p><u>IU</u>: We are positive that Artificial Contender can be efficiently used in most game genres. Currently, we have experimented with the following:</p>
<ul>
<li>Fighting</li>
<li>Sports</li>
<li>Real-time strategy</li>
<li>Adventure</li>
</ul> <p>I’d like to make several notes about the complexity of sports games. Even though the playing field in sports games looks much easier than labyrinths in FPS games or complex landscapes in RTS games, numerous factors on the playing field create challenges similar to the ones in other genres. Examples are:</p>
<ol>
<li><p>Constantly changing positions of many players on the field</p></li> <li><p>Danger of losing the ball during a pass</p></li>
<li><p>Danger of being tackled Moving players on the field creates dynamic labyrinths and obstacles.</p></li>
</ol> <p>Furthermore, these dynamic labyrinths can be very complex because there are no distinct borders. There are no impenetrable walls, and there are no clear spaces. Moving and passing directions can be more dangerous or less dangerous, but almost never absolutely safe or absolutely impossible. This continuity increases both the state space and the action space. To give another example, an issue of “taking cover” in FPS can be compared to an issue of the possibility of a pass being intercepted.</p> <p><strong><u>AJC</u>: What is going to be the major focus for TruSoft on the product in the near future?</strong></p> <p><u>IU:</u> It seems a robust combination of technology already, are there any particular aspects you are keen to improve? The major focus for us right now is to integrate AC into more games and to support more game genres. For the next generation of AC technology we see the following main areas to work on:</p>
<ul>
<li>Enhanced multi-agent cooperative behavior support.</li>
<li>Capturing data from the real-world. Currently, AC agents learn from human players playing the same video/computer game. In the future, we would love to see games where some of AC agents have been trained directly from the real-world data.</li>
</ul> <p><strong><u>AJC</u>: That sounds like a very interesting problem. I look forward to future developments from TruSoft... Thanks for your time Iskander!</strong></p> <h3>Live Online Session, Sunday 24th</h3> <p>If you find the topic of behavior capture and imitation learning interesting, then be sure to join this weekend's session with Iskander Umarov, Technical Director of Artificial Contender. Over the years, TruSoft has had the most experience with deploying this kind of technology in games, so it'll be a fascinating discussion. (Why else would I spend 1h43 of my time in a pre-interview with Iskander? :-)</p> <p><a rel="nofollow" target="_blank" href="http://forums.aigamedev.com/showthread.php?t=2738#posts">Click here</a> for more details about the event. It's a public session, open for all to attend... See you then!</p><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/-Mi4uR7hiRY" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/learning-football-imitation/</feedburner:origLink></item>
      <item>
         <title>Building and Traversing Navigation Meshes with Recast and Detour (Project Video)</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/w97Jd7OOYjc/</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt;
&lt;img src="http://files.aigamedev.com/insiders/recast-teaser.jpg" style="float:left;margin-right:1em;" align="left" hspace="32"/&gt;
&lt;p&gt;Over the past couple years, Mikko Mononen has been working on a personal R&amp;D project for automatically generating navigation meshes based on a polygon soup. His project was born out of a need for better data for pathfinding; navigation meshes can never be good enough! Previously, Mikko worked on Crysis as a Lead AI Programmer and recently started in the same role at Recoil Games, although he has a demomaking background and experience with independent games too.&lt;/p&gt; &lt;p&gt;Mikko experimented with a variety of different techniques based on rasterization and voxelization, which treat space as a discrete grid and post-process these voxels to retrieve polygons on the output. This approach is one of the most promising for generating robust and reliable navigation meshes, and research projects and commercial solutions are increasingly relying on this approach too. (See the references below in the article.)&lt;/p&gt; &lt;p&gt;In the following 11:30 minute HD video, you'll get a guided tour of the navigation generation (known as &lt;i&gt;Recast&lt;/i&gt;) as well as a demo of the runtime pathfinding and navigation queries (called &lt;i&gt;Detour&lt;/i&gt;). You'll get an idea of how this kind of technology works, as well as a demonstration of how it works on a variety of indoor and outdoor levels.&lt;/p&gt;&lt;p&gt;[...]&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/w97Jd7OOYjc" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/article/recast-teaser/</guid>
         <pubDate>Tue, 12 May 2009 10:14:00 -0700</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/article/recast-teaser/</feedburner:origLink></item>
      <item>
         <title>Hard-Earned Insights from The AI Sandbox Development</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/nebuLewnIQs/</link>
         <description>Over the last 8-10 months we've been incrementally building up The AI Sandbox an part of AiGameDev.com Premium. It's built on top of an open-source stack, but with key parts built from scratch (e.g. the MVC framework) or heavily customized (e.g. anima [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/hard-earned-insights/</guid>
         <pubDate>Fri, 08 May 2009 16:11:00 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img style="float:left;margin-right:1em;" align="left" hspace="32" alt="" width="192" height="149"/> <p>Over the last 8-10 months we've been incrementally building up The AI Sandbox an part of <tt>AiGameDev.com</tt> Premium. It's built on top of an open-source stack, but with key parts built from scratch (e.g. the MVC framework) or heavily customized (e.g. animation system, test framework).</p> <p>We designed and approach most components based on practices used in industry, but also prototyping various ideas we feel have lots of promise. In the process, we've encountered lots of important lessons — some old and some new. In the video below, I go into some of these insights on the following topics:</p> <ul> <li> <p><strong>Test Framework</strong> — How do you manage and run your unit and functional tests, and your feature samples?</p> </li> <li> <p><strong>Footplant Detection</strong> — What approach do you use for automatically extracting footfalls?</p> </li> <li> <p><strong>Animation Mirroring</strong> — Which options are available for mirroring, and what are the tradeoffs?</p> </li> <li> <p><strong>Motion Capture</strong> — Where can you find good motion capture online and what's the quality of it?</p> </li> <li> <p><strong>Hierarchical Search</strong> — What's the catch for hierarchical search in terms of performance and quality?</p> </li> <li> <p><strong>Area Generation</strong> — How do you create areas given a lown-level grid or point graph?</p> </li> </ul> <p>Here's the video itself, shown in High Quality. Ideally, you should view it in High Definition to see the text. Press play and let it buffer, then come back and watch it full screen. It's about 10 minutes long.</p> <div style="text-align:center;">    <iframe class="embeddedvideo" type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/lTEnislTVPs&amp;hl=en&amp;fs=1&amp;rel=0"></iframe> 
</div> <p><u>NOTE</u>: Everything you see here is available as part of <tt>AiGameDev.com</tt> Premium. You can sign-up <a rel="nofollow" target="_blank" href="http://aigamedev.com/launch/">right here</a>, and there are bonuses for signing up this week — whether you're an individual or a studio.</p><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/nebuLewnIQs" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/hard-earned-insights/</feedburner:origLink></item>
      <item>
         <title>We Interrupt This Broadcast... AiGameDev.com Premium Re-Opening in 12h</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/yVmEObZkEEQ/</link>
         <description>First, I'd like to extend a warm welcome to new readers who just discovered the site via recent features and subscribed to the feed. (You did find the RSS didn't you? :) There are even more cool articles already lined up for the next few days as we g [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/interrupt-broadcast/</guid>
         <pubDate>Tue, 05 May 2009 20:55:00 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img src="http://aigamedev.com/uploads/pics/premium.png" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>First, I'd like to extend a warm welcome to new readers who just discovered the site via recent features and subscribed to the feed. (You did find the <a rel="nofollow" target="_blank" href="http://aigamedev.com/feed/">RSS</a> didn't you? :) There are even more cool articles already lined up for the next few days as we go into launch week...</p> <p>Unless you've been stuck in the same finite state for the last month, you probably know we're re-opening the AiGameDev.com Premium for new Members in about 12h. You've also no doubt noticed all the extra content on the site since we relaunched &mdash; possibly even wondering who put those red crowns everywhere, and what's hidden behind those pages.</p> <p><i>Here's the answer, watch the video below and find out everything now. It's the smartest move!</i></p> <h3>AiGameDev.com Premium Membership is...</h3> <ol>
<li><p>Designed to help you apply artifical intelligence to improve your games (for strategy, behavior or tools) as well as build more believable characters (human or not).</p></li>
<li><p>A multimedia experience combining video &amp; audio, illustrated reports, interactive sessions with whiteboards plus high-quality recordings, as well as source code samples.</p></li>
<li><p>An hybrid online program between training and consulting, to bring you up to speed in fields you're not familiar with and help you push the limits in other areas.</p></li>
</ol> <h3>Sneak Peak Behind the Scenes!</h3> <div style="text-align:center;">
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/yXju3oyBTCg&hl=de&fs=1&rel=0"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/yXju3oyBTCg&hl=de&fs=1&rel=0" type="application/x-shockwave-flash" wmode="transparent" width="480" height="385"></embed></object> 
</div> Make sure you watch this in <a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=yXju3oyBTCg&fmt=18">High Quality</a> over on YouTube! <h3>Going Live on May 6th, 2009</h3> <p>I'll start with the most important information first. The exact time for the re-opening is 11:00 Pacific, 14:00 East Coast, and 18:00 Central European time. You can watch the countdown on the <a rel="nofollow" target="_blank" href="http://aigamedev.com/launch/">launch page</a>. When the countdown hits zero, refresh the page and you'll see two buttons for signing up: one for <b>Individuals</b> (non-commercial) and the other for <b>Studios</b> (companies only).</p> <p>When you sign-up in 12h, you'll basically get 3+1 months of membership (automatically recurring) as well as access to all the existing sessions. In summary, here's what you get:</p> <ul>
<li><p><strong>Previous Sessions</strong> &mdash; Over the last 8 months of running <tt>AiGameDev.com</tt> Premium we've collected over 45 full-length features like masterclasses, interviews, articles and tutorials. All this library will become available to you instantly as soon as you register as a Premium Member.</p></li>
<li><p><strong>Next Three Months</strong> &mdash; On Sunday May 10th, there's a public masterclass about <a rel="nofollow" target="_blank" href="http://forums.aigamedev.com/showthread.php?t=2631#posts">Behavior Trees for Action &amp; Combat AI</a> (subscribe to the thread to be notified in advance). In June, we'll be running the <a rel="nofollow" target="_blank" href="http://aigamedev.com/open/article/2009-paris-registration/">Paris Game AI Conference '09</a> and releasing the videos online in the Premium Area incrementally.</p></li>
<li><p><strong>The AI Sandbox</strong> &mdash; This is the codebase we use to write samples and demos illustrating key points. For example, see our demo of <a rel="nofollow" target="_blank" href="http://aigamedev.com/open/article/hpa-pathfinding/">HPA*</a> pathfinding on a Counter Strike map, and our <a rel="nofollow" target="_blank" href="http://aigamedev.com/insider/article/motion-planning-thoughts/">animation planning</a> on a Motion Graph prototype.</p></li>
</ul> <u>Note:</u> Watch the video above for full details about the prices. <h3>Bonuses &amp; Fast Movers</h3> <p>For the whole week of the relaunch, if you sign-up to <tt>AiGameDev.com</tt> Premium you'll receive the following bonuses:</p> <ul>
<li><p><strong>Recast Navigation Library</strong> by Mikko Mononen &mdash; This library is a R&amp;D project that transforms arbitrary polygon soups into navigation meshes, and provides hierarchical pathfinding over the whole representation. The code is written in low-level C++ and designed to be integrated into games as a navigation solution.</p></li>
<li><p><strong>Future City Model</strong> from Procedural.com &mdash; The CityEngine team modeled a detailed version of Manhattan in 2259 inspired by the Fifth Element. You can get your hands on the 3D models to experiment with large scale pathfinding and writing the AI simulation for city environments... Challenge extended!</p></li>
</ul> <p>For the Individual (Non-Commercial) packages, you can earn the following <b>FAST MOVER BONUSES</b> if you join quickly:</p> <ol>
<li><p><strong>First 50 People</strong> &mdash; If you sign-up for the Premium Membership within the first fifty people when we go live, you'll get <b>20 minutes consulting</b> time with Alex J. Champandard, contractor on Killzone 2's Bots and previously Senior AI Programmer at Rockstar Games.</p></li>
<li><p><strong>First 24 Hours</strong> &mdash; Anyone that registers within the first day of going live will receive a <b>PDF report with 150+ tips</b> collected from Indie and AAA games, both in the design and programming departments.</p></li>
</ol> <p>If you apply for the Studio (Commercial) packages, these fast mover bonuses are available for the whole 7 days after the launch.</p> <h3>Frequently Asked Questions</h3> <p><strong><u>Question</u>: What's the difference between "Members" and "Insiders"?</strong></p>
<p><u>Answer</u>: If you're already registered on the site (free) and have access to some of our content for no-cost, then you're what we call an <em>Insider</em>. This will not change! What's happening this week is access to our best material for paying members, which you can easily upgrade to if you have a credit card nearby!</p> <p><strong><u>Question</u>: Do you support alternative forms of payment than Visa and Mastercard?</strong></p> <p><u>Answer</u>: For the individual membership you have the choice between Visa and Mastercard only. If you sign-up for the commercial memberships (Silver and above) then you can arrange other forms of payment if necessary. Contact us directly by email at <tt>&lt;members at AiGameDev.com&gt;</tt>, for instance for payment via Bank Transfers.</p> <p><strong><u>Question</u>: I'd like to subscribe for a whole year; is there a yearly payment option?</strong></p> <p><u>Answer</u>: No, we currently provide only quarterly packages. Those of you that mentioned you'd like to support the site, then don't hesitate to select a more comprehensive package! (There are some for independent developers and studios.)</p> <p><strong><u>Question</u>: Will the monthly price go up if I don't sign up now?</strong></p> <p><u>Answer</u>: The offer above is available for this week only. Also, depending on how much work the launch is we might close the site for individual members again. It's a lot of work to take on individuals and re-open the site, and in the past we've stopped taking new members to focus instead on creating top quality content.</p> <p>We won't be doing any kind of bonuses or promotion before Autumn later this year, and by then we'll have restructured the offer to split up access to our existing library content and future sessions separately. If you want full access at this price, now's your best chance.</p> <hr/>
<p><br/>So, what are you waiting for, go and <a rel="nofollow" target="_blank" href="http://aigamedev.com/launch/">check it out</a> now!</p><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/yVmEObZkEEQ" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/interrupt-broadcast/</feedburner:origLink></item>
      <item>
         <title>Clearance-based Pathfinding and Hierarchical Annotated A* Search</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/QgZkgyXr4hM/</link>
         <description>This article was originally published as part of AiGameDev.com Premium (re-opening on May 6th) and written by Daniel Harabor, Ph.D. researcher at the NICTA and The Australian National University, specializing in pathfinding and game AI. You can contact hi [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/clearance-based-pathfinding/</guid>
         <pubDate>Mon, 04 May 2009 18:18:26 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <p style="border:1px dashed #444;background-color:#ddd;padding:1em;">This article was originally published as part of <tt>AiGameDev.com</tt> Premium (<a rel="nofollow" target="_blank" href="http://aigamedev.com/launch">re-opening on May 6th</a>) and written by <b>Daniel Harabor</b>, Ph.D. researcher at the NICTA and The Australian National University, specializing in pathfinding and game AI. You can contact him by email at <tt>&lt;daniel.harabor</tt> at <tt>nicta.com.au&gt;</tt></p> <img src="http://files.aigamedev.com/tutorials/haa-icon.png" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>Real-time strategy (RTS) games often feature a wide number unit types for the player to control. One of my favourite titles from the past, Westwood&#8217;s seminal <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Red_Alert_(computer_game)">Red Alert</a>, had many classes of differently sized units: small infantry soldiers, medium-sized Jeeps and large tanks. In Red Alert 3, the most recent incarnation of the series, the diversity is increased even further by the introduction of units with terrain-specific movement capabilities (Figure 1). From a pathfinding perspective this introduces an interesting question: how can we efficiently search for valid routes for variable-sized agents in rich environments with many types of terrain?</p> <p>This was the topic of a recent paper <a rel="nofollow" href="#harabor08">[1]</a> I co-wrote with <a rel="nofollow" target="_blank" href="http://abotea.rsise.anu.edu.au">Adi Botea</a> and which I presented at <a rel="nofollow" title="2008 IEEE Symposium on Computational Intelligence and Games" target="_blank" href="http://www.csse.uwa.edu.au/cig08/">CIG&#8217;08</a>. In the <a rel="nofollow" title="HAA* Technical Talk (Slides)" target="_blank" href="http://harablog.files.wordpress.com/2009/01/haa_cig08.pdf">talk</a> I outlined Hierarchical Annotated A* (HAA*), a path planner which is able to efficiently address this problem by first analysing the terrain of a game map and then building a much smaller approximate representation that captures the essential topographical features of the original. HAA* works by using a distance-to-obstacle metric to calculate the amount of clearance (or free space) at each tile in a grid environment. This simple method is the basis for a hierarchical clearance-based pathfinding approach that is able to answer queries for many different types of units with distinct sizes and terrain traversal capabilities. HAA* is shown to be an order of magnitude faster than low-level A* search, produces near-optimal solutions and requires little memory overhead in practice.</p>
<div style="text-align:center;">
<img title="Red Alert 3" src="http://files.aigamedev.com/tutorials/haa-redalert3.jpg" width="410" height="250"/>
<p><u>Figure 1:</u> EA&#8217;s Red Alert 3 features a wide variety of land-based, aquatic and amphibious units. Each class has distinctive shape and size characteristics.</p>
</div>
<p>In this article I want to outline the two major aspects of HAA*. First, I&#8217;ll discuss how one can analyse a grid map to automatically extract clearance-related topographical information. Second, I&#8217;ll explain how HAA* is able to use this information to build space-efficient abstractions that allow a range of agents with different sizes and terrain traversal capabilities to very quickly find a high quality path through a static multi-terrain environment.</p>
<h3>Clearance Values and the Brushfire Algorithm</h3>
<p>Simply put, a clearance value is a distance-to-obstacle metric which is concerned with the amount of traversable space at a discrete point in the environment. Clearance values are useful because they allow us to quickly determine which areas of a map are traversable by an agent of some arbitrary size. The idea of measuring distances to obstacles in pathfinding applications is not a new one. The Brushfire algorithm <a rel="nofollow" href="#choset04">[2]</a> for instance is particularly well known to robotics researchers (though for different reasons than those motivating this article). This simple method, which is applicable to grid worlds, proceeds as so:</p>
<p>First, to each traversable tile immediately adjacent to a static obstacle in the environment (for example, a large rock or along the perimeter of a building) assign a value of 1. Next, each traversable neighbour of an assigned tile is itself assigned a value of 2 (unless a smaller value has already been assigned). The process continues in this fashion until all tiles have been considered; Figure 2 highlights this idea; here white tiles are traversable and black tiles represent obstacles (NB: The original algorithm actually assigns tiles adjacent to obstacles a value of 2; I use 1 here because it makes more sense for our purposes).</p>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="brushfire_infantrypath" src="http://files.aigamedev.com/tutorials/haa-brushfire_annotatedmap.png" width="252" height="246"/>
<p><u>Figure 2:</u> A small toy map annotated with values computed by the Brushfire algorithm. Black tiles are not traversable.</p>
</div>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="brushfire_infantrypath" src="http://files.aigamedev.com/tutorials/haa-brushfire_infantrypath.png" width="252" height="246"/>
<p><u>Figure 3:</u> A 1&#215;1 agent finds a path to the goal. All traversable tiles are included in the search space.</p>
</div>
<p><br style="clear:both;"/></p>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="brushfire_tankpath" src="http://files.aigamedev.com/tutorials/haa-brushfire_tankpath.png" width="252" height="246"/>
<p><u>Figure 4:</u> A 2&#215;2 agent finds a path to the goal. Only tiles with clearance &gt; 1 are considered.</p>
</div>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="brushfire_tankfail" src="http://files.aigamedev.com/tutorials/haa-brushfire_tankfail.png" width="246" height="251"/>
<p><u>Figure 5:</u> A 2&#215;2 agent fails to find a path due to incorrect clearance values near the goal. Notice that the highlighted tiles are infact traversable by this agent.</p>
</div>
<p><br style="clear:both;"/></p>
<p>Brushfire makes use of a <em>minimum obstacle distance</em> metric to compute clearances which works reasonably well in many situations. If we assume our agents (I use the term agent and unit interchangeably) are surrounded by a square bounding box we can immediately use the computed values to identify traversable locations from non-traversable ones by comparing the size of an agent with the corresponding clearance of particular tile. Figure 3 shows the search space for an agent of size 1&#215;1; in this case, any tile with clearance equal to at least 1 is traversable. Similarly, in Figure 4 the search space is shown for an agent of size 2&#215;2. Notice that the bigger agent can occupy much fewer locations on the map; only tiles with clearance values at least equal to 2. Because this approach is so simple it has seen widespread use, even in video games. At GDC 2007 Chris Jurney (from Relic Entertainment) described a pathfinding system <a rel="nofollow" href="#jurney07">[3]</a> for dealing with variable-sized agents in Company of Heroes &#8212; which happens to make use of a variant of the Brushfire algorithm (NB: this work actually takes a similar approach to HAA* but a direct comparison is difficult because the method is not outlined in great detail; nevertheless, it&#8217;s quite a nice presentation.). </p>
<p>Unfortunately, clearances computed using minimum obstacle distance do not accurately represent the amount of traversable space at each tile. Consider the example in Figure 5; Here our 2&#215;2 agent incorrectly fails to find a path because all tiles in the bottleneck region are assigned clearance values less than 2. To overcome this limitation we will focus on an alternative obstacle-distance metric: <em>true clearance</em>.</p>
<h3>The True Clearance Metric</h3>
<p>The process of measuring true clearance for a given map tile is very straightforward: Surround each tile with a clearance square (bounding box really) of size 1&#215;1. If the tile is traversable, assign it an inital clearance of 1. Next, expand the square symmetrically down and to the right, incrementing the clearance value each time, until no further expansions are possible. An expansion is successful only if all tiles within the square are traversable. If the clearance square intersects with an obstacle or with the edge of the map the expansion fails and the algorithm selects another tile to process. The algorithm terminates when all tiles on the map have been considered. Figure 6 highlights the process and Figure 7 shows the result on our running example.</p>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="computing_trueclearance3" src="http://files.aigamedev.com/tutorials/haa-computing_trueclearance3.png" width="240" height="235"/>
<p><u>Figure 6:</u> After selecting a tile (a) the square is expanded twice (b, c) before intersecting an obstacle (d).</p>
</div>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="trueclearance_annotatedmap" src="http://files.aigamedev.com/tutorials/haa-trueclearance_annotatedmap.png" width="246" height="254"/>
<p><u>Figure 7:</u> The toymap from Figure 2, annotated with true clearance values.</p>
</div>
<p><br style="clear:both;"/></p>
<p>Notice that by using true clearance the example from Figure 5 now succeeds in finding a solution. Infact, one can prove that using the true clearance metric it is always possible to find a solution for any agent size if a valid path exists to begin with (i.e. the method is complete; see <a rel="nofollow" href="#harabor08">[1]</a> for details).</p>
<h3>Dealing With Multiple Terrain Types</h3>
<p>Until now the discussion has been limited to a single type of traversable terrain (white tiles). As it turns out however, it is relatively easy to apply any clearance metric to maps involving arbitrarily many terrain types. Given a map with <em>n</em> terrain types we begin by first identifying the set of possible terrain traversal capabilities an agent may possess. A capability is simply a disjunction of terrains used to specify where each agent can traverse. So, on a map with 2 terrains such as <em>{Ground, Water}</em> the corresponding list of all possible capabilities is given by a set of sets; in this case <em>{{Ground}, {Water}, {Ground, Water}}</em>. Note that, for simplicity, I assume the traveling speed across all terrains is constant (but this constraint is easily lifted).</p>
<p>Next, we calculate and assign a clearance value to each tile for every capability. Figures 8-10 show the corresponding clearance values for each capability on our toy map; notice that we&#8217;ve converted some of the black (obstacle) tiles to blue to represent the Water terrain type (which some agents can traverse).</p>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="tc_ground2" src="http://files.aigamedev.com/tutorials/haa-tc_ground2.png" width="250" height="249"/>
<p><u>Figure 8:</u> True clearance annotations for the {Ground} capability (only white tiles are traversable).</p>
</div>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="tc_water2" src="http://files.aigamedev.com/tutorials/haa-tc_water2.png" width="250" height="250"/>
<p><u>Figure 9:</u> True clearance annotations for the {Water} capability (only blue tiles are traversable).</p>
</div>
<p><br style="clear:both;"/> </p>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="tc_groundorwater2" src="http://files.aigamedev.com/tutorials/haa-tc_groundorwater2.png" width="250" height="250"/>
<p><u>Figure 10:</u> True clearance annotations for the {Ground, Water} capability (both white and blue tiles are traversable).</p>
</div>
<p><br style="clear:both;"/></p>
<p>Theoretically this means that, at most, each tile will store 2<sup>n-1</sup> clearance value annotations (here <i>n</i> corresponds to the number of terrains; see <a rel="nofollow" href="#harabor08">[1]</a> for details). I suspect this overhead can probably be improved with clever use of compression optimisations though I did not attempt more than a naive implementation. Alternatively, if memory is very limited (as is the case with many robot-related applications) one can simply compute true clearance on demand for each tile, thus trading off a little processing speed for more space.</p>
<h3>Annotated A*</h3>
<p>In order to actually find a path for an agent with arbitrary size and capability we can use the venerable A* algorithm <a rel="nofollow" href="#hart68">[4]</a> albeit with some minor modifications. First, we must pass two extra parameters to A*&#8217;s search function: the agent&#8217;s size and capability. Next, we augment the search function slightly so that before a tile is added to A*&#8217;s open list we first verify that it is infact traversable for the given size and capability; everything else remains the same. A tile is traversable only if its terrain type appears in the set of terrains that comprise the agent&#8217;s capability and if the corresponding clearance value is at least equal to the size of the agent. To illustrate these ideas I&#8217;ve put together a simplified pseudocode implementation of the algorithm, Annotated A*:</p>
<pre><u>Function</u>: getPath
<u>Parameters</u>: start, goal, size, capability push start onto open list.
<strong>for each</strong> node on the open list <strong>if</strong> current node is the goal, return path. <strong>else</strong>, <strong>for each</strong> neighbour of the newly opened node <strong>if</strong> neighbour is on the closed list, skip it <strong>else</strong>, <strong>if</strong> neighbour is already on the open list, update weights <strong>else</strong>, <strong>if</strong> clearance(neighbour, capability) &gt; size, push neighbour on the open list <strong>else</strong>, skip neighbour push current node on closed list <strong>if</strong> openlist is null, return failure
</pre>
<p><br/> </p>
<p>If you&#8217;re interested in playing with a working implementation of Annotated A* you can check out the <a rel="nofollow" title="HAA* Source" target="_blank" href="http://code.google.com/p/ahastar/downloads/list">source code</a> I wrote to evaluate it. It&#8217;s written in C++ and based on the University of Alberta&#8217;s freely available pathfinding library, <a rel="nofollow" title="HOG Homepage" target="_blank" href="http://www.cs.ualberta.ca/~nathanst/hog.html">Hierarchical Open Graph</a> (or HOG). HOG compiles on most platforms; I&#8217;ve personally tested it on both OSX and Linux and I&#8217;m told it works on Windows too. The classes of most interest are probably <a rel="nofollow" target="_blank" href="http://code.google.com/p/ahastar/source/browse/tag/aha_r2008-07-31/trunk/aha/AnnotatedMapAbstraction.cpp">AnnotatedMapAbstraction</a>, which deals with computing true clearance values for a map, and <a rel="nofollow" target="_blank" href="http://code.google.com/p/ahastar/source/browse/tag/aha_r2008-07-31/trunk/aha/AnnotatedAStar.cpp">AnnotatedAStar</a> which is the reference implementation of the search algorithm described here.</p>
<h3>Hierarchical Abstraction</h3>
<p>Having described a simple clearance-based pathfinding system we can now turn our attention to speeding it up through the use of <a rel="nofollow" target="_blank" href="http://aigamedev.com/theory/near-optimal-hierarchical-pathfinding">hierarchical abstraction</a>. The main problem here is that a multi-terrain map annotated with clearance values contains lots of topographical information but abstraction methods can only hope to approximate the original. Thus, the goal is to build an abstraction which is <em>representationally complete</em> i.e. if a path between two points can be found on the original annotated map, we should be able to also find it using only the abstract map. To achieve this we&#8217;re going to attack the problem in 3 steps:</p>
<ol>
<li>
<p>First, we divide our annotated map into a set of adjacent <em>Clusters</em> connected by <em>Entrances. </em>We will show that the resultant graph produced by this process is infact representationally complete but contains redundant and duplicated information.</p>
</li>
<li>
<p>Second, we compact the graph produced in the previous step using dominance techniques which identify and prune unnecessary nodes and edges. The resultant abstraction is shown to contain a minimal set of nodes and edges yet still retains the representational completeness properties of the original map.</p>
</li>
<li>
<p>Third, we describe the Hierarchical Annotated A* algorithm (HAA*) which we use to efficiently answer queries for a wide variety of agents with different sizes and terrain traversal capabilities. HAA* is shown to produce very high quality (i.e. near optimal) paths with comparatively little search effort vs. Annotated A*.</p>
</li>
</ol>
<h3>Clusters and Entrances</h3>
<p>In order to create an an abstract representation of an annotated map we follow Botea et al <a rel="nofollow" href="#botea04">[5]</a> and divide the environment into a series of discrete square-sized areas called clusters. Figure 11 shows the result of this step on our running example using clusters of size 5&#215;5.</p>
<div style="text-align:center;" style="width:50%;">
<img src="http://files.aigamedev.com/tutorials/haa-clustermap.png" width="250" height="250"/>
<p><b>Figure 11.</b> The map is divided into four 5&#215;5 clusters.</p>
</div>
<div style="text-align:center;" style="width:75%;">
<img title="inter_edges2" src="http://files.aigamedev.com/tutorials/haa-inter_edges2.png" width="394" height="250"/>
<p><u>Figure 12.</u> (a) Three entrances are identified between clusters C1 and C3, one for each possible capability. (b) Each transition point (denoted by a strong dark line) maximises clearance for a particular capability.</p>
</div>
<p>Next, we identify entrances between each pair of adjacent clusters. An entrance is defined as an obstacle-free area of maximal size that exists along the border between two clusters (Figure 12a). Each entrance has associated with it a transition point which reflects the fact that an agent can traverse from one cluster to the other. To this end we select from each entrance a pair of adjacent tiles, one from each cluster, which maximise clearance (Figure 12b). Each transition point is represented in the abstract graph by two nodes connected with a single <em>inter-edge </em>of weight 1.0. The inter-edge is also annotated with the corresponding capability and clearance value that reflect the traversability requirements of the transition point.</p>
<div style="text-align:center;" style="width:50%;">
<img title="initial_abstraction1" src="http://files.aigamedev.com/tutorials/haa-initial_abstraction1.png" width="249" height="250"/>
<p><u>Figure 13.</u> A complete initial abstraction.
</p></div>
<p>Finally, we complete the abstraction by finding all possible ways to traverse each cluster. We achieve this by running Annotated A* (AA*) between each pair of abstract nodes inside a cluster; one search for each combination of possible agent sizes and capabilities. Every time AA* successfully finds a path we add a new <em>intra-edge</em> between the start and goal nodes. The weight of the edge is equal to the length of the path and we further annotate it with the size and capability parameters used by AA* to reflect the traversability requirements of the path. This approach is highly effective at capturing all pertinent topographical details of the original map. Infact, it is easy to see that the resultant graph (which is termed an <em>initial abstraction</em>) is representationally complete since we&#8217;ve identified all possible transitions between each pair of adjacent clusters and all possible ways to traverse each cluster (Figure 13).</p>
<h3>Compacting the abstract graph</h3>
<p>An interesting observation made during the abstraction-building process was that on many maps the same path was often returned by AA* when searching between the same pair of points with different sizes and capability parameters. This indicates that our abstract graph actually contains unnecessary or duplicated information (and is also needlessly large as a result). To solve this problem we&#8217;re going to apply two edge dominance approaches to prune unnecessary nodes an edges. I want to avoid describing these ideas formally (the details are in <a rel="nofollow" href="#harabor08">[1]</a>) and instead focus on the intuition behind each one.</p>
<p>The first, termed strong dominance, states that if two edges, both of identical length, connect the same pair of nodes and both are traversable by the same capability then we need only retain the one with the largest clearance. Figure 14 illustrates this idea. It is easy to see that using this approach preserves representational completeness; any agent able to traverse the edge with smaller clearance is also able to traverse the one with larger clearance. The resultant graph is termed a <em>high-quality abstraction</em> because we discard only duplicate information fromt the graph.</p>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="strong_dominance" src="http://files.aigamedev.com/tutorials/haa-strong_dominance.png" width="297" height="250"/>
<p><u>Figure 14:</u> (a) Part of the initial abstraction for cluster C1. (b) Strong dominance removes edges E5 (dominated by E3) and E6 (dominated by E4).</p>
</div>
<div style="text-align:center;" style="width:50%;float:left;">
<img title="weak_dominance4" src="http://files.aigamedev.com/tutorials/haa-weak_dominance4.png" width="301" height="250"/>
<p><u>Figure 15.</u> (a) A graph with two inter-edges, E2 and E5. An agent traveling from "u" to "x" via E2 must both swim and walk whereas traveling via E5 only requires walking. (b) The dominated inter-edge, E2, and its endpoints, are removed.</p>
</div>
<p><br style="clear:both;"/></p>
<p>The second approach, termed weak dominance, is focused on minimising the number of transitions between clusters. To achieve this the algorithm analyses pairs of inter-edges that connect the same two clusters and attempts to prove that if one is removed the representational completeness of the graph is maintained. The effect is that only transitions which are traversable by the largest number of agents are retained. This is similar to the way motorists frequently prefer to travel between locations via freeways, which are traversable by many kinds of vehicles, instead of opting for more direct offroad travel. Figure 15 illustrates this idea; again, it is easy to see that the application of weak dominance also preserves representational completeness. The resultant graph is termed a low-quality abstraction, to reflect the fact that some connectivity information is lost in the process (Figure 16).</p>
<div style="text-align:center;" style="width:50%;">
<img title="weak_dominance1" src="http://files.aigamedev.com/tutorials/haa-weak_dominance1.png" width="250" height="250"/>
<p><u>Figure 16:</u> The abstract graph after weak dominance is applied. Note that the graph is almost half the size compared to Figure 13.</p>
</div>
<p>Choosing which dominance technique to use will depend on the exact requirements of the target application. Empirical results have shown that in both cases the amount of memory required to store the abstract graph can be a small fraction of that required by the original map. (though the exact number depends on a range of factors which are discussed in <a rel="nofollow" href="#harabor08">[1]</a>). Comparatively speaking, low quality abstractions can be more than 50% smaller than their high quality counterparts but there is a small tradeoff. In particular, high quality abstractions produce, on average, paths with lengths 3-5% longer than optimal while low quality abstractions are in the 6-10% range.</p>
<h3>Hierarchical Annotated A*</h3>
<p>The process of finding a path using an abstract graph is a straightforward one that will be familiar to anyone who has come across the HPA* algorithm <a rel="nofollow" href="#botea04">[5]</a>:</p>
<ol>
<li>
<p>Insert two temporary nodes into the abstract graph to represent the start and goal locations. Connect these nodes to the rest of the graph by attempting to find a path to from the start/goal positions to every transition point in the local cluster.</p>
</li>
<li>
<p>Using A*, find a shortest path from the start to the goal in the abstract graph. At the end of the search, remove the two temporary nodes.</p>
</li>
</ol>
 As with Annotated A*, the search algorithm from Step 2 is modified slightly to accept two extra parameters: the agent&#8217;s size and capability. In addition, the search function is also also augmented so that before a node is added to A*&#8217;s open list we first verify that it is infact reachable. In this case, a node is reachable only if the edge connecting it to the current node is traversable for the given size and capability parameters. The resultant algorithm is termed Hierarchical Annotated A* (HAA* for short).
<p>As with other hierarchical planners, HAA* is shown to be very fast. I analysed its performance on a large set of problems (over 140K) using both small and large maps from Bioware&#8217;s popular RPG <a rel="nofollow" title="Baldur's Gate Homepage" target="_blank" href="http://www.bioware.com/games/baldurs_gate/">Baldur&#8217;s Gate</a>. Since there are no similar pathfinding algorithms to measure against, it was contrasted with Annotated A*. In short, HAA* is an order of magnitude faster and, even with my naive, non-optimised implementation, it was able to find solutions to most problems in ~6ms on average (tested on my Core2 Duo 2.16GHz MacBook, running OSX 10.5.2 with 2GB of memory).</p>
<p>If you&#8217;d like to play with a working implementation of HAA*, you can download the <a rel="nofollow" title="HAA* Project Page" target="_blank" href="http://code.google.com/p/ahastar/downloads/list">source code</a> I wrote to evaluate the algorithm. The classes most relevant to the preceeding few sections are probably <a rel="nofollow" title="AnnotatedCluster" target="_blank" href="http://code.google.com/p/ahastar/source/browse/tag/aha_r2008-07-31/trunk/aha/AnnotatedCluster.cpp">AnnotatedCluster</a> and <a rel="nofollow" title="AnnotatedClusterAbstraction" target="_blank" href="http://code.google.com/p/ahastar/source/browse/tag/aha_r2008-07-31/trunk/aha/AnnotatedClusterAbstraction.cpp">AnnotatedClusterAbstraction</a> which together are responsible for generating the abstract graph. Meanwhile, <a rel="nofollow" title="AnnotatedHierarchicalAStar" target="_blank" href="http://code.google.com/p/ahastar/source/browse/tag/aha_r2008-07-31/trunk/aha/AnnotatedHierarchicalAStar.cpp">AnnotatedHierarchicalAStar</a> provides a reference implementation of the HAA* algorithm.</p>
<h3>Concluding Remarks</h3>
<p>So that about wraps things up. I hope this article will serve to highlight the usefulness of clearance-based pathfinding methods for efficiently dealing with the large diversity of both units and environments so often seen in modern video games. For more information on HAA* I suggest taking a look at the original paper <a rel="nofollow" href="#harabor08">[1]</a> and associated presentation slides, both of which contain more indepth discussion of the ideas presented here.</p>
<p>Alternatively, if you have specific questions or comments regarding anything described in this article, please feel free to <a rel="nofollow" target="_blank" href="mailto:daniel dot harabor at nicta dot com dot au">contact me</a>.</p> <h3>References</h3> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;" id="harabor08">
<b>Hierarchical Path Planning for Multi-size Agents in Heterogeneous Environments</b>
D. Harabor and A. Botea
IEEE Symposium on Computational Intelligence and Games (2008)
[1] Download <a rel="nofollow" target="_blank" href="http://harablog.files.wordpress.com/2009/01/haa.pdf">(PDF)</a> <a rel="nofollow" target="_blank" href="http://harablog.files.wordpress.com/2009/01/haa_cig08.pdf">(Presentation)</a>
</pre>
<pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;" id="choset04">
<b>Principles of Robot Motion, pp. 86-88</b>
MIT Press (2004)
<a rel="nofollow" target="_blank" href="http://books.google.com/books?id=S3biKR21i-QC&amp;pg=PA86&amp;vq=brushfire&amp;dq=choset+robot+motion&amp;source=gbs_search_s&amp;cad=0">(google books entry)</a>
[2] H. Choset, K. M. Lynch, S. Hutchinson, G. Kantor, W. Burgard, L. E. Kavraki and S. Thrun
</pre>
<pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;" id="jurney07">
<b>Dealing with Destruction: AI From the Trenches of Company of Heroes</b>
Game Developers Conference (2007)
<a rel="nofollow" target="_blank" href="http://aigamedev.com/premium/presentations/dealing-with-destruction">(slides and videos)</a> <a rel="nofollow" target="_blank" href="https://store.cmpgame.com/product.php?cat=24&#038;id=2089">(audio purchase)</a>
[3] C. Jurney and S. Hubick
</pre> $$$http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4082128$$$Formal Basis for the Heuristic Determination of Minimum Cost Paths$$$P.E. Hart, N.J Nilsson, B. Raphael
IEEE Transactions on Systems Science and Cybernetics (1968) Vol 4, Issue 2, pp. 100-107$$$ <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Near Optimal Hierarchical Path-Finding</b>
A. Botea, M. Müller, J. Schaeffer Journal of Game Development (2004) Volume 1, Issue 1, 7-28
Download <a rel="nofollow" target="_blank" href='http://www.cs.ualberta.ca/~mmueller/ps/hpastar.pdf'>PDF</a></pre><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/QgZkgyXr4hM" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/clearance-based-pathfinding/</feedburner:origLink></item>
      <item>
         <title>Motion Planning for Fun and Profit!</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/o4nncz9cN2k/</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt;
&lt;img src="http://files.aigamedev.com/insiders/moplan.icon.jpg" style="float:left;margin-right:1em;" align="left" hspace="32"/&gt;
&lt;p&gt;One topic that's particularly hot in computer animation these days is motion planning. Think of it as one way to combine pathfinding with animation &amp;mdash; which falls under the label of locomotion. Motion planning distinguishes itself by taking a more global approach to generating animation, such that the results are more purposeful and higher quality. Many game developers are looking in this direction for solutions that are better looking and have lower production costs. &lt;/p&gt; &lt;p&gt;In my animation lecture at the &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com/coverage/gdc09-slides-highlights"&gt;AI Summit&lt;/a&gt;, I gave a comprehensive introduction and review of all the different ways to create a locomotion system. The most enlightening for me was hearing feedback form people agreeing or disagreeing with particular solutions. On the animation front, no topic was more debated than the idea of motion planning during those few days, so I thought the topic deserves its own article to go through the major benefits and objections.&lt;/p&gt; &lt;p&gt;As a teaser, here's an example we've been working on as part of the &lt;tt&gt;AiGameDev.com&lt;/tt&gt; Sandbox, and that I showed at the GDC last month that. This prototype uses A* as planner that drives a step-based motion model, so the system is searching through a set of foot plants to reach a goal.&lt;/p&gt;
&lt;p&gt;[...]&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/o4nncz9cN2k" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/article/motion-planning-thoughts/</guid>
         <pubDate>Sat, 02 May 2009 07:00:00 -0700</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/article/motion-planning-thoughts/</feedburner:origLink></item>
      <item>
         <title>18 Embarrassing Game AI Bugs Caught On Tape... and Fixed!</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/g6ncXirTjUk/</link>
         <description>Here's a list of the eighteen best, quirkiest, and most informative artificial intelligence bugs available on YouTube we've collected over the past 12 months. In the spirit of AiGameDev.com, you'll find a bunch of tips &amp; tricks to help fix these probl [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/bugs-caught-on-tape/</guid>
         <pubDate>Tue, 28 Apr 2009 16:36:30 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img src="http://files.aigamedev.com/bugs-icon.jpg" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>Here's a list of the eighteen best, quirkiest, and most informative artificial intelligence bugs available on <i>YouTube</i> we've collected over the past 12 months. In the spirit of <tt>AiGameDev.com</tt>, you'll find a bunch of tips & tricks to help fix these problems when/if you see them in your own game.</p> <p>First, a disclaimer. While certainly fun, this is also a difficult feature for me to write; the draft has been waiting to be finished up and published for over 6 months. There are already many video collections of AI bugs on also-ran Game News sites, but the difference here is that I've personally met or worked online with most of the developers behind these games &mdash; and many of them read this blog (<a rel="nofollow" target="_blank" href="http://aigamedev.com/feed/">RSS</a>). I'm hoping the controversial aspect of this article is overshadowed by the useful analysis and the importance of the topic.</p> <p>The fact is, if you look beyond the sensationalist headline, social media websites are dramatically changing the way games are received by gamers and the community at large. And AI in games is no exception here... In fact, there seems to be increasingly more pressure and scrutiny on the behavior of game characters. Luckily, this new area of social media means there's also lots to learn from!</p> <h3><span class="number">#1</span><br/>AI Can't See Until Seen</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/2DZX-Fq5N0I"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/2DZX-Fq5N0I" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Half-Life 2, 2004.</p> <h4>Symptom</h4> <p>A player is carrying a barrel in front of his eyes such that it hides all enemy NPCs in the scene. This in turn causes the enemies to not attack until the player drops the barrel!</p> <h4>Cause</h4> <p>Explaining this bug requires a little context. As <a rel="nofollow" target="_blank" href="http://www.gamasutra.com/view/feature/2888/building_an_ai_sensory_system_.php?print=1">documented</a> by Tom Leonard (now working at Valve), the sensory system in Half-Life is built to help prevent player frustration, so that soldiers and enemies in the game do not attack the player until the player has noticed them.</p> <p>In this case, you can use that to your advantage by carrying a barrel, but you could also demonstrate this bug by walking backwards into a room full of enemies!</p> <h4>Cure</h4> <p>Since this special case in the sensory system was introduced artificially for gameplay reasons, fixing it also needs to be a game design issue. There are multiple quick fixes:</p> <ul>
<li><p>Add an extra condition to the "ignore player" statement in the sensory system, for example only when the player is under attack or recently received damage.<p></li>
<li><p>Remove the "ignore player" statement with a time out mechanism that kicks in after a few seconds. This can provide realistic AI reaction & decision times while at the same time giving the player some leeway.</p></li>
</ul> <p>Going beyond these quick fixes requires a more general "experience manager" that can determine which NPCs should acquire the player as a target based on the current challenge to the player.</p> <pre style="padding-left:72px;background:#e0e0e0 url(http://files.aigamedev.com/icons/PDF.png) no-repeat 8px 25%;">
<b>Building an AI Sensory System: Examining The Design of Thief: The Dark Project</b>
Tom Leonard, GDC 2003.
<a rel="nofollow" target="_blank" href="http://www.gamasutra.com/view/feature/2888/building_an_ai_sensory_system_.php?print=1">View Online</a>
</pre> <h3><span class="number">#2</span><br/>Your Last Known Position Is...</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/Ji_r0reKJFI"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/Ji_r0reKJFI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Hitman: Blood Money, 2006.</p> <h4>Symptom</h4> <p>An doctor-like NPC was chasing the player who recently escaped from some hospital facility, but does not notice the player changing clothes in front of him. The doctor then abandons the chase, is threatened by the player (now in Hitman clothes) and goes to notify a guard NPC about the last known position of the escaped prisoner. In the process, the doctor NPC runs past the player himself shouting <em>"Run for your life."</em></p> <p><u>Extra</u>: Guards do not react to the player's escape until notified by the hospital staff.</p> <h4>Cause</h4> <p>All NPCs in the game have a sensory system which allows them to react appropriately when the player is dressed differently. This allows gameplay features like changing clothes to hide from guards and doctors. However, there's a loophole in this system that's not handled when the player is visible when the clothes are changed.</p> <p><u>Extra</u>: The same sensory system means that not all guards are instantly aware of the escape until told, but in this cause the guards do not take into account the player's obvious actions.</p> <h4>Cure</h4> <p>The problem is caused by adding a sensory system, which is very useful. However, corner cases pop up due to the additional complexity. These can be fixed with the following steps:</p> <ul>
<li><p>To hide these problems and generally improve the AI, each guard could be built with a default behavior that activates when the player does something suspicious &mdash; regardless of his clothes. For example, reacting to the player running or nearby.</p>
<li><p>An extra flag is necessary somewhere in the sensory system to indicate if the player changed his clothes while visible. If that's the case, this flag would help override the current perceived clothes, and keep the same behavior active.<p></li>
<li><p>This flag can be set globally once for the player or, in the spirit of this game, it would be set for each NPC. This would allow the doctors to communicate to guards about the player's false disguise.</p></li>
</ul> <h3><span class="number">#3</span><br/>NO SWIMMING</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/eEBWiI0PtBQ"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/eEBWiI0PtBQ" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Grand Theft Auto San Andreas, 2004.</p> <h4>Symptom</h4> <p>NPC cops follow the player into the water, but they can't swim and immediately drown.</p> <h4>Cause</h4> <p>This kind of situation is one of many special cases that can arise in open worlds, particularly when the NPCs do not have the same abilities as the player. In particular, this bug was caused by the cops either not knowing about the water, or not knowing that they needed a special ability to enter the water. Instead, the cops AI was reactively moving towards the player's position.</p> <h4>Cure</h4> <p>This was fixed in subsequent releases, presumably by:</p> <ul>
<li><p>Adding more information into the navigation graph about the type of environment, in this case annotating volumes as water.</p></li>
<li><p>Making the cops' pathfinding aware of the water and avoiding it at all cost. The AI would stop before the ledge leading into the water.</p></li>
</ul> <h3><span class="number">#4</span><br/>When Priorities Go Wrong!</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/vre1ABXbMoM"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/vre1ABXbMoM" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game:</u> Crysis, 2007.</p> <h4>Symptom</h4> <p>NPC investigates a burning barrel that was thrown by the player and landed nearby. The barrel subsequently explodes while the NPC is nearby looking at it.</p> <h4>Cause</h4> <p>The NPC's investigate behavior is activated when an unexpected sound is emitted by the landing barrel, but the fact that the barrel is burning is not taken into account.</p> <h4>Cure</h4> <p>There are two possible fixes, in order of preference:</p> <ol>
<li><p>Have the FreeFromDanger behavior work for burning barrels, and make sure its activation is checked periodically. (Subsumption)</p></li>
<li><p>Add a special-case precondition to the investigate behavior that checks if the source object type is not dangerous. (Inhibition)</p></li>
</ol> <h3><span class="number">#5</span><br/>What Sound Does a Knife Make?</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/H2pz5uTXa70"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/H2pz5uTXa70" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: S.T.A.L.K.E.R., 2007.</p> <h4>Symptom</h4> <p>A player using a knife can completely take over an enemy base without any of the AI soldiers firing a shot back at the player.</p> <h4>Cause</h4> <p>There are two things that cause this bug:</p> <ol>
<li><p>The fact that the Knife seems to be treated as a separate case by the sensory system, so it doesn't trigger the usual reaction that you get from a weapon.</p></li>
<li><p>The fact that S.T.A.L.K.E.R. supports neutral factions, the player is by default treated as a neutral entity and this status is not updated because of point 1).</p></li>
</ol> <h4>Cure</h4> <p>The solution to this problem is to first fix the sensory system and its effect on the behavior, so that knife kills are taken into account as other weapons. This can be done by using one common Event type, or alternatively taking into account a death sound.</p> <p>The second thing to fix would be to make the Stalkers a little more suspicious of the player when entering their base, especially when armed. Also, Stalkers could be given a sixth-sense suspicious behavior (rather than the normal patrol / idle) when multiple nearby soldiers are killed.</p> <h3><span class="number">#6</span><br/>Standing Still *Is* A Strategy</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/-gpIytQCKZg"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/-gpIytQCKZg" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: FIFA 08, 2007.</p> <h4>Symptom</h4> <p>An individual AI player on the opposite team remains completely immobile in the middle of the pitch, only playing the occasional idle animation. He remains still even if a human player runs up to the AI individual, puts the ball in his feet, or bounces the ball off him.</p> <h4>Cause</h4> <p>Such general bugs are hard to identify without looking at the code itself. Even with the code handy, explaining why an NPC is not doing what he's supposed to do generally is much harder than narrowing down a more specific issue. In this case, it could be any of the following:</p> <ul>
<li>This player no longer has its AI updated because of a game logic bug, and is simply "going through the motions" in a brain dead manner.</li>
<li>The individual player has found a "terminal" state in the behavior which offers no way out. This is a problem in the logic that's relatively simple to fix once identified.</li>
</ul> <h4>Cure</h4> <p>The AI works for the rest of the team as well as for other games, so this seems to be a very special case. Specific enough that EA shipped the game with it. Once isolated, tracking down the source would be relatively easy by using a logging mechanism to identify this particular problem (if your designer comes up to you with this issue). However, to catch such problems generally you could consider gathering simple statistics for each player, such as distanced moved, passes sent and received, etc. and watch out for anomalies.</p> <h3><span class="number">#7</span><br/>The Shortest Path is a Straight Line</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/ncj9ZsPHVfM"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/ncj9ZsPHVfM" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Armed Assault, 2007.</p> <h4>Symptom</h4> <p>At the edge of the map near the water, a squad ordered to move to a point on the other side of the bank decides to move through the water. The individual AI soldiers swim around and eventually reach the shore, from where they can move to the target point. In the video, the player reached that point in 1/3rd of the time.</p> <h4>Cause</h4> <p>This bug may be caused by two things:</p> <ul>
<li>The navigation representation does not model the water. This is possible if the world is assumed to be a 2D terrain with sparse obstacles.</li>
<li>The pathfinder used by squads does not deal with concave areas like near the edge of the map, also caused by similar 2D terrain assumptions.</li>
</ul> <h4>Cure</h4> <p>The easiest way to fix this is to smooth the coastline of each map such that there are only convex land masses. Alternatively, the squad pathfinder can be run through a representation that takes into account the water at an increased cost, such that it is avoided by default.</p> <h3><span class="number">#8</span><br/>I'm Invisible: Go Around Me</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/9NiVybcXoas"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/9NiVybcXoas" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Company of Heroes, 2006.</p> <h4>Symptom</h4> <p>An invisible sniper controlled by the player causes the tank to stop and pathfind around him everytime he moves. Yet the tank and the enemies are not aware of the sniper and therefore don't engage him.</p> <h4>Cause</h4> <p>The cause of this problem is a mismatch between the game logic and high-level behaviors ignoring the sniper, yet the pathfinding is continuously trying to find a way around a hidden sniper.</p> <h4>Cure</h4> <p>There are two ways to fix this, one involved less design and the other more technology:</p> <ul>
<li><p>Remove the sniper cloaking feature! The tanks would attack the sniper rather than try to pathfind around it.</p></li>
<li><p>When the sniper cloaks, remove it as an obstacle for enemy units in the pathfinder.</p></li>
</ul> <h3><span class="number">#9</span><br/>Moonwalking Is Fun</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/FlZBKz-f6yk"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/FlZBKz-f6yk" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Prince of Persia: Rival Swords (PSP), 2006.</p> <h4>Symptom</h4> <p>NPC guards are seen on two instances walking into posts and closed doors repeatedly, while the animation keeps on walking.</p> <p><u>Extra</u>: Enemy is passive until attacked the first time.</p> <h4>Cause</h4> <p>There are two bugs that cause the behaviors to look like this in the end:</p> <ol>
<li><p>The navigation representation isn't accurate enough, either taking into account the characters width near pillars or not updating dynamically when doors close.</p></li>
<li><p>The path following isn't capable of noticing lack of progress, and simply keeps on going despite collision problems.</p></li>
</ol> <h4>Cure</h4> <p>Fixes to either of the two problem areas would solve this, but such navigation problems often take much longer to fix than the usual behavioral bugs. In this case, you'd need to build a more conservative navigation representation (e.g. retracting the edges of your navmesh a bit further to prevent physics problems) or if the system is using waypoints then reducing their effective radius. The second improvement could be to use a simple form of dead reckoning to track the change in movement, and consider planning a new path if the velocity reaches zero over the course of a few seconds.</p> <h3><span class="number">#10</span><br/>Who's Your Enemy?</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/xOJp5hXzaQI"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/xOJp5hXzaQI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Oblivion, 2006.</p> <h4>Symptom</h4> <p>An enemy NPC was unresponsive until attacked. The NPC responds to the player once hit with the sword, but decides to target another NPC before dealing with the player. In the end, the NPC ends up running off to his original target.</p> <p><u>Extra:</u> NPC moonwalking into a wall as in the previous issue.</p> <h4>Cause</h4> <p>The pathfinding issue and lack of responsiveness is the same diagnostic as bug #10. However, the prioritization issue (which seems to be a problem) is caused by the AI only taking into account the most recent attacker, and ignoring the players original attack.</p> <h4>Cure</h4> <p>The main way to fix this involves biasing the NPCs a little more towards the player. Having an in-game simulation is a nice feature to have, but this is a game so the NPCs should take the player's actions into account a little more. For instance:</p> <ul>
<li><p>Have NPCs ignore other attacks if the player is the current target.</p></li>
<li><p>Maintain a queue of multiple active targets, and make sure to engage the player before moving on.</p></li>
</ul> <p>Which of these you decide to apply as a fix depends on your design, and how "player focused" the AI should be. Even if the NPCs don't engage the player, they should at least acknowledge this.</p> <h3><span class="number">#11</span><br/>Where's the Pitch Control on this Mounted Gun?</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/9wykO-2OhOE"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/9wykO-2OhOE" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Crysis, 2007.</p> <h4>Symptom</h4> <p>The enemy NPC in control of the mounted gun just fires repeatedly in the direction of the player, despite not being able to hit him. There's a dead spot right near the vehicle where the NPC cannot aim the mounted gun, yet still the AI soldier keeps shooting regardless.</p> <h4>Cause</h4> <p>The problem is that the behavior of the enemy on a mounted gun remains the same in all cases while the player is in front, even though the player may not be targeted. When the NPC receives damage, however, he dismounts from the gun as expected.</p> <h4>Cure</h4> <p>This is another special case that is amplified by <i>YouTube</i> and the fact that this is a sandbox game. The multiple fixes are relatively simple:</p> <ul>
<li><p>Use a simple line-of-sight (LOS) or cone-of-fire (COF) check to determine if the player can be targeted.</p></li>
<li><p>Add a minimum radius to the mounted gun behavior such that the NPC dismounts if the player comes too close.</p></li>
<li><p>Tell the NPC to dismount if he hasn't done any damage to the player for a certain period of time.</p></li>
</ul> <h3><span class="number">#12</span><br/>Drowning on Land</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/6dL570pc9qI&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/6dL570pc9qI&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Halo, 2001.</p> <h4>Symptom</h4> <p>A grunt is stuck "swimming" on the floor. The grunt does not respond to player shots, but only to explosions.</p> <h4>Cause</h4> <p>This could be due to the fact he's stuck in geometry and playing a falling animation. The reason for being stuck in the first place may be due to collision and/or explosion pushing the grunt into problematic geometry.</p> <h4>Cure</h4> <p>This particular bug is a difficult one to fix within the physics simulation, like many other physics/collision related issues. The fact that this bug was also apparently reproduced in subsequent versions of Halo also indicates this is a tough problem.</p> <p>A behavioral fix could be to detect that a grunt is partly stuck in this state, and run a query on the navigation system to find a nearby position that's not occupied, then slowly interpolating the grunt towards this position.</p> <h3><span class="number">#13</span><br/>Are You Receiving My Bullets?</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/KEO6Fg5goFI"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/KEO6Fg5goFI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Call of Duty 4, 2007.</p> <h4>Symptom</h4> <p>Allied and enemy NPCs keep shooting each other from a meter away, and keep missing because of a nearby tree. Bullets of one of the NPCs are actually hitting the tree, but the bullets of the other seem to disappear.</p> <p><u>Extra</u>: Both AI soldiers are also unresponsive to player movement.</p> <h4>Cause</h4> <p>Four little factors (that wouldn't be too much of a problem elsewhere) combine to cause this particular issue:</p> <ol>
<li><p>The "attack enemy" behavior continues to execute at top priority until the target is dead, regardless of what the player is doing or how successful the behavior is.</p></li>
<li><p>The line-of-sight (LOS) check used to determine if an NPC can shoot another does not trace the bullet exactly. (This is usually the case in modern games.)</p></li>
<li><p>There's not enough variation in the shooting behavior to break the deadlock.</p></li>
<li><p>No feedback is provided to the NPC when his bullets hit a tree rather than the intended target.</p></li>
</ol> <h4>Cure</h4> <p>Fixing any of the following problems would resolve the issue:</p> <ul>
<li><p>Decrease the value of the "attack enemy" behavior over time as it fails to achieve its goal, or let it time out such that another behavior is chosen.</p></li>
<li><p>Introduce more randomness into the shooting behavior as the NPC keeps aiming for the same target. Modeling this kind of frustration as part of the aiming skill would help.</p></li>
<li><p>Have the NPC monitor the health of the enemy and inflicted damage to check that the current behavior is actually achieving its intended purpose.</p></li>
<li><p>At regular stages before / during the shoot out, fire a tracer bullet to check if the target can currently be hit from the exact position of the gun.</p></li>
</ul> <p>The way I would resolve this problem is to have fixed duration actions for attacking the enemy, then select many of these in succession to guarantee diversity in the combat and also prevent single problems.</p> <h3><span class="number">#14</span><br/>What Just Happened There?</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/2IHvlU8QS5E"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/2IHvlU8QS5E" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Oblivion, 2006.</p> <h4>Symptom</h4> <p>The player fires an arrow in an NPC's living room. The NPC then accuses the player of stealing from him.</p> <h4>Cause</h4> <p>The typical causes for an inappropriate behavior in response to an event / stimulus are either:</p> <ul>
<li><p>An error in the conditional logic to activate a behavior.</p></li>
<li><p>There is no behavior for this event, and a default is used.</p></li>
</ul> <h4>Cure</h4> <p>In this case, it's doubtful that the reaction <em>"You're stealing from me!"</em> is used as a default, so I'd assume that the problem is with the activation logic for this behavior. It might be a simple scripting or copy/paste error, but otherwise having a clear event/situation for <em>"Player picked up an object that doesn't belong to him."</em> would help activate the stealing response.</p> <p>Also, you could remedy this situation by having the AI check the reaction <em>"What exactly are you doing?"</em> when specific situations like these are found.</p> <h3><span class="number">#15</span><br/>Do the Oscillation Dance</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/06qwYL68vu8"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/06qwYL68vu8" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Gears of War, 2006.</p> <h4>Symptom</h4> <p>The enemy NPC is dancing on the spot, oscillating back and forth between two positions. The NPC is also unresponsive to the player's nearby presence.</p> <h4>Cause</h4> <p>There are a few instances of the same bug on YouTube also, and this seems to be caused by the navigation system changing its mind too often. The pathfinder is run from one position, calculating a path one way. Then as the path is followed, the path is recalculated causing a different route to be taken.</p> <p>The actual cause of this oscillation could be due to the way the costs are setup in the environment, which lead to a local "minima" where the bot oscillates. But an alternate explanation is that the bot hits a trigger box / radius when moving in one direction, which causes one behavior to engage. Then when the trigger is exited, the original behavior resumes.</p> <h4>Cure</h4> <p>Assuming it's a special pathfinding situation where there are multiple paths to the bot's target, the easy way to reduce the problem is to add a "cool down" factor for changing destinations less often. There's typically no need to decide on a new path on a regular basis, simply monitoring the current path for problems would be enough.</p> <p>If the problem is due to local triggers engaging two competing behaviors, a similar time buffer can be used to reduce oscillation between the two choices.</p> <h3><span class="number">#16</span><br/>Driver, Where Are You Talking Me?</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/F7pjw8vs6Ug&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/F7pjw8vs6Ug&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Halo 3, 2007.</p> <h4>Symptom</h4> <p>An NPC driving in a Warthog keeps bumping into a force field while trying to drive around. However, when the player gets out of the vehicle, the driving / bumping bug stops.</p> <h4>Cause</h4> <p>The force field does not seem to be taken into account by the vehicle pathfinding. The AI doesn't realize it needs to move backwards in this case to get out of trouble.</p> <h4>Cure</h4> <p>There are two ways this could be fixed:</p> <ol>
<li><p>Have the pathfinder take into account force fields dynamically when doing searches for vehicles.</p></li>
<li><p>Detect that path-following fails (using progress measurements) and temporarily disable links in the navigation representation, to prevent problems of unexpected dynamic objects.</p></li>
</ol> <h3><span class="number">#17</span><br/>I Speak with Dead People</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/OOeL_cOWHa0"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/OOeL_cOWHa0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Crysis, 2007.</p> <h4>Symptom</h4> <p>Two NPCs are in a scripted dialog with each other. The player takes out one of them using a sniper riffle, and the other NPC keeps on chatting away as if nothing had happened.</p> <h4>Cause</h4> <p>The root of this bug is the interplay between scripted situations that involve multiple characters, and the dynamic gameplay behavior that's required to interact with the player. In this case, since the shot of the sniper riffle was possibly not heard by the NPCs, the trigger failed to interrupt the scripted dialog since it didn't take into account the nearby death of an ally &mdash; very much like bug #5.</p> <h4>Cure</h4> <p>The solution involves a similar fix as #5, making sure the sensory system takes into account "entity dead" events as sounds, for example. Alternatively, NPCs near the hit point of a bullet should be informed of the presence of the player, or possibly even informed of the player's position (after the second shot). Above all, your group behavior scripts must be written to be interruptible by the player at every stage &mdash; especially if you're working on an open game.</p> <h3><span class="number">#18</span><br/>Do Not Open that Box!</h3> <div style="text-align:center;">
<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/sDzzAvzDTDo&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/sDzzAvzDTDo&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object> 
<br/>
</div> <p><u>Game</u>: Bioshock, 2007.</p> <h4>Symptom</h4> <p>When a particular box is searched, an enemy is spawned everytime on demand at a similar location. Even if the player is looking at all the access points for that location.</p> <h4>Cause</h4> <p>Although the game seems to spawn NPCs out of sight of the player, the problem is the script that spawns the enemy NPCs doesn't take into account how often he performs an action.</p> <p>This isn't technically an AI issue, it's more of a scripting problem. But, as often with these bugs, it's attributed to AI programmers!</p> <h4>Cure</h4> <p>There's a scripting fix and a technical fix that can alleviate this problem:</p> <ul>
<li><p>Add a counter to the script trigger to prevent it from firing more than once.</p></li>
<li><p>Beyond checking the line-of-sight from the player to the spawn point, check if the player is looking directly at all the access points of the spawn location.</p></li>
</ul> <h3>Summary & Take Away</h3> <p>Generally speaking, there are a few things you should know about game AI bugs:</p> <ol>
<li><p>On their own, most bugs don't take long to fix technically speaking; most ones in this list would possibly take between an hour and a few days to isolate and fix.</p></li>
<li><p>Most bugs quickly become a design decision, as fixing bugs may affect other behaviors or the gameplay itself. Towards the end of a project, the AI is often frozen for this reason.</p></li>
<li><p>AI bugs are rarely ever show stoppers, and the reason they are not fixed is due to scheduling and production reasons.</p></li>
</ol> <p>As an AI developer, this can be a little frustrating at times &mdash; particularly when the reviews come in. However, the fact that a game contains AI bugs reflects on a large part of the team, particularly at the production level. It's possibly one explanation for many AI programmers eventually becoming Lead Programmer, as it's one of the best ways to make sure everything comes together to make sure the behaviors work and the gameplay is fun!</p> <p>In the meantime, if you're making your own game, this list of bugs also has its lessons to teach:</p> <ul>
<li><p>Spend time playtesting so that you can find out your player's expectations, and cater to those. This is a numbers game.</p></li>
<li><p>Consider spending some time tuning your AI for NPC watchers that try to find loopholes in the behaviors and post bugs on YouTube!</p></li>
</ul> <b>So, how do <u>you</u> approach the design and development of AI knowing that your characters are going to be under more scrutiny now than ever before? Post your comment below!</b><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/g6ncXirTjUk" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/bugs-caught-on-tape/</feedburner:origLink></item>
      <item>
         <title>New Site Launched! Noteworthy Features and Lessons Learned</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/rMS-MbHOw_M/</link>
         <description>If you're reading this then no doubt you've noticed the brand new version of the site already. We've been online for a few days and let me tell you, it's been quite a ride! Thanks so much for your feedback, encouragement, and kind words but a [...]</description>
         <guid isPermaLink="false">http://aigamedev.com/open/article/new-site/</guid>
         <pubDate>Sun, 26 Apr 2009 16:13:00 -0700</pubDate>
         <content:encoded><![CDATA[<p><small>Copyright &copy; <a rel="nofollow" target="_blank" href="http://AiGameDev.com/" title="Game AI for Developers">AiGameDev.com</a>, 2009.</small></p> <img src="http://files.aigamedev.com/site-icon.png" style="float:left;margin-right:1em;" align="left" hspace="32"/> <p>If you're reading this then no doubt you've noticed the brand new version of the site already. We've been online for a few days and let me tell you, it's been quite a ride! Thanks so much for your feedback, encouragement, and kind words &mdash; but also of course your bug reports and suggestions. Rest assured we're working on them.</p> <p>Over the last two years, <tt>AiGameDev.com</tt> has grown very organically: first as a blog, then as a forum, and finally into the premium area. The site has certainly been needing renovations, so we took the time to completely rebuild the backend and create a new design &mdash; and this time we got professional help.</p> <h3>New and Noteworthy</h3> <p>The big theme for the redesign was to help explain the site better, and in particular emphasize the incredible community behind the site and also the amazing content we've been creating over the past 2+ years. Now it should be more obvious from first glance we're not just a game development blog or an also-ran news site!</p> <p>In particular, we made it much easier to browse around on the site and see what's going on at a glance:</p> <ul>
<li><b>Front Page</b> &mdash; A lot of time and effort went into the root page of the whole site, in particular from a content and navigation perspective. It helps bring together everything together from different sections on the site and highlight what's important.</li>
<li><b>Media Section</b> &mdash; To help emphasize the depth and variety of the content, we also added a section that catalogs all the forms of Media listed on the site. We'll be annotating the few hundred existing articles so this section will grow incrementally.</li>
<li><b>Integrated Search</b> &mdash; You can also access all the content on the site via the search button, so everything is at your finger tips.</li>
<li><b>Site Accessibility</b> &mdash; We also smoothed out the process of helping you log-in to the site by adding it to the top menu, and it's also much clearer how you can sign-up to the site.</li>
<li><b>Access Levels</b> &mdash; The different user levels on the site are now much clearer: articles for regular visitors have no icons, those for Insiders (free sign-up) have a yellow star, and the Premium Member articles have a red crown.</li>
</ul> <div style="text-align:center;">
<img src="http://files.aigamedev.com/site-highlights.jpg"/>
</div> <h3>Coming Shortly</h3> <p>We decided to focus the relaunch of the site on the key features, as I listed above. In the process, we pushed back some additional features that are ready &mdash; but will come online shortly:</p> <ul>
<li><b>Topics</b> &mdash; Based on popular demand, we'll be including topic specific sections on the site using category-like, for example navigation, character animation, or strategy. These will help you find relevant articles if you have a problem to solve!</li>
<li><b>Events</b> &mdash; As part of the Premium Membership we run a couple live sessions every month, either interviews or masterclasses. We also run public sessions now and then for everyone to join. To make it easier to keep track of what's going on, these will be available on the front page and in the sidebar.</li>
<li><b>Papers &amp; Code</b> &mdash; In the Media section, as we annotate the existing and new articles, we'll include new subsections that reference all the white papers and source code & libraries available on the site.</li>
<li><b>News</b> &mdash; We've maintained a separate news blog for over a year now, but we'll migrate this to the front page of the site. This will encourage us to write smaller articles about current events so we can stay on top of the important news without having to wait for the weekly roundup!</li>
<li><b>RSS Feed</b> &mdash; We spent a lot of time customizing the RSS feed on the old site so it looks as good as you see it. We're obviously very proud of this, and it's one of the many reasons why almost everyone uses it to read the main blog! The new site's feed isn't included yet, but it will be shortly once it looks as good!</li>
</ul> <h3>Known Issues</h3> <p>Also, there are a few things that don't behave quite fully as designed yet. These will be fixed shortly:</p> <ul>
<li><p><b>Categories</b> &mdash; Some of the categories of the public articles couldn't be imported, so all articles don't show up yet when you click on the sidebar links. We'll be re-tagging some articles manually and remapping the previous categories automatically where possible.</p></li>
<li><p><b>Redirects</b> &mdash; Occasional links in the new site are not redirected to the right place yet, and some old links for the categories are not remapped correctly yet. If you find an old link that doesn't work or redirect correctly let us know!</p></li>
<li><p><b>Login</b> &mdash; When logging in, you're currently always redirected to the front page. Also, the forums seem to remember you from a previous session when the main site doesn't always...</p></li>
</ul> <h3>Lessons Learned...</h3> <p>Now, for those of you that followed the relaunch via our front page or Twitter, you probably realize there were a few glitches. Once the site was up and running, there were some performance issues and we had to optimize and upgrade to a new server &mdash; which took longer than expected. The site was under maintenance for about 36h.</p> <p>Of course this wasn't planned and I apologize for those of you that tried to access the site. But in retrospect, lots of great things came of this:</p> <ol>
<li><p>I was amazed by the personal emails, instant messages, and Twitter comments from everyone who sent us support while the upgrade was underway. Thanks for those, they mean a lot!</p></li>
<li><p>Traffic actually increased significantly the day *before* the launch, obviously from people trying to get their fix from the forums or keen to see the new site!</p></li>
<li><p>We setup the official AiGameDev.com #gameai IRC <a rel="nofollow">channel</a> on irc.freenode.net, and that has been fascinating so far! We've hit 10 people already, and it's a friendly atmosphere.</p></li>
</ol> <p>Anyway, the new site marks a new phase for <tt>AiGameDev.com</tt>. Over the next week, we'll be pumping out loads of cool features we had planned for the relaunch. We'll also be sharing more details about what we do as a startup, and what you can expect in the near future. Finally, we'll also be re-opening our Premium Members area in a bit more than a week, so if you want to be notified and get some exclusive previews feel free to <a rel="nofollow" target="_blank" href="http://aigamedev.com/launch">sign up right here</a>.</p><img src="http://feeds.feedburner.com/~r/AiGameDev/~4/rMS-MbHOw_M" height="1" width="1"/>]]></content:encoded>
      <feedburner:origLink>http://aigamedev.com/open/article/new-site/</feedburner:origLink></item>
      <item>
         <title>Expo Floor AI Booth Crawl: 5 Middleware Companies, 10 Minutes Each</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/qrIc4aoiP18/gdc09-booth-crawl</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt; &lt;img src="http://aigamedev.com/premium/wp-content/uploads/2009/04/expo-floor-192x115.jpg" align="left" style="float:left;margin-right:1em;" hspace="32"/&gt; During an empty slot on Thursday afternoon of the GDC, we spent 1h30 going around the whole Expo Floor. There were quite a few AI middleware vendors present, though not all of them were giving public demonstrations. We took our camera with us and filmed our discussions with the developers. We also took along a handful of AI programmers and researchers to ask tricky questions!&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/qrIc4aoiP18" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/coverage/gdc09-booth-crawl</guid>
         <pubDate>Sat, 18 Apr 2009 08:59:20 -0700</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/coverage/gdc09-booth-crawl</feedburner:origLink></item>
      <item>
         <title>GDC ‘09 Roundtable #3 Q&amp;A Coverage</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/f4yX1jJrT1E/gdc09-roundtable3</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt; &lt;img src="http://aigamedev.com/premium/wp-content/uploads/2009/04/gdc09-roundtable3-1-192x89.jpg" align="left" style="float:left;margin-right:1em;" hspace="32"/&gt; The third AI roundtable of GDC 2009 took place on Friday 27th, and &lt;tt&gt;AiGameDev.com&lt;/tt&gt; was also there to cover the session, like for the second roundtable. This session was the beginner Q&amp;A roundtable, where people getting started in Game AI could ask anything on their mind. There was no shortage of topics to stimulate everyone's thoughts!&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/f4yX1jJrT1E" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/news/gdc09-roundtable3</guid>
         <pubDate>Sat, 04 Apr 2009 13:06:30 -0700</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/news/gdc09-roundtable3</feedburner:origLink></item>
      <item>
         <title>GDC ‘09 AI Roundtable #2 Coverage</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/1aNCVsapQ1g/gdc09-roundtable2</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt; &lt;img src="http://aigamedev.com/premium/wp-content/uploads/2009/03/gdc09-roundtable2-2-192x89.jpg" align="left" style="float:left;margin-right:1em;" hspace="32"/&gt; The second AI roundtable of GDC 2009 took place on Thursday 26th, and &lt;tt&gt;AiGameDev.com&lt;/tt&gt; was there to cover the event &amp;mdash; as well as participate of course! This session was rather intimate due to schedule clashes, but the discussion was informative and lively covering topics including the transfer of AI between FPS and RTS, tool successes and failures, as well as reuse of behaviors.&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/1aNCVsapQ1g" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/news/gdc09-roundtable2</guid>
         <pubDate>Thu, 26 Mar 2009 14:15:13 -0700</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/news/gdc09-roundtable2</feedburner:origLink></item>
      <item>
         <title>The Race for Better Game Avatars and Player Immersion</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/Z9D7zf7uiMY/race-avatars-immersion</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt; &lt;img src="http://aigamedev.com/premium/wp-content/uploads/2009/02/bradford-alex-192x115.jpg" align="left" style="float:left;margin-right:1em;" hspace="32"/&gt; A month ago, the &lt;a rel="nofollow" target="_blank" href="http://www.aigamesnetwork.com/"&gt;AI / Games Research Network&lt;/a&gt; held a meeting in Bardford about Academic / Industry collaboration in the fields of avatars and player immersion. This is the first talk of the afternoon, given by Alex J. Champandard, which discusses ways that we can use AI to improve avatar behaviors as well as immerse the player more, as well as the risks involved. The range of topics covered ranges from emotional feedback to parkour, including the AI Director in Left 4 Dead.&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/Z9D7zf7uiMY" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/presentations/race-avatars-immersion</guid>
         <pubDate>Sun, 15 Feb 2009 11:09:52 -0800</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/presentations/race-avatars-immersion</feedburner:origLink></item>
      <item>
         <title>The Future of Collaboration in Player Representation and Engagement</title>
         <link>http://feeds.aigamedev.com/~r/AiGameDev/~3/rCwmvXOcycU/collaboration-player-engagement</link>
         <description>&lt;p&gt;&lt;small&gt;This article was published for &lt;a rel="nofollow" target="_blank" href="http://aigamedev.com"&gt;AiGameDev.com&lt;/a&gt; Insiders, free by registration.&lt;/small&gt;&lt;/p&gt; &lt;img src="http://aigamedev.com/premium/wp-content/uploads/2009/01/bradford-panel-192x118.jpg" align="left" style="float:left;margin-right:1em;" hspace="32"/&gt; This panel discussion.comanized as part of the &lt;i&gt;AI Games Network&lt;/i&gt; focuses on &lt;a rel="nofollow" target="_blank" href="http://www.aigamesnetwork.com/main:events:aav"&gt;AI and Avatars&lt;/a&gt;, and ways for industry and academia to collaborate to engage and emulate human players. The discussion was friendly and lively, with topics including research opportunities and open challenges, game-specific APIs or standards, open source or cooperative labs as a way to encourage collaboration.&lt;br/&gt;&lt;br/&gt; &lt;u&gt;Participants&lt;/u&gt;: Peter Cowling, Joanna Bryson, Alex Champandard, Simon Colton, Daniel Kudenko, Simon Lucas, Mark Morris&lt;img src="http://feeds.feedburner.com/~r/AiGameDev/~4/rCwmvXOcycU" height="1" width="1"/&gt;</description>
         <guid isPermaLink="false">http://aigamedev.com/insider/panels/collaboration-player-engagement</guid>
         <pubDate>Sat, 17 Jan 2009 10:56:12 -0800</pubDate>
      <feedburner:origLink>http://aigamedev.com/insider/panels/collaboration-player-engagement</feedburner:origLink></item>
   </channel>
</rss><!-- fe2.pipes.re3.yahoo.com uncompressed Thu Jul  2 01:50:33 PDT 2009 -->
