<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[0 .A.Dventure]]></title>
  <link href="http://github.com/sathyamvellal/0adblog/atom.xml" rel="self"/>
  <link href="http://github.com/sathyamvellal/0adblog/"/>
  <updated>2013-10-26T11:08:41+05:30</updated>
  <id>http://github.com/sathyamvellal/0adblog/</id>
  <author>
    <name><![CDATA[Sathyam Vellal & Jashwanth Reddy]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Our first Patch!]]></title>
    <link href="http://github.com/sathyamvellal/0adblog/2013/10/26/our-first-patch/"/>
    <updated>2013-10-26T10:45:00+05:30</updated>
    <id>http://github.com/sathyamvellal/0adblog/2013/10/26/our-first-patch</id>
    <content type="html"><![CDATA[<p>In our quest to understand more of the AI (which is written in JS), we use the homegrown <a href="http://trac.wildfiregames.com/wiki/JavascriptDebugging">JSDebugger tool</a>. And we contributed a little something for this ;)</p>

<!-- more -->


<p>The JSDebugger did not have keybindings for the different debugging actions like Step, Step-Into, Continue, Break, etc. And that&rsquo;s what we added. Though this was child&rsquo;s play, it certainly feels amazing to have actually contributed something. Oh, it does not stop there! Its committed in SVN revision #14014! :D<br/>
Check it out &ndash;> <a href="http://trac.wildfiregames.com/ticket/2208">Ticket #2208</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The source of it all...! [Part 3]]]></title>
    <link href="http://github.com/sathyamvellal/0adblog/2013/10/18/the-source-of-it-all-part-3/"/>
    <updated>2013-10-18T07:46:00+05:30</updated>
    <id>http://github.com/sathyamvellal/0adblog/2013/10/18/the-source-of-it-all-part-3</id>
    <content type="html"><![CDATA[<p>In the last two posts we looked at how the game source is organized and how it launches. We&rsquo;ll now go deeper and delve into the huge codebase of C++/JS and how these two languages communicate.</p>

<!-- more -->


<p>The first thing to know is that 0 A.D. uses a lot of wrappers and home grown entities like a string class, filesystem class, a compressor, parsers for parsing game related files, thread managers, etc. All such classes can be found in <strong>source/ps</strong> directory (ps stands for <em>pyrogenesis</em>, the name of the game engine). But what interests us, lies in the <strong>source/simulation2</strong> directory. This contains all the core components that are used by the Engine to communicate with the simulation aspects of the game. So what do we have here?</p>

<figure class='code'><figcaption><span>Root Directory </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(0ad)source@svn : simulation2$ tree
</span><span class='line'>.
</span><span class='line'>|-- components/
</span><span class='line'>|-- docs/
</span><span class='line'>|-- helpers/
</span><span class='line'>|-- scripting/
</span><span class='line'>|-- serialization/
</span><span class='line'>|-- system/
</span><span class='line'>|-- tests/
</span><span class='line'>|-- MessageTypes.h
</span><span class='line'>|-- Simulation2.cpp
</span><span class='line'>|-- Simulation2.h
</span><span class='line'>`-- TypeList.h
</span><span class='line'>
</span><span class='line'>7 directories, 4 files</span></code></pre></td></tr></table></div></figure>


<p>Majority of the code here resides in the <a href="http://github.com/sathyamvellal/0adblog/docs/dir_1d614d6cd62ee91a565feed8a30f6de5.html">components/</a> directory. This has most of the major components (as the dir name suggests) required for running handling the simulation, including code which runs the scripts written in JS. Most of the components are implemented with an supposed-to-be-interface class which the actual component class inherits. Example, <code>CCmpAIManager</code> inherits <code>ICmpAIManager</code>; where the first letter represents a class or interface respectively. (more info on the coding guidelines and conventions can be seen <a href="http://trac.wildfiregames.com/wiki/Coding_Conventions">here</a>)</p>

<p>Since our main target is the AI, let&rsquo;s try to understand how the AI begins. A lot of components are registered in the game; one of them being the AIManager component, defined in <a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html">CCmpAIManager.cpp</a>. This has the <a href="http://github.com/sathyamvellal/0adblog/docs/classCCmpAIManager.html">CCmpAIManager</a> class. Before going to the details of this class, let us see something very interesting.</p>

<p>The source uses SpiderMonkey to bind C++ and JS. The C++ source exposes a variable called <code>Engine</code> to the JS runtime, which is an instance of the <a href="http://github.com/sathyamvellal/0adblog/docs/classScriptInterface.html">ScriptInterface</a> class. This is created in the singleton <a href="http://github.com/sathyamvellal/0adblog/docs/classScriptingHost.html">ScriptingHost</a> class. The singleton object creating is handled through a <a href="http://github.com/sathyamvellal/0adblog/docs/classSingleton.html">Singleton</a> base class. So what&rsquo;s the result? The JS runtime can now access the C++ routines through the <code>Engine</code> object (which internally is an object of <code>ScriptInterface</code>).<br/>
The next step would be to attach routines to this Engine object so that they&rsquo;d be exposed to the JS runtime and this is done through the <code>RegisterFunction</code> function, in the file <a href="http://github.com/sathyamvellal/0adblog/docs/NativeWrapperDecls_8h_source.html">NativeWrapperDecls.h</a> which registers a C++ function with the <code>Engine</code>object. So if a function named <code>Foo</code> is registered, then this function can be accessed in JS as <code>Engine.Foo()</code>. Ain&rsquo;t it a beauty??!</p>

<p>So, we have a function <code>Script_QueryInterface</code> of the <a href="http://github.com/sathyamvellal/0adblog/docs/classCComponentManager.html">CComponentManager</a> class registered with the <code>Engine</code> object with the name <code>QueryInterface</code>. What this does is give an object of the queried interface. So to obtain an object of the AIManager component, (whose interface is <a href="http://github.com/sathyamvellal/0adblog/docs/classICmpAIManager.html">ICmpAIManager</a> and implemented in <a href="http://github.com/sathyamvellal/0adblog/docs/classCCmpAIManager.html">CCmpAIManager</a>; henceforth, we&rsquo;ll call this <em>AIManager</em>) all we need to do is use <code>Engine.QueryInterface</code>. To specify that we require the AIManager component, the ID is passed as the second argument to this function. The ID of each component is declared as an <em>enum</em> in <a href="http://github.com/sathyamvellal/0adblog/docs/Components_8h_source.html">source/simulation2/system/Components.h</a>.
This is exactly what the script <a href="https://github.com/0ad/0ad/blob/master/binaries/data/mods/public/simulation/helpers/InitGame.js#L13">InitGame.js#L13</a> does. So there it is! The JS runtime&rsquo;s access to the Engine&rsquo;s AIManager through the JS object <code>cmpAIManager</code>; this object is the gateway for all communication between C++ and JS (those related to AI)</p>

<p>Now lets unwind our discussion stack. &ldquo;How does the AI start?&rdquo; was the question we started off with. Understand that <code>cmpAIManager</code> is an object of the AIManager component. This component has a function &ndash; <a href="https://github.com/0ad/0ad/blob/master/binaries/data/mods/public/simulation/helpers/InitGame.js#L20">AddPlayer</a>, defined in <a href="http://github.com/sathyamvellal/0adblog/docs/classCCmpAIManager.html">CCmpAIManager</a>. If you check <a href="https://github.com/0ad/0ad/blob/master/binaries/data/mods/public/simulation/helpers/InitGame.js#L20">InitGame.js#L20</a>, this function is called through the <code>cmpAIManager</code>. The <a href="http://github.com/sathyamvellal/0adblog/docs/classCAIWorker.html">CAIWorker</a> class implements the worker thread for the AIManager. An object of this class is stored in <code>CCmpAIManager</code>  as <code>m_Worker</code>. The AIWorker class has an <code>AddPlayer</code> function. This is called by the <code>AIManager</code>&rsquo;s <code>AddPlayer</code> function. You can observe this <a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html#l00965">here</a>.<br/>
The <code>CAIWorker.AddPlayer</code> function initializes the AI by calling the appropriate AI module (The directory of the AI-bot which contains all the relevant AI scripts. The order of functions that are called go like this -<br/>
The <code>AIManager.AddPlayer</code><a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html#l00963">[1]</a> calls the <code>AIWorker.AddPlayer</code><a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html#l00512">[2]</a>. This first initializes the AI by calling <code>AIPlayer.Initialize</code><a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html#l00209">[3]</a> which in turn calls <code>AIPlayer.LoadScripts</code><a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html#l00185">[4]</a>. This function is responsible for loading the AI module by using <code>ScriptInterface.LoadGlobalScriptFile</code><a href="http://github.com/sathyamvellal/0adblog/docs/ScriptInterface_8cpp_source.html#l00952">[5]</a> which physically loads and executes the script file using SpiderMonkey bindings.</p>

<p>And there you go! The AI module is loaded! So, while setting up the game, if you select the AI bot as <strong>Aegis Bot</strong> for an AI Player, then the <a href="https://github.com/0ad/0ad/blob/master/binaries/data/mods/public/simulation/ai/aegis">aegis module</a> will load. Make a note of the file <code>_init.js</code><a href="https://github.com/0ad/0ad/blob/master/binaries/data/mods/public/simulation/ai/aegis/_init.js">[6]</a> in the module. This file loads modules which are to be loaded before the rest of the current module is loaded. For example, the <em>Aegis Bot</em> requires <em>Common API v3</em> to be loaded (you can have a look at the <em>Common API v3</em> module <a href="https://github.com/0ad/0ad/blob/master/binaries/data/mods/public/simulation/ai/common-api-v3">here</a>). Also note that <code>Engine.IncludeModule</code> is registered to <code>CAIPlayer::IncludeModule</code><a href="http://github.com/sathyamvellal/0adblog/docs/ScriptInterface_8cpp_source.html#l00106">[7]</a> (which can be seen <a href="http://github.com/sathyamvellal/0adblog/docs/ScriptInterface_8cpp_source.html#l00089">here</a>) which again calls the <code>AIPlayer.LoadScripts</code><a href="http://github.com/sathyamvellal/0adblog/docs/CCmpAIManager_8cpp_source.html#l00185">[8]</a> function.</p>

<p>Phew! Learning how the JS is executed is one exhausting task! See you in the next post. Bye!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The source of it all...! [Part 2]]]></title>
    <link href="http://github.com/sathyamvellal/0adblog/2013/10/07/the-source-of-it-all-part-2/"/>
    <updated>2013-10-07T13:14:00+05:30</updated>
    <id>http://github.com/sathyamvellal/0adblog/2013/10/07/the-source-of-it-all-part-2</id>
    <content type="html"><![CDATA[<p>In the last post we documented an overview of the game and also some vital resources that are to be used during the game-dev So lets start descending into the source. In this post we&rsquo;ll discuss how the game starts and runs.</p>

<p>Also, you can access the doxygen generated doc of the game&rsquo;s source available <a href="http://github.com/sathyamvellal/0adblog/docs/index.html">here</a>. This documentation will be regularly updated and will be referred to throughout the blog.</p>

<!-- more -->


<p>If you build the game on your own, using the source, you typically get a binary <code>pyrogenesis</code> in the <code>binaries/system</code> directory and the game will be using data or scripts present in <code>binaries/data/mods/public</code>; unless the game is compiled with some flags specifying the binary, data or lib directories while setting up the workspace (info can be found <a href="http://trac.wildfiregames.com/wiki/BuildAndDeploymentEnvironment">here</a>).</p>

<p>So let&rsquo;s begin! When the game is run, it starts off by performing some initializations.</p>

<ol>
<li>The thread on which the game started is marked as the main thread and its named &ldquo;main&rdquo;. <a href="http://github.com/sathyamvellal/0adblog/docs/GameSetup_8cpp_source.html#l00827">[GameSetup.cpp:827]</a></li>
<li>The current time is noted so that elapsed time can be counted from this point. <a href="http://github.com/sathyamvellal/0adblog/docs/GameSetup_8cpp_source.html#l00838">[GameSetup.cpp:838]</a></li>
<li>The profiler is initialized and started. The profiler is used for analysing framerate fluctuations or glitches and temporal relationships between threads. <a href="http://github.com/sathyamvellal/0adblog/docs/GameSetup_8cpp_source.html#l00842">[GameSetup.cpp:842]</a></li>
<li>The locales are set for the game execution depending on the OS. <a href="http://github.com/sathyamvellal/0adblog/docs/GameSetup_8cpp_source.html#l00844">[GameSetup.cpp:844]</a></li>
</ol>


<p>After this is done, the game is then ready to start running. Now,</p>

<ol>
<li>The command line arguments are interpreted (if any given). <a href="http://github.com/sathyamvellal/0adblog/docs/main_8cpp_source.html#l00446">[main.cpp:446]</a></li>
<li>A virtual file system is created and the game&rsquo;s cache and data are loaded. <a href="http://github.com/sathyamvellal/0adblog/docs/main_8cpp_source.html#l00465">[main.cpp:465]</a></li>
<li>The game is now started and the graphics initialized. <a href="http://github.com/sathyamvellal/0adblog/docs/main_8cpp_source.html#l00504">[main.cpp:504]</a></li>
<li>The input handlers are initialized and set. <a href="http://github.com/sathyamvellal/0adblog/docs/main_8cpp_source.html#l00506">[main.cpp:506]</a></li>
</ol>


<p>By now the game is up and running and the profiler would be capturing every frame.  When the game is quit, the shutdown sequence starts. You can see all this starting from <a href="http://svn.wildfiregames.com/public/ps/trunk/source/main.cpp">source/main.cpp</a> and related files. There&rsquo;s just too much code to inline in the post!</p>

<p>While this certainly gives a fair idea of how the game begins, its worth noting some classes and features available in the source.</p>

<p>The Core Engine modules are placed in <a href="http://github.com/sathyamvellal/0adblog/docs/dir_0dc38aac9085a57339423d7e064a603d.html">source/ps/</a> directory and they are used all over the source. A few of them are &ndash;</p>

<ol>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/ArchiveBuilder_8h_source.html">ArchiveBuilder</a>: Used to package mod files into distributable archives.</li>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/CConsole_8h_source.html">Console</a>: The in-game scripting console.</li>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/ConfigDB_8h_source.html">ConfigDB</a>: Manage configuration variables for the game.</li>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/CStr_8h_source.html">CStr</a>: A string wrapper designed to provide better string handling.</li>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/Filesystem_8h_source.html">Filesystem</a>: A class to provide filesystem-like functionality to the API which makes it easier to access files for the game.</li>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/CmdLineArgs_8h_source.html">GameSetup/CmdLineArgs</a>: A class to parse the command line arguments.</li>
<li><a href="http://github.com/sathyamvellal/0adblog/docs/Paths_8h_source.html">GameSetup/Paths</a>: Wrapper class for OS Paths used in the game.</li>
</ol>


<p>&hellip; and many more! You can have a look at <a href="http://github.com/sathyamvellal/0adblog/docs/dir_0dc38aac9085a57339423d7e064a603d.html">the directory</a> to view all the files in it.
Our work isn&rsquo;t done yet! Our initial focus has been on the AI which we&rsquo;ll be covering next.</p>

<p>To be continued &hellip;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The source of it all...! [Part 1]]]></title>
    <link href="http://github.com/sathyamvellal/0adblog/2013/10/02/the-source-of-it-all-part-1/"/>
    <updated>2013-10-02T07:38:00+05:30</updated>
    <id>http://github.com/sathyamvellal/0adblog/2013/10/02/the-source-of-it-all-part-1</id>
    <content type="html"><![CDATA[<p>We finally made an attempt to go through the source and wow its big! One thing about OpenSource projects is how much you learn by understanding the source; not just getting to know it but learning and understanding the design concepts! <a href="http://svn.wildfiregames.com/public/ps/trunk">This wiki page</a> tells you what to do to get the source and how to build it.</p>

<!-- more -->


<p>This post is aimed to give you an overview of some aspects of developing 0 A.D. Although these details are available in the wiki, they are not yet structured in an understandable way. Here, we gather many wiki articles and also provide some information on how the game is structured.</p>

<h3>What does the root directory contain?</h3>

<p>Let&rsquo;s have an overview of it first.</p>

<figure class='code'><figcaption><span>Root Directory </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(0ad)source@svn : /$ tree
</span><span class='line'>.
</span><span class='line'>|-- binaries/
</span><span class='line'>|-- build/
</span><span class='line'>|-- docs/
</span><span class='line'>|-- libraries/
</span><span class='line'>|-- source/
</span><span class='line'>|-- license_dbghelp.txt
</span><span class='line'>|-- license_gpl-2.0.txt
</span><span class='line'>|-- license_lgpl-2.1.txt
</span><span class='line'>|-- LICENSE.txt
</span><span class='line'>`-- README.txt
</span><span class='line'>
</span><span class='line'>5 directories, 5 files</span></code></pre></td></tr></table></div></figure>


<p><strong>binaries →</strong> This contains all of the game&rsquo;s data, scripts that are executed during the game, mods and other executables (typically for windows). This is what goes to the end user.<br/>
<strong>build →</strong> This has the necessary tools and programs to set up a workspace to build the game. More instructions on how to build the game can be seen <a href="http://trac.wildfiregames.com/wiki/BuildInstructions">here</a>.<br/>
<strong>docs →</strong> All documentation goes here.<br/>
<strong>libraries →</strong> Placeholder for third-party libraries used in the game. However, they may or may not be used.<br/>
<strong>source →</strong> This contains the source of the game engine and the source of other tools that are associated with the game (Eg: The scenario editor).</p>

<h4>Are there more details available?</h4>

<p>A more detailed information on what these directories (and their subdirectories) contain can be found <a href="http://trac.wildfiregames.com/wiki/Finding_Your_Way_Around">here</a>.</p>

<h4>What resources are available for a contributor to learn more about the game?</h4>

<p>The first is the <a href="http://trac.wildfiregames.com/">trac wiki</a>. This has a lot of links for all kinds of contributors &ndash; artists, programmers, etc. The next place are the <a href="http://www.wildfiregames.com/forum/index.php">game forums</a>. One needs to register for the forums and there are 5 categories of forums available; the description of which can be seen under the link to the particular forum. And lastly, the best place to communicate is the IRC. You can join the channels<code>#0ad</code> and <code>#0ad-dev</code> in <code>QuakeNet</code> and jump right into a live discussion over there!</p>

<h4>What are the languages used to implement the game design?</h4>

<p>The source of the game is written in C++ and JS. Interesting right?<br/>
The convention is to have as much of the game&rsquo;s source in JS as possible (to keep it simple) and only write the core game engine and those components which need performance in C++. This enables the game to be heavily moddable through JS.</p>

<h4>I would like to be a developer and was wondering how to start with the game-dev. Any tips?</h4>

<p>As we said, the <a href="http://trac.wildfiregames.com/">trac wiki</a> is the entry point for getting a picture of the game&rsquo;s structure. The next step would be to start reading the source (which is discussed from the next post onwards). You&rsquo;ll also need to know the <a href="http://trac.wildfiregames.com/wiki/Coding_Conventions">coding guidelines and conventions</a> that are followed so you can understand the source better and also will get you prepared when you start with the development. You would also need to learn <a href="http://svn.wildfiregames.com/public/ps/trunk">how to build the game</a>, which for a developer, is vital. You can then look at some <a href="http://trac.wildfiregames.com/report">tickets available on trac</a> and try to solve a few easy ones. This actually kickstarts the development and helps you to learn more about the internal structure of the game. You can start off with a few <a href="http://trac.wildfiregames.com/query?status=assigned&amp;status=new&amp;status=reopened&amp;keywords=~simple&amp;col=id&amp;col=summary&amp;col=status&amp;col=type&amp;col=priority&amp;col=milestone&amp;col=component&amp;report=16&amp;order=priority">beginner-level tickets</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why we're contributing to 0 A.D.]]></title>
    <link href="http://github.com/sathyamvellal/0adblog/2013/09/22/why-we-are-contibuting-to-0ad/"/>
    <updated>2013-09-22T09:37:00+05:30</updated>
    <id>http://github.com/sathyamvellal/0adblog/2013/09/22/why-we-are-contibuting-to-0ad</id>
    <content type="html"><![CDATA[<p><strong>Age of Empires</strong> is A game by Ensemble Studios which revolutionized the RTS gaming industry which is still played by millions round the clock! But it did not stop with the Age of Empires series. Many more historic RTS games have come up in the past decade; Empire Earth, Rome Total War, etc. And here&rsquo;s one that is coming out soon!</p>

<!-- more -->


<h2>What is 0 A.D. ?</h2>

<p>0 A.D. is a historical Real Time Strategy game being developed by Wildfire Games. It all started by a collaborative effort of three modding communities in 2001/2002. You can read <a href="http://play0ad.com/about/the-story-of-0-a-d/">The Story of 0 A.D.</a> to know the full story. The game was open sourced in July 2009 and has been quite a star in the open source gaming world.</p>

<h2>Who we are.</h2>

<p>We are a team of two; myself, Sathyam M Vellal and my teammate Jashwanth Reddy M and we have enrolled into &ldquo;Architecture of Open Source Technologies&rdquo;, an elective being offered in our college. This elective requires us to contribute to an open source community through the semester and we decided to contribute to 0 A.D.</p>

<h2>Why 0 A.D. ?</h2>

<p>Every open source community has its share of awesome developers and mentors. What makes this better? An open source community developing a game. Nearly half the community is online most of the day and developing some feature. What I like most about this community is the relaxed discussions they have. Its serious, yet fun and fun, yet technical. Well, if these aren&rsquo;t enough, I have an excuse to play the game any time I want now! Even during class! By the way, the game has amazing graphics; have look at <a href="http://play0ad.com/media/screenshots/">some screenshots</a> and it has an <a href="http://play0ad.com/media/music/">incredible soundtrack</a>!</p>

<h2>0 A.D Docs and Info</h2>

<p>The developer devil &ndash; Documentation. Nobody wants to write it, yet everyone wants to read it. Although 0 A.D. is not too different from others in this regard, the game is still highly structured with information present online to help a developer start his work. The <a href="http://trac.wildfiregames.com">root of all info</a> is <a href="http://trac.wildfiregames.com">trac</a>. And there&rsquo;s always <a href="http://webchat.quakenet.org/?channels=#0ad-dev">IRC</a> for everything else.</p>

<p>This blog is for us to record our adventure in exploring and contributing to 0 A.D. Stay tuned for more updates!</p>
]]></content>
  </entry>
  
</feed>
