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

  <title>Game Development</title>
  <link rel="self" href="http://chris.iluo.net/rss/chris/gamedev.xml"/>
  <updated>2010-09-07T04:56:49-07:00</updated>
  <author>
    <name>Chris</name>
    <uri>http://chris.iluo.net/rss/chris/gamedev</uri>
  </author>
  <id>urn:tag:chris.iluo.net,CHANNEL15</id>

  <entry>
    <title>Find Broken Symbolic Links</title>
    <link href="http://chris.iluo.net/blog/2010/07/29/find-broken-symbolic-links/"/>
    <id>http://yoursite/article/?i=8e763256b9ed88d69e8da46f54173f34</id>
    <updated>2010-07-29T14:21:26-07:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"># Print out broken symbolic links
find -L . -type l

Note to self: Move this to a useful Linux tips post.</div></summary>
  </entry>

  <entry>
    <title>malloc double free/non- aligned pointer </title>
    <link href="http://chris.iluo.net/blog/2010/01/10/malloc-double-freenon-aligned-pointer-being-freed-set-a-breakpoint-in-malloc_error_break-to-debug/"/>
    <id>http://yoursite/article/?i=220a588f685aa97bd70f8c7d38f88352</id>
    <updated>2010-01-09T15:08:12-08:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
malloc: *** error for object 0x3874a0: double free
***set a breakpoint in malloc_error_break to debug

malloc: *** error for object 0x18a138: Non- aligned pointer being freed
*** set a breakpoint in malloc_error_break to debug

So basically something in your code is screwing around with memory.
Either releasing something that has already been released:

int* x = new x&#91;10&#93;;
delete &#91;&#93; x;
delete &#91;&#93; x;

Or releasing something that is not pointing to the start of an allocated block of memory:

int* x = new int&#91;10&#93;;
x++;
delete &#91;&#93; x;

The error message isn&#8217;t very clear if you have no experience with GDB.  GDB is a debugger for your binaries.  It allows you to set break points at the start of a function and any time that function is called your application will pause and allow you to debug in GDB.  We can then get valuable information back by executing commands to get the backtrace, registers state and disassembly.  The advantage of using GDB over Xcode/KDevelop is being able to break into any function, not just functions in your source code.  Anyway, this is how I got the backtrace to find out where in my sourcecode I was making a mistake:

gdb
file myapplication
break malloc_error_break
run
backtrace

Now whenever a double free or non- aligned pointer is freed it will break into gdb and we can type in &#8220;backtrace&#8221; and work out what our code did to trigger this.</div></summary>
  </entry>

  <entry>
    <title>Cannot open /dev/sda1: Device or resourc</title>
    <link href="http://chris.iluo.net/blog/2009/11/16/cannot-open-devsda1-device-or-resource-busy/"/>
    <id>http://yoursite/article/?i=0beb97e2f963de5d26c08106bacb79d1</id>
    <updated>2009-12-22T05:00:52-08:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/11/16/cannot-open-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After an update (Upgrade?) a while ago I couldn&#8217;t boot into Fedora, it had the text mode bar graph and after getting to 100% it failed with this error message:

Cannot open /dev/sda1: Device or resource busy

It turned out that this was a dmraid problem.  It would appear that something changed when updating and added or enabled dmraid.  So I had to find a way to remove or disable it, the simplest solution I found that worked was disabling it via the arguments to the kernel in GRUB.
Edit menu.lst (Or grub.conf, my menu.lst is a symbolic link to grub.conf)

su
gedit /boot/grub/menu.lst

Find the entry that you are currently booting into and add &#8220;nodmraid&#8221; to the end of the &#8220;kernel&#8221; line:

	kernel /vmlinuz-2.6.31.6-166.fc12.x86_64 ro root=UUID=7129c2cc-03c5-4b7a-8472-bb9d314446b3  LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rhgb quiet nodmraid

I also like to add a timeout and remove hiding of the menu (This is in the general entry at the top of the file):

timeout=10
#hiddenmenu

My final menu.lst/grub.conf file looks like this:

default=0
timeout=10
splashimage=&#40;hd0,1&#41;/grub/splash.xpm.gz
#hiddenmenu
title Fedora &#40;2.6.31.6-166.fc12.x86_64&#41;
	root &#40;hd0,1&#41;
	kernel /vmlinuz-2.6.31.6-166.fc12.x86_64 ro root=UUID=7129c2cc-03c5-4b7a-8472-bb9d314446b3  LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rhgb quiet
	initrd /initramfs-2.6.31.6-166.fc12.x86_64.img

Why Chris, your grub.conf is so puny, only one entry in it.  Leave me alone, I only just reinstalled.</div></summary>
  </entry>

  <entry>
    <title>How to Find and Remove Folders Recursive</title>
    <link href="http://chris.iluo.net/blog/2009/09/26/how-to-find-and-remove-folders-in-linuxunix-because-i-always-forget-this/"/>
    <id>http://yoursite/article/?i=27d94e5e7323f1457ea3624080d72838</id>
    <updated>2009-10-28T05:00:51-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/09/26/how-to-find-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"># Recursively search for folders called .svn and delete them (Even if not empty)
find . -name .svn -type d -print | xargs rm -rf
 
# Recursively search for files called *~ (gedit creates these for temporarily saving to) and delete them
find . -name \*~ -print | xargs rm -rf
 
# Recursively search for files called *.h or *.cpp and print them
find -name '*.h' -o -name '*.cpp' -print</div></summary>
  </entry>

  <entry>
    <title>How to Find and Remove Folders in Linux/</title>
    <link href="http://chris.iluo.net/blog/2009/09/26/how-to-find-and-remove-folders-in-linuxunix-because-i-always-forget-this/"/>
    <id>http://yoursite/article/?i=b5930552c822792fb7db4c581902e046</id>
    <updated>2009-09-25T16:07:22-07:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"># Recursively search for folders called .svn and delete them (Even if not empty)
find . -name .svn -type d -print | xargs rm -rf
 
# Recursively search for files called *~ (gedit creates these for temporarily saving to) and delete them
find . -name \*~ -print | xargs rm -rf
 
# Recursively search for files called *.h or *.cpp and print them
find -name '*.h' -o -name '*.cpp' -print</div></summary>
  </entry>

  <entry>
    <title>When Good Customers Go Bad</title>
    <link href="http://chris.iluo.net/blog/2009/09/26/when-good-customers-go-bad/"/>
    <id>http://yoursite/article/?i=4a870946e861828bc0091705591d9848</id>
    <updated>2009-09-25T16:07:22-07:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">class Customer;
class CustomerEx; // Added 20.03.2006
class CustomerEx2; // Added 05.10.2006
class CustomerEx2B; // Added 13.07.2008</div></summary>
  </entry>

  <entry>
    <title>Blender Export OBJ Python Script</title>
    <link href="http://chris.iluo.net/blog/2009/09/12/blender-export-obj-python-script/"/>
    <id>http://yoursite/article/?i=1c369195f51d79a1834e13dc97f03b09</id>
    <updated>2009-09-11T22:30:41-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/09/12/blender-expo</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">First of all I&#8217;d like to state that I&#8217;m definitely a Blender n00b and I have never touched Python in my life.  
Baby steps, textured sphere loaded from an obj file
In my game engine I basically have this sort of layout:

sphere/
sphere.obj
sphere.mat
sphere.png

The .obj points to the .mat file which points to the .png file.  So in Blender I would set the material name to &#8220;sphere&#8221; and ideally in the .obj file it would have a line like this, &#8220;usemtl sphere&#8221;, I would then get the sphere part and append &#8220;.mat&#8221; and load the material.  I&#8217;m not sure if this is standard practice for Blender export scripts, but when exporting to the obj file format, Blender adds the texture name to the material like so, &#8220;usemtl sphere_sphere.png&#8221;, not cool.  Anyway I thought, hey, the export script is written in Python, I wonder if I can fix this?
1) Locate the script.  I read somewhere on the Blender site that scripts are in &#8220;/usr/share/blender/scripts/&#8221;.  &#8220;export_obj.py&#8221; is there, along side &#8220;export_obj.pyc&#8221; and &#8220;export_obj.pyo&#8221;.
2) Edit the script.

gedit /usr/share/blender/scripts/export_obj.py

3) The script is pretty well documented.  I knew that I should search for &#8220;usemtl&#8221; as that is the only constant part of the string (Apart from &#8220;_&#8221; which is much harder to search for).  There are two in the file and we want the second one:

mat_data= MTL_DICT.get(key)
	if not mat_data:
		# First add to global dict so we can export to mtl
		# Then write mtl
		# Make a new names from the mat and image name,
		# converting any spaces to underscores with fixName.
		# If none image dont bother adding it to the name
		if key[1] == None:
			mat_data = MTL_DICT[key] = ('%s'%fixName(key[0])), materialItems[f_mat], f_image
		else:
			mat_data = MTL_DICT[key] = ('%s_%s' % (fixName(key[0]), fixName(key[1]))), materialItems[f_mat], f_image
	if EXPORT_GROUP_BY_MAT:
		file.write('g %s_%s_%s\n' % (fixName(ob.name), fixName(ob.getData(1)), mat_data[0]) ) # can be mat_image or (null)
	file.write('usemtl %s\n' % mat_data[0]) # can be mat_image or (null)

mat_data is a dictionary that is filled out and then written the file with &#8220;usemtl&#8221;.  I replaced the offending line:

mat_data = MTL_DICT[key] = ('%s_%s' % (fixName(key[0]), fixName(key[1]))), materialItems[f_mat], f_image

with this:

mat_data = MTL_DICT[key] = ('%s'%fixName(key[0])), materialItems[f_mat], f_image

And then I realised that it was exactly the same as the line from the &#8220;if key[1] == None:&#8221; so you could probably remove the branch etc. if you want, I didn&#8217;t bother.
If you are exporting groups by material you may also need to edit the &#8220;if EXPORT_GROUP_BY_MAT:&#8221; branch also, again I didn&#8217;t bother.  Anyway, save and you&#8217;re good to go.
4) I was worried that I would have to compile into bytecode or something for Blender to be able to use this, nope, either restart Blender or hit &#8220;Update Menu&#8221;.  Actually as it is an export script, I&#8217;m not sure you even need to do that, it probably gets reloaded when you hit &#8220;File > Export > Wavefront (.obj)&#8221;?
This is the entirety of my Python knowledge, oh, I also know that whitespace is important or something, woo.
PS. I&#8217;m loving git, I can&#8217;t believe I didn&#8217;t change earlier!</div></summary>
  </entry>

  <entry>
    <title>I Love the Idea of a New Smart Phone</title>
    <link href="http://chris.iluo.net/blog/2009/08/30/i-love-the-idea-of-a-new-smart-phone/"/>
    <id>http://yoursite/article/?i=bf1a31f0f66110d71d07e9eea484ee99</id>
    <updated>2009-08-30T04:30:37-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/08/30/i-love-the-i</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The list of awesome phones:
HTC Phones
OpenMoko
Palm Pre
However, a new hotness has just been born.
The Nokia n900.
32 GB internal storage
Expandable to up to 48 GB with external microSD card
3.5G mobile network
Quadband GSM with GPRS and EDGE
Data transfers over a cellular network 10/2Mbps
Data transfers over Wi-Fi 54Mbps
Flash 9.4 support (In your face iPhone users, Nokia loves me)
5-megapixel (2584   1938 resolution) digital camera (iPhone is up to 3.2-megapixel)
800 &#195;  480 resolution video recording
Dual LED flash
800   480 resolution screen
Tactile and onscreen QWERTY keyboards (Yes, none of this onscreen keyboard rubbish)
Removable battery (That probably won&#8217;t explode)
Assisted-GPS receiver
Ovi Maps pre-installed
TV out (PAL/NTSC) with Nokia Video Connectivity Cable (CA-75U, included in box) or WLAN/UPnP
Wide aspect ratio 16:9 (WVGA)
Video recording file format: .mp4; codec: MPEG-4
Video recording at up to 848 &#195;  480 pixels (WVGA) and up to 25fps
Video playback file formats: .mp4, .avi, .wmv, .3gp; codecs: H.264, MPEG-4, Xvid, WMV, H.263
Music playback file formats: .wav, .mp3, .AAC, .eAAC, .wma, .m4a
The important part:
Development in C and Python are supported, using GTK.
Unfortunately it looks like C++ is not supported so anyone wanting to do any OOP will have to do it in Python.
That is great that Nokia are supporting open standards, releasing a mobile phone running Linux.  It would be nice if they supported C++ too, but that is just my personal preference, and it may come in the future, I know all the C++ jazz is quite complex and definitely non-trivial.
I&#8217;d still rather use Python than C.  I certainly hope that Windows Mobile dies and the highly overrated iPhone becomes less popular, not completely die, just put in its place.  I would love to see the world embrace open standards, open source software and a rise in DRM free, happy, feel good devices, gain popularity and eventually dominate the market and warm people&#8217;s hearts.</div></summary>
  </entry>

  <entry>
    <title>Moving from SVN to GIT</title>
    <link href="http://chris.iluo.net/blog/2009/08/28/moving-from-svn-to-git/"/>
    <id>http://yoursite/article/?i=9d72eae49dfe1b809df3c8fa3eacb247</id>
    <updated>2009-08-27T16:01:07-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/08/28/moving-from-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So I have a few projects on SourceForge, but they&#8217;re all hosted via SVN.  With all this distributed version control going on I thought I would like to get in on the action.  I thought about moving to github, but what happens in 5 or 10 years when I want to move on to another revision control software?  The name has a limited life expectancy.  Anyway so I wanted to switch so I researched alot, this is the best information I found and this blog entry is basically a rehash specific to SourceForge (Because I didn&#8217;t find any good SourceForge specific information).
Note: For this tutorial you will want to change all occurrences of USERNAME to your user name for example &#8220;pilkch&#8221;, PROJECTNAME to your project name for example &#8220;breathe&#8221; and YOURFULLNAME to your full name for example &#8220;Chris Pilkington&#8221;.
First of all we need to download git and git-svn:

su
yum install git git-svn

Now we are going to create our repo directory for holding our repositories:

cd ~
mkdir repo

Create a users.txt file to map our subversion users to git users:
users.txt

USERNAME = YOURFULLNAME &lt;USERNAME@PROJECTNAME.git.sourceforge.net&gt;

As the other article says, we basically check out a svn directory as a git repository:

cd repo
mkdir PROJECTNAME_from_svn
cd PROJECTNAME_from_svn
git svn init http://PROJECTNAME.svn.sourceforge.net/svnroot/PROJECTNAME --no-metadata
git config svn.authorsfile ../users.txt
git svn fetch

Check that worked (Just read the last few changes to make sure svn history is present, you can hit spacebar to scroll back a page of history or two just to make sure):

git log

From now on we can use git commands, first of all want to create a copy of the git-svn repository:

cd ..
git clone PROJECTNAME_from_svn PROJECTNAME

PROJECTNAME/ now contains our &#8220;clean&#8221; repository and PROJECTNAME_from_svn can be deleted if you like.  We now just need to add and push our local repository to the remote location:

cd PROJECTNAME
git config user.name &quot;YOURFULLNAME&quot;
git config user.email &quot;USERNAME@users.sourceforge.net&quot;
git remote rm origin # This may not be necessary for you
git remote add origin ssh://USERNAME@PROJECTNAME.git.sourceforge.net/gitroot/PROJECTNAME/PROJECTNAME
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
git push origin master

Now to check that this is working you can browse to the git page of your SourceForge project and there should be data in your repository.  And we can clone our repository back again to check that everything is working.

git clone ssh://USERNAME@PROJECTNAME.git.sourceforge.net/gitroot/PROJECTNAME/PROJECTNAME

You may also want to ignore certain types of files, place a file called .gitignore in the root directory of your project and fill it with the patterns you want ignored:
.gitignore

.DS_Store
.svn
._*
~$*
.*.swp
Thumbs.db

Now when we want to update we can do:

git commit -a -m &quot;This is my commit message.&quot; # All changes to the local repository need to be committed before we try merging new changes
git pull # Grab any changes from the main repository

Committing is slightly different:

git add .gitignore # For example we might want to add our new .gitignore file
git commit -a -m &quot;This is my commit message.&quot; # Note: Your commit has now only been staged, it is not in the main repository yet
git push # Now it is pushed into the main repository

That last step is to remove your svn repository which for SourceForge is as simple as unchecking a checkbox on the Admin->Features page.</div></summary>
  </entry>

  <entry>
    <title>Symbols/Characters Returned by ls -l</title>
    <link href="http://chris.iluo.net/blog/2009/08/27/symbolscharacters-returned-by-ls-l/"/>
    <id>http://yoursite/article/?i=0d5e1e86ee58d50a1f1c37ee0464675d</id>
    <updated>2009-08-26T17:00:57-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/08/27/symbolschara</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">$ ls -l
total 24
drwxrwxr-x   ...   thisisadirectory
-rw-rw-r--   ...   thisisafile
lrwxrwxrwx.   ...   thisisalink -&gt; /media/data

We know what the rwx fields are but what about d, &#8211; and l?  Ok, those are pretty obvious too, here is a list of the more obscure ones because I always forget.
d     Directory.
l     Symbolic link.
-     Regular file.
b     Block buffered device special file.
c     Character unbuffered device special file.
s     Socket link.
p     FIFO pipe.
. indicates a file with an SELinux security context, but no other alternate access method.
s    setuid &#8211; This is only found in the execute field.
If there is a &#8220;-&#8221; in a particular location, there is no permission. This may be found in any field whether read, write, or execute field.
The file permissions bits include an execute permission bit for file owner, group and other. When the execute bit for the owner is set to &#8220;s&#8221; the set user ID bit is set.
This causes any persons or processes that run the file to have access to system resources as though they are the owner of the file. When the execute bit for the group is set to &#8220;s&#8221;,
the set group ID bit is set and the user running the program is given access based on access permission for the group the file belongs to.</div></summary>
  </entry>

  <entry>
    <title>libxdgmm</title>
    <link href="http://chris.iluo.net/blog/2009/07/22/libxdgmm/"/>
    <id>http://yoursite/article/?i=85067954953589551e113f002c5cb6b6</id>
    <updated>2009-07-21T16:30:34-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/07/22/libxdgmm/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I think the Portland Project from freedesktop.org, is a great idea and
everyone should be supporting it in their applications.
I&#8217;ve just created a very small C++ wrapper (libxdgmm) for accessing XDG more easily.  To use it, you need libxdg.h and libxdg.cpp.  Just add these to your project and then use them like so:

#include &lt;libxdgmm/libxdg.h&gt;
 
int main&#40;int argc, char** argv&#41;
&#123;
  if &#40;!xdg::IsInstalled&#40;&#41;&#41; std::cout&lt;&lt;&quot;XDG is not installed&quot;&lt;&lt;std::endl;
  else &#123;
    std::string data;
    xdg::GetDataHome&#40;data&#41;;
    std::cout&lt;&lt;&quot;data=\&quot;&quot;&lt;&lt;data&lt;&lt;&quot;\&quot;&quot;&lt;&lt;std::endl;
 
    std::string config;
    xdg::GetConfigHome&#40;config&#41;;
    std::cout&lt;&lt;&quot;config=\&quot;&quot;&lt;&lt;config&lt;&lt;&quot;\&quot;&quot;&lt;&lt;std::endl;
 
    // Obviously these have to exist to work.  You can translate the error code returned by calling xdg::GetOpenErrorString(int result);
    xdg::OpenFile&#40;&quot;/home/chris/dev/cMd3Loader.cpp&quot;&#41;;
    xdg::OpenFolder&#40;&quot;/home/chris/&quot;&#41;;
    xdg::OpenURL&#40;&quot;http://chris.iluo.net&quot;&#41;;
  &#125;
 
  return EXIT_SUCCESS;
&#125;

I still have to wrap some of the other functionality, such as XDG_DESKTOP_DIR, XDG_DOCUMENTS_DIR, XDG_MUSIC_DIR, desktop-file-utils, xdg-desktop-menu and xdg-desktop-icon etc.  I will wrap these as I need them (Or at special request).  I don&#8217;t think I will be supporting xdg-screensaver or xdg-mime as I don&#8217;t have a use for them right now.</div></summary>
  </entry>

  <entry>
    <title>C++0x compiling with gcc</title>
    <link href="http://chris.iluo.net/blog/2009/07/20/c0x-compiling-with-gcc/"/>
    <id>http://yoursite/article/?i=95818ee8258dc73e7a7924c2e97b421c</id>
    <updated>2009-07-19T17:00:32-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/07/20/c0x-compilin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Gcc has some early support for C++0x.  You can enable it with -std=c++0x (Note: You can already use Boost without enabling this flag).  Enabling this flag broke boost::filesystem for me, but this has already been reported and fixed:
boost/filesystem/operations.hpp

661	661	    inline bool is_empty( const path &#038; ph )
662	 	-      { return is_empty
( ph ); }
 	662	+      { return boost::filesystem::is_empty
( ph ); }
663	663	    inline bool is_empty( const wpath &#038; ph )
664	 	-      { return is_empty( ph ); }
 	664	+      { return boost::filesystem::is_empty( ph ); }

The full patch is much longer, but this seemed to be all I needed to get it to work (Note: You will need to su and then gedit /usr/include/boost/filesystem/operations.hpp).
Anyway, you will want to test it out:

enum A
{
  A_1,
  A_2
};
enum B
{
  B_1,
  B_2
};
void Test()
{
  B b = 0;
  b = true;
  b = 1;
  b = A_1;
  b = A::A_1;
  b = B_1;
  b = B::B_1;
}

The only lines of Test that compile are &#8220;b = B_1;&#8221; and &#8220;b = B::B_1;&#8221;.  Under C++98/C++03 this would 100% compile, which could easily create bugs where the code compiles but may not be what is intended.  We can also get slightly tighter restrictions again, by defining &#8220;enum B&#8221; as &#8220;enum class B&#8221;.  This restricts the correct lines of Test to &#8220;b = B::B_1&#8243;, meaning the enum must be fully qualified which should lead to less ambiguous code.  In a real situation you will also want to actually initialise b to a decent value initially as well: &#8220;B b = B::B_1&#8243; for example.  Anyway, this is a pretty trivial example, just a tidy up of the language really, you will want to delve deeper.  Variadic templates, Initializer lists, Lambda expressions and closures, New character types, Unicode string literals, Raw string literals and Universal character name literals look good.  Extern templates, Inheriting constructors, nullptr, __func__, C99 preprocessor, long long, Extended integral types can&#8217;t get here soon enough.  </div></summary>
  </entry>

  <entry>
    <title>temporary link for my information</title>
    <link href="http://chris.iluo.net/blog/2009/07/07/temporary-link-for-my-information/"/>
    <id>http://yoursite/article/?i=f750b732dcd66b626d99822a46c8c308</id>
    <updated>2009-07-06T16:30:28-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/07/07/temporary-li</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">http://www.brandonchecketts.com/archives/disabling-dmraid-fakeraid-on-centos-5</div></summary>
  </entry>

  <entry>
    <title>AHGotoPage Doesnt Work Argh!</title>
    <link href="http://chris.iluo.net/blog/2009/06/04/ahgotopage-doesnt-work-argh/"/>
    <id>http://yoursite/article/?i=70233f73f0462c354c68b0217adaef51</id>
    <updated>2009-06-03T06:30:23-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/06/04/ahgotopage-d</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It looks like AHGotoPage is broken with Mac OS X 10.5.7 and later (It was also broken on 10.3.9 and earlier).  Probably the easiest way around this for the moment is to open your help documentation in a web browser using LSOpenCFURLRef instead.  Hope this helps someone.</div></summary>
  </entry>

  <entry>
    <title>Upgraded Linux Kernel not recognising ex</title>
    <link href="http://chris.iluo.net/blog/2009/06/03/upgraded-linux-kernel-not-recognising-ext3-partitions-and-the-solution/"/>
    <id>http://yoursite/article/?i=5bdf30f1cf2f00dfecfef412f21d112a</id>
    <updated>2009-06-02T07:30:50-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/06/03/upgraded-lin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Unable to access resume device (/dev/dm-1)
mount: error mounting /dev/root on /sysroot as ext3: No such file or directory
Being a Linux noob, I found this solution
Create mkinitrd.new
chmod +x mkinitrd.new
su
cd /boot
sudo ./mkinitrd.new -f initrd-2.6.27.24-170.2.68.fc10.x86_64.img 2.6.27.24-170.2.68.fc10.x86_64</div></summary>
  </entry>

  <entry>
    <title>Error: glXCreateContext failed After Upd</title>
    <link href="http://chris.iluo.net/blog/2009/04/09/error-glxcreatecontext-failed-after-updating-video-drivers/"/>
    <id>http://yoursite/article/?i=243bec2b57e4cac6097d74530040e855</id>
    <updated>2009-04-09T03:30:26-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/04/09/error-glxcre</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After updating video drivers I couldn&#8217;t run 3d applications, for example glxinfo:
Error: glXCreateContext failed
The following needs to be present in the xorg.conf file:
Section "Files"
    ModulePath      "/usr/lib64/xorg/modules/extensions/nvidia"
    ModulePath      "/usr/lib64/xorg/modules"
EndSection</div></summary>
  </entry>

  <entry>
    <title>Yearly Update :)</title>
    <link href="http://chris.iluo.net/blog/2009/02/25/yearly-update/"/>
    <id>http://yoursite/article/?i=946bf44db8b644633cdf3b85a363e88c</id>
    <updated>2009-02-24T15:00:42-08:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2009/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Skysytem background, testing wireframe grid, TombRaider MD3 model, testing material boxes, particle systems, frames per second messages, pegs, shocks, all the necessary elements of a Sudoku game.
It&#8217;s been a while, I have like 20 draft entries in WordPress ranging from 1 paragraph comments up to 10 paragraph full on entries that still need that final once over and edit before going live.  Actually it might be cool if there was (There probably is) a plugin so that people could optionally go to a page on my blog where they can see everything that hasn&#8217;t been published yet, like tagged with &#8220;draft&#8221; or something and comment on which ones I should flesh out and which ones I should ditch before they are even finished.  
Anyway, so I have been working (Getting side tracked while working on) my Sudoku game.  
Basically in Sudoku mode you get to select a number from the &#8220;palette&#8221; at the top and then click on all the places you want it on the board.  The solver I have coded up can solve about 80% of Sudoku boards with &#8220;human solvable&#8221; methods and the remaining 20% can be solved with a combination of human solvable and then resorting to brute force for anything it can&#8217;t find.  A valid board should not need brute forcing which means that I need to implement more rules for my human solving methods first.  I should be doing something like this:
if (solve_human_methods()) ... solved
else &#8230; this board is invalid as it could not possibly be solved by a human without resorting to brute force
However I haven&#8217;t implemented all human methods of solving yet, only about 4 or 5 simple ones, actually probably less, there are about 2 or 3 real rules and then 4 or 5 extrapolated rules that are just combinations of the first ones.
Anyway, in First Person mode there is flying around (No clip mode) as well as moving Lara Croft around (Optionally other MD3 models) with sort of appropriate animations based on velocity (But not facing direction yet).  One thing I have noticed is that half of the MD3 models I download have different file naming conventions, so at some stage I want to break out some Quake 3 action and see what file names it uses and use that as my standard.
Why all this other stuff in a Sudoku game?  Whichever game I am working at the time becomes my test bed application for whatever I feel like implementing when bored.  I really need to make a dedicated test bed that does nothing else but demonstrate stuff.  I&#8217;ve also split my game engine into Spitfire and Breathe portions, which splits the library into two halves, the generic tools for any application (string, math, xml, md5 hashes etc.) and game specific features (OpenGL rendering, audio, physics, MD3 animation, etc.) respectively.</div></summary>
  </entry>

  <entry>
    <title>x86_64 Linux C/C++ Test</title>
    <link href="http://chris.iluo.net/blog/2008/12/15/x86_64-linux-c-slash-c-plus-plus-test/"/>
    <id>http://yoursite/article/?i=d01a964e88095ad06282333baa63ca69</id>
    <updated>2009-01-24T22:00:30-08:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2008/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I use:
gcc
cmake
KDevelop
RapidSVN
Meld
However, don&#8217;t go the websites, all of these are available in the (Default?) repositories, so you can either install them via yum or PackageKit.  Also note: RapidSVN and Meld are only needed if you want to use SVN.  Even KDevelop is not required if you have another text editor that you prefer such as gedit/vi/emacs.  If you want to create your provide your own make file then you don&#8217;t need cmake either.  
Anyway, so a simple application that just tests that you can do a 64 bit compile is pretty straight forward.
1) Create your main.cpp file with a int main(int argc, char* argv[]); in it.

# Set the minimum cmake version
cmake_minimum_required (VERSION 2.6)
# Set the project name
project (size_test)
# Add executable called "size_test" that is built from the source file
# "main.cpp". The extensions are automatically found.
add_executable (size_test main.cpp)

2) Create a CMakeLists.txt that includes your main.cpp.
#include &lt;iostream&gt;
int main(int argc, char* argv[])
{
  int *int_ptr;
  void *void_ptr;
  int (*funct_ptr)(void);
  std::cout&lt;&lt;&#8221;sizeof(char):        &#8220;&lt;&lt;sizeof(char)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(short):       &#8220;&lt;&lt;sizeof(short)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(int):         &#8220;&lt;&lt;sizeof(int)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(long):        &#8220;&lt;&lt;sizeof(long)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(long long):   &#8220;&lt;&lt;sizeof(long long)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(float):       &#8220;&lt;&lt;sizeof(float)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(double):      &#8220;&lt;&lt;sizeof(double)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(long double): &#8220;&lt;&lt;sizeof(long double)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(*int):        &#8220;&lt;&lt;sizeof(int_ptr)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(*void):       &#8220;&lt;&lt;sizeof(void_ptr)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;sizeof(*function):   &#8220;&lt;&lt;sizeof(funct_ptr)&lt;&lt;&#8221; bytes&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;&lt;&lt;std::endl;
  std::cout&lt;&lt;&#8221;Architecture:        &#8220;&lt;&lt;sizeof(void_ptr)&lt;&lt;&#8221; bit&#8221;&lt;&lt;std::endl;
  return 0;
}

3) cd to the directory of your CMakeLists.txt and run &#8220;cmake .&#8221; and then &#8220;make&#8221;
4) ./size_test output:

sizeof(char):        1 bytes
sizeof(short):       2 bytes
sizeof(int):         4 bytes
sizeof(long):        8 bytes
sizeof(long long):   8 bytes
------------------------------
sizeof(float):       4 bytes
sizeof(double):      8 bytes
sizeof(long double): 16 bytes
------------------------------
sizeof(*int):        8 bytes
sizeof(*void):       8 bytes
sizeof(*function):   8 bytes
------------------------------
Architecture:        64 bit

As you can see this is specific to x86_64.  The beauty of gcc is that by default it compiles to the architecture it is being run on.  I had previously thought that it would be a world of pain, making sure that my compiler built the right executable code and linked in the correct libaries.  I know this project doesn&#8217;t use any special libraries, but (because of cmake?) the process is exactly the same as using cmake under 32 bit to make 32 bit executables.  You just make sure that they are there using Find*.cmake and then add them to the link step:

SET(LIBRARIES
  ALUT
  OpenAL
  GLU
  SDL
  SDL_image
  SDL_net
  SDL_ttf
)
# Some of the libraries have different names than their Find*.cmake name
SET(LIBRARIES_LINKED
  alut
  openal
  GLU
  SDL
  SDL_image
  SDL_net
  SDL_ttf
)
FOREACH(LIBRARY_FILE ${LIBRARIES})
  Find_Package(${LIBRARY_FILE} REQUIRED)
ENDFOREACH(LIBRARY_FILE)
# Link our libraries into our executable
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIBRARIES_LINKED})

Note that we don&#8217;t actually have to specify the architecture for each package or even the whole executable.  This is taken care of by cmake.  Anyway, it is not some mysterious black magic, it is exactly the same as you&#8217;ve always been doing.  Cross compiling is slightly different, but basically you would just specify -m32 and make sure that you link against the 32 bit libraries instead.  If I actually bother creating another 32 bit executable in my life I&#8217;ll make sure that I document right here exactly how to do a cross compile from 64 bit.</div></summary>
  </entry>

  <entry>
    <title>Linux x86_64</title>
    <link href="http://chris.iluo.net/blog/2008/12/13/linux_x86_64/"/>
    <id>http://yoursite/article/?i=ea16b41adfc359c15289df4b86f5edfc</id>
    <updated>2008-12-12T20:30:18-08:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2008/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I have been dipping my toe into x86_64 waters sporadically over the last couple of years.  On each of the previous occasions it always seemed to immature, packages were way to hard to come by (I prefer precompiled binaries), half my hardware didn&#8217;t work, strange crashes etc.  Seeing as this episode has been 100% successful, I thought this time I would document it.
My favourite distribution is Fedora due to it&#8217;s rapid development and ease of use.  I downloaded via BitTorrent.  (Obviously) make sure you get the x86_64 version.  I always like to run the sha checksum to rule out that as the problem if something does arise later.  I also make sure that my DVD verifies in my burning program after it has been burnt.  
Now we are ready to install.  Unless you have something really exotic you should not need any special drivers or anything (At least not until after the install), it should just work.  The important parts of my hardware are:
Asus A8V-E SE (Not awesome, my awesome motherboard blew up causing me to downgrade to this one I had lying around) AMD Socket 939
AMD Athlon 64 X2 4800+ CPU
nVidia GeForce 8600 GT 256MB PCIe
I use the onboard LAN and sound card, as well as 2 SATA drives, an IDE drive and an IDE CDROM.
So I installed Fedora from the DVD.  You can again choose to verify the media, weirdly (And in previous versions as well) this check always seems to fail even though the sha check and burning software verification succeed, so either the check is broken or the motherboard/drive is broken.  I have never seen this verification succeed in my life.  Anyway, I skip it now and the options I select (At appropriate times) are fresh install onto a blank drive, &#8220;Software Development&#8221; profile/packages (You can probably turn off the other profiles, you can install any required packages individually later on when you are in the OS anyway).  Next time I do an install I would love to try an upgrade install.  
That should all install (You don&#8217;t have to get too serious about selecting the right packages right now, I find it easier to install &#8220;generally&#8221; what I need (&#8221;Software Development&#8221;) and then customise later) and you should now be logging into a fresh install of Fedora 10.  
Initially I had some problems with an additional PCI sound card I had present due out of habit because I had never gotten my on board sound to work for any motherboard under Linux.  Some programs were using the onboard and some where then using the PCI one, so I rebooted and went into the bios to disable the onboard one.  Both still get detected.  Apparently this is a common problem with this motherboard.  I went to update the bios and wouldn&#8217;t you believe it, the bios updater is Windows only.  Anyway, because the onboard sound card was being detected I just removed the PCI one and enabled the onboard one again.  That fixed it up awesomely and I had audio, yay.  
Add the Livna repo by downloading and running the add repo rpm, it is not linked to on the main page, but the url can be built from the other releases.
For my information:
RPMFusion provides additional packages that are not in the base Fedora repos.
Livna provides the same packages as RPMFusion, but also provides the libdvdcss package for watching DVDs.
I have never had much luck with ATI drivers for Linux.  I had heard the nVidia ones were easier to install and configure and apparently faster to boot.  Before you install drivers, you might want to get a benchmark of your FPS in glxgears before installation:
glxgears
I downloaded and installed the nVidia (Binary, proprietary) driver:
sudo yum install kmod-nvidia
Now reboot (It&#8217;s the easiest way to restart X).  Test that hardware accelerate rendering is happening by looking for in the output of this command:
glxinfo | grep direct
And your glxgears FPS should be above 2000:
glxgears
Adobe recently released an x86_64 Linux version of Flash so we don&#8217;t have to mess around with nswrapper etc. any more.  I downloaded it from here, extracted, su, cp ./libflashplayer.so /usr/lib64/mozilla/plugins, restarted Firefox.  You may want to test it also.
For my benefit for next time, I also like:
Neverball and Neverputt
VDrift
Torcs
Nexuiz
Open Arena
Urban Terror
XMoto
Transmission
Thunderbird
Rhythmbox
VLC
K3B
Wine
CMake
KDevelop
I have not provided any links to these as they are all present in PackageKit which comes with Fedora 10.
Also for my information:
Open links in Firefox in the background
Type about:config into the address bar in Firefox, then look for the line browser.tabs.loadDivertedInBackground and set it  to true.
Automatic Login
su gedit /etc/gdm/custom.conf
And adding this text:
[daemon]
# http://live.gnome.org/GDM/2.22/Configuration
TimedLoginEnable=true
TimedLogin=yourusername
TimedLoginDelay=30
NTFS Drives
Gnome automatically finds and mounts NTFS drives/partitions, however in Fedora 9 and later, ownership is now broken.  Each partition (And every sub folder and file) seems to default to ownership so even though some operations work such as moving files around, even adding and deleting, some programs will complain (I found this problem through RapidSVN not working).  Nautilus reports that you are not the owner and even if you run Nautilus as root you cannot change to owner to anything other than root.  The way I solved this was to install ntfs-config and run with:
sudo ntfs-config
You should now have valid entries in /etc/fstab:
sudo cp /etc/fstab /etc/fstab.bak
gksudo gedit /etc/fstab
Something like this (One for each partition, the ones you are interested in are any with ntfs-3g):
UUID=A2D4DF1DD4DEF291	/media/DUMP	ntfs-3g	defaults,nosuid,nodev,locale=en_AU.UTF-8	0	0
I then edited each ntfs-3g line like so:
UUID=A2D4DF1DD4DEF291	/media/DUMP	ntfs-3g	defaults,rw,user,uid=500,gid=500,umask=0022,nosuid,nodev,locale=en_AU.UTF-8	0	0
Where uid=youruserid and gid=yourgroupid.  You can find these out via System->Administration->Users and Groups (There is probably a command to find this out, actually I would say there is definitely a command for finding this out, but I&#8217;m pretty lazy).  If you log in with different users perhaps changing to a common group would be better?  Reboot to let these settings take effect.  If you now to view your partition in Nautilus, File->Properties->Permissions should now list you as the owner with your group.  
You now have a pretty well set up Fedora 10 installation.  These steps should be pretty similar for future versions.  I will probably refer back these when I install Fedora 11 or 12 in a year or two.  I love Fedora because it is the total opposite of Windows.  With Vista, Microsoft stagnated, waiting a year or two longer than they should have to release a product that by that time was out of touch with the target audience.  In contrast, I had been planning to install Fedora 9 this time around after installing 8 only 6-12 months ago, but I was pleasantly surprised to find that 10 had been released.  I would also like to try Ubuntu as I haven&#8217;t really used it much apart from at work, so I might give that a shot next time.  x86_64 has certainly matured over the last 2 or 3 years, I would say it is definitely production server ready and probably has been for at least a year.  The quality and variety of packages available for Linux is amazing, the community just keeps on giving.  Fedora just keeps on amazing me.  The future is bright, I can&#8217;t wait.</div></summary>
  </entry>

  <entry>
    <title>Covers!</title>
    <link href="http://chris.iluo.net/blog/2008/11/23/covers/"/>
    <id>http://yoursite/article/?i=e011eae843a657a04bdc149864744494</id>
    <updated>2008-11-22T19:30:27-08:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2008/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Last night we went to The Pheonix (Where I met Christina almost 3 years ago!) and they had The Ellis Collective playing with two other bands.  The girl on the violin was the highlight, reminding Sam and I of Fourplay.  It would have been good if there were more violin solos, also the songs on their site just don&#8217;t do the violin justice.
I heart covers.  No wait, I heart covers more than everyone in the world put together.  YouTube is awesome for finding covers, it can be quite patchy, but basically everyone votes down the worst ones so you only view the gold.
Kina Grannis
Johnny from Australia.
Johnny sings Exit Music (from a Film) by Radiohead (And he does drums as well, awesome (Well not at the same time, but still awesome)).
Kina sings 1234 by Fiest
Johnny sings Waltz #2 by Elliot Smith
Kina sings New Soul by Yael Naïm
Johnny sings Mad World by Gary Jules 
Johnny sings Karma Police by Radiohead
Kina sings Hallelujah by Leonard Cohen
Johnny sings Hallelujah by Leonard Cohen
No one is as awesome as Hallelujah Jesus himself though.
I also heart mashups.
Jack Conte specialises in both covering and mashing up songs, some of them are downloadable at.
Jack Conte - Radiohead/Chopin mashup/cover
Jack Conte - Gorillaz - Feel Good Inc. cover watch this if only for the ending hilarious.
Jack Conte - Aphex Twin/Bright Eyes mashup/cover
This wouldn&#8217;t be a blog entry by Chris if it didn&#8217;t include:
Johnny sings *cough* Britney *cough*
Yael Naïm New Soul and Toxic</div></summary>
  </entry>

  <entry>
    <title>const int vs. enum vs. #define</title>
    <link href="http://chris.iluo.net/blog/2008/11/01/const-int-vs-enum-vs-define/"/>
    <id>http://yoursite/article/?i=a2ec643e2dfdf18212514c25a0dec82f</id>
    <updated>2008-10-31T21:30:20-07:00</updated>
    <author>
      <name>http://chris.iluo.net/blog/2008/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Example A:

int GetValue0() 
{ 
  return 10; 
} 
int GetValue1() 
{ 
  return 10 + 10; 
} 
int GetValue2() 
{ 
  return 10 * 10; 
}

So if all of the values 10 represent a common magic number then you are going to want to extract that value to one location instead of the 5 that it is in at the moment.  How do we do this?
Say we call the value MAGIC_NUMBER (Of course, in a real life situation you would use a better name than this, wouldn&#8217;t you?  Something like PI, GST_PERCENTAGE, NUMBER_OF_CLIENTS, etc.) we would then have this code.
Example B:

int GetValue0() 
{ 
  return MAGIC_NUMBER; 
} 
  int GetValue1() 
{ 
  return MAGIC_NUMBER + MAGIC_NUMBER; 
} 
  int GetValue2() 
{ 
  return MAGIC_NUMBER * MAGIC_NUMBER; 
}

Great.  The problem now is, how do we tell our program about MAGIC_NUMBER?  
If you originally started programming C then your first instinct may be to use:

#define MAGIC_NUMBER 10

The main problem here is that the compiler may not realise that all of the places you use MAGIC_NUMBER are linked so it may not realise that it can factor it out.  The other problem with this method is the lack of type safety.  You can use MAGIC_NUMBER with sign/unsigned ints, char, bool etc.  The compiler may not warn you about converting between these types.  For an int this isn&#8217;t really a problem, but const float PI = 3.14&#8230;f should give you a warning when you try to initialise an int to it.  This is good news as it requires you to cast if you really want to do it, which then shows other programmers than you have actually thought about what you are doing and what is happening to the value as it passes through each variable.  
You might be tempted to use:

int MAGIC_NUMBER = 10;

This is much better as it adds type safety, however you can do even better than that,

const int MAGIC_NUMBER = 10;

This way it isn&#8217;t &#8220;just&#8221; a global variable, when you declare it as const you are telling the compiler that it will never change in value which means that it can make all sorts of assumptions about how it will be used.  Your compiler may or may not factor out/in this value, it may or may not insert 10 + 10 and 10 * 10 into those functions for you at compile time.  Using a const int means that the compiler gets the choice of using either the value directly or using a variable containing that value, and I trust the compiler more than myself to make that decision.  Because it knows the value of MAGIC_NUMBER at compile time and knows that it will never change at runtime it can actually do the calculation and insert that value instead.  

int GetValue0() 
{ 
  return 10; 
} 
int GetValue1() 
{ 
  return 20; 
} 
int GetValue2() 
{ 
  return 100; 
}

The other magic number container is enum.  It varies slightly to const int as it is more for collections of values where you want to identify something by what type it is.

enum RESULT 
{ 
  RESULT_FILE_DOWNLOADED, 
  RESULT_CONNECTION_FAILED, 
  RESULT_FILE_NOT_FOUND, 
  RESULT_DISCONNECTED 
}; 
RESULT DownloadFile(const std::string&#038; url) 
{
  // Pseudocode
  if (could not connect) return RESULT_CONNECTION_FAILED; 
  if (file not found) return RESULT_FILE_NOT_FOUND; 
  if (disconnected) return RESULT_DICONNECTED; 
  return RESULT_FILE_DOWNLOADED, 
} 

In this way we can get rid of magic numbers and (In C++0x at least with enum class) get some type safety, your compiler will hopefully complain if you try and return an integer instead of a RESULT.</div></summary>
  </entry>

  <entry>
    <title>Welcome</title>
    <link href="http://chris.iluo.net/blog/2007/11/23/welcome/"/>
    <id>http://yoursite/article/?i=0a9c3262687c62ee8445e955f50c6a2f</id>
    <updated>2008-10-31T14:55:00-07:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hullo!  If you are reading this I have now moved from LiveJournal to my self hosted WordPress blog.  I am aiming to post at least one article per month, hardly a challenge, but hopefully I can sustain at least this poor effort.</div></summary>
  </entry>

  <entry>
    <title>Call of Duty 4 AI and difficulty levels</title>
    <link href="http://chris.iluo.net/blog/2007/12/17/call-of-duty-4-ai-and-difficulty-levels/"/>
    <id>http://yoursite/article/?i=327de5a82e98b591a128bcc76679c11e</id>
    <updated>2008-10-31T14:55:00-07:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I started and finished Call of Duty 4 yesterday.  Basically it is war themed FPS that tries to capture the feeling of helplessness of being in a war.  The standard method for creating each level in a game like this (Quake 1) is to create the &#8220;map&#8221; that the player will run around in and then manually add a series of points (Spawn points) in the map that represent each bad guy.  So if you add 20 points, you will have 20 bad guys.  Another method is to specify 100 spawn points and then spawn 20 bad guys at 20 of those points, which mixes it up a little bit so that the game is less predictable.  In earlier games like Quake 1 and Wolfenstein, these bad guys have a problem where they just sit on their starting position until they saw the player, at which point they would basically run straight at the player shooting, pretty simple stuff.  
Call of Duty differs slightly from other games:
a) I think there are actually fewer spawn points than in a conventional game, however,
b) There is not a 1 to 1 mapping of bad guys to spawn points, bad guys constantly stream out of these spawn points.
c) These spawn points are placed slightly off the player accessible part of the map, and then the enemies jump over walls, emerge from doors and alleyways, helicopter and rapel in, etc.  
There are also the usual predictable, &#8220;There&#8217;ll be a guy behind the door here, a guy will run through now&#8221;, but it&#8217;s much less noticable.  Each spawn just continuously spawns bad guys until you either get to a certain pointon the map at which point the next spawn point will start spawning, or a time constrain runs out (&#8221;Defend this point for 2 minutes&#8221;).  
All of the Call of Duty games (And most FPS games in general) have a configurable difficulty system consisting of something like &#8220;Easy&#8221;, &#8220;Medium&#8221;, &#8220;Hard&#8221;, &#8220;Insane&#8221;.  The problem is that it is usually set for the whole game so you choose medium and go to the first level which introduces you to the game, then the levels get progressively harder, now the problem is that the first level isn&#8217;t a real representation of the difficulty.  By the middle of the game it can feel way to hard or way to easy.  Grand Theft Auto solves this problem by having every player play the same difficulty and then the missions get progressively harder until I give up and don&#8217;t finish the game, so that solution isn&#8217;t without its problems.  It would be much better if every game were Grand Theft Auto style, but were the game adapted to how good the player was.  Some games are already similar to this, but instead of lowering/raising the difficulty of the enemies they give you more or less health and ammunition.  However it could be possible to exploit this method by playing badly until the last level and then easily beat the last few levels and completing the game.  The other problem is how to differentiate between a good and bad player.  Each player would have a few areas where they are judged, such as health at the end of each level, health lost per enemy encountered (A ratio something like 15% health lost per enemy killed), speed through the level, accuracy with each weapon/speed.  You could even add other things such as exploration of the level, stealth and variety of weapons/styles.  
It&#8217;s hard to tell the difference between whether a player is going slow because they aren&#8217;t competent enough or if they are just taking their time and being methodical for example.  The other problem is how do tell the player&#8217;s speed through the game?  The easiest (And roughest) way is to get their total time through the level from entry to exit.  You could also have points along the typical player&#8217;s route and time the player between them, or find the average time between the player seeing each enemy and killing them, or the total kills divided by the total level time.  You could even have an experienced player play through the game, then a less experienced player, recording both their play and then scaling the difficulty based on which one the player is playing most like.  
Another interesting method would be to identify a few main playing styles such as bunnyhopping, rushing, camping.  You could then spawn more or less enemies and at different distances from the player to force the player into the mode you want them to be in.  For example if they are rushing, spawn more enemies behind the player or above the player to force them to take their time and look around a bit more.  If the player is taking too much time and sniping too much, spawn some enemies just around the corner who will rush the player and force her to switch to a short range weapon.  
The first mission of Call of Duty 4 is the unskippable training mission for people who have never played an FPS before.  &#8220;Here&#8217;s a gun, here&#8217;s a target, here&#8217;s a grenade, etc.&#8221;.  It takes about 10 minutes and should be skippable considering that almost everyone who plays will have played an FPS previously and a lot of them would have actually played previous Call of Duty games.  It is a prime candidate for starting with a message box that says &#8220;Do you want to try a training mission before you get stuck in?&#8221;.  Another option would be to have everyone go straight to the first real mission and either start real slow, with a run through the woods or something with lots of running and one enemy every minute and then gradually introducing the player to other weapons and skills (&#8221;Here&#8217;s a grenade, throw it with this button&#8230;&#8221;, &#8220;Crouch behind this wall so that the guard can&#8217;t see you&#8221;).  
Anyway, it&#8217;s a good game, but doesn&#8217;t really do anything the previous versions didn&#8217;t do.  The highlight for me was running around in Ghillie hiding awesomely.  It would have been better if there were a lot more Ghillie suit missions.  Being the gunner for the DC aircraft was fun too but went on way too long.</div></summary>
  </entry>

  <entry>
    <title>Crank very early testing of heightmap an</title>
    <link href="http://chris.iluo.net/blog/2008/02/02/crank-very-early-testing-of-heightmap-and-basic-physics/"/>
    <id>http://yoursite/article/?i=d5a71006a7762fd11cecc6c45c163157</id>
    <updated>2008-10-31T14:55:00-07:00</updated>
    <author>
      <name>f06514bd6ac87f9d2c79deb9cc80dae9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"> 
This is what I have been working on in my spare time.  I think it is going alright.  I still have to do:
The brakes can&#8217;t be locked up at the moment, they always give a little so you can&#8217;t for example lean on the front wheel and hold the brakes and expect to stay in the same place.
Create the level editor, at the moment the level is just a bunch of sin waves added together.
Add a little bit of parallax scrolling to add a bit of interest and depth.
Create better artwork for example shocks and rider.
Add dynamic bike bits such as suspension that compresses and a rider that leans forwards and backwards and has a weight (At the moment I fake weight transfer by just rotating the bike).  
Library source
Game source</div></summary>
  </entry>

  <entry>
    <title>Hello world!</title>
    <link href="http://giantbucket.wordpress.com/2009/02/03/hello-world/"/>
    <id>http://yoursite/article/?i=6d2980b853bb5197e7718834aea37103</id>
    <updated>2009-10-26T15:01:10-07:00</updated>
    <author>
      <name>http://giantbucket.wordpress.com/2009/02/03/hello-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;ve decided to keep the default first post title as this will be a programming blog and hello world is a very programmery thing to say. I plan to post about interesting programming things which will mostly be about my personal project LiquidEngine.
I&#8217;m still trying to figure out how to describe LE, but my latest attempt is this: An OpenGL powered object-orientated software UI tool. If this is a little vague or confusing, you could have a look for yourself at my ISP webspace. Comments/suggestions are welcome on my youtube videos (where silly or obnoxious comments are totally acceptable), or here (where silly or obnoxious comments are still accepted, but may look out of place).
       </div></summary>
  </entry>

  <entry>
    <title>Fucking Hot</title>
    <link href="http://giantbucket.wordpress.com/2009/02/06/fucking-hot/"/>
    <id>http://yoursite/article/?i=58b307fa006d93634e86703c7373b7a6</id>
    <updated>2009-10-26T15:01:09-07:00</updated>
    <author>
      <name>http://giantbucket.wordpress.com/2009/02/06/fuckin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yes, people talk about the weather when they have nothing else to talk about, and this is the case at the moment. I cannot program because it is too damn hot to think properly. I&#8217;m in Canberra and temperatures are reaching record highs, and me and my computer are mostly naked. I&#8217;ve been staring at this unprojection code for a while, I&#8217;m really just guessing until it works. I&#8217;ve borrowed (ok, stolen) Ogre&#8217;s wonderful Vector and Matrix classes to assist me here, and this is what I have so far:
 Vector4 CursorPos((float) pWindow-&gt;Mouse.X / (float) pWindow-&gt;GetWidth(),
(float) pWindow-&gt;Mouse.Y / (float) pWindow-&gt;GetHeight(),
-Camera.Pos.z,
0.f);
CursorPos = Matrix4::CLIPSPACE2DTOIMAGESPACE.inverse() * CursorPos;
CursorPos = ProjectionMatrix.inverse() * CursorPos;
CursorPos = ModelviewMatrix.inverse() * CursorPos;
See, I make a Vector4 out of the window coords (fourth component for homogenous coordinate system), and some kind of z value. I then translate that into clipspace with Ogre&#8217;s handy matrix. Then I multiply it with the inverse of the Projection matrix, then the inverse of the modelview matrix. I should now have usable coordinates.
But I don&#8217;t, because I don&#8217;t know what I&#8217;m doing. What z value do i pass? Am I multiplying the matricies right (this is the only way it seems to work), should both the projection and modelview matricies be inversed like that? And I haven&#8217;t even got to projecting this coordinate onto the UI plane. What a perilous journey the cursor&#8217;s coordinates must take&#8230;
The heat isn&#8217;t helping much; I&#8217;m considering asking the folks at GameDev.net to point me in the right direction.
       </div></summary>
  </entry>

  <entry>
    <title>Writing a profiler</title>
    <link href="http://giantbucket.wordpress.com/2009/02/03/writing-a-profiler/"/>
    <id>http://yoursite/article/?i=c210e6b3094b034e5ad040d32beda970</id>
    <updated>2009-10-26T15:01:09-07:00</updated>
    <author>
      <name>http://giantbucket.wordpress.com/2009/02/03/writin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Lately I&#8217;ve been writing a profiler into LiquidEngine. You see, performance in LE is crap, and until now I had no idea why. The reason: getting the 3d cursor position by getting depth info from the framebuffer and unprojecting. Pulling pixels from the framebuffer with OpenGL seems to be insanely slow. I&#8217;m only doing it once per frame, and it&#8217;s taking up most of the time.
But! How do I know this? Because of awesome profiler as previously mentioned. How does it work? Well it&#8217;s not the most amazing solution, in fact it&#8217;s probably a very unoriginal approach, but it&#8217;s fun to work on. I&#8217;m using timer objects (which time from when they are constructed to when they are destructed). The timing is done with QueryPerformanceCounter(), which has it&#8217;s share of issues (including being windows specific). It&#8217;s good enough for my purposes though.
I&#8217;m using a macro which uses the wonders of static to fetch an ID for the string tag you pass, which is then used to construct the timer object on every subsequent call. My macro looks like this:
#define LE_SCOPE_TIMER(Tag)	static int ScopeTimerID = mProfilerData.GetIDForTag(string("&lt;") + string(__FUNCTION__) + string("&gt; ") + Tag); ScopeTimer mScopeTimer(ScopeTimerID);
So you&#8217;d put the macro at the start of every function, or every code block, that you want to profile. This is a tad inconvenient, but hey, it&#8217;s the best I can do.
It uses the (also windows dependent) __FUNCTION__ macro in addition to the tag you pass. All the profiling data is sent to mProfilerData, a global instance. The call stack can be worked out by keeping a pointer to the last created timer.
This is all fairly boring, but things get much more interesting when I go to visualize the data. I&#8217;ve got OpenGL to pull off whatever crazy shit I want. Here&#8217;s what I&#8217;ve come up with so far:
Some profiler data visualized using LiquidEngine
The big red block is my bottleneck, where I&#8217;m getting my cursor position. Hooray for the profiler, for finding the stupid problem with style. So, what do all the colors mean? well the top graph is the functions call&#8217;s times, and the graph below that is the proportions of time taken by functions called within this function. Those child timers are listed and color-coded on the left, with the green buttons spawning a profiler data entry viewers for them. I spawned one of the children out and moved it below the first entry hence the second set of graphs.
Anyway I&#8217;m still working on it, it&#8217;s so damned fun&#8230;
       </div></summary>
  </entry>

  <entry>
    <title>Unprojecting the cursor</title>
    <link href="http://giantbucket.wordpress.com/2009/02/10/unprojecting-the-cursor/"/>
    <id>http://yoursite/article/?i=b5b01090111a2dfb21de2dec9ffc3903</id>
    <updated>2009-10-26T15:01:09-07:00</updated>
    <author>
      <name>http://giantbucket.wordpress.com/2009/02/10/unproj</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">LiquidEngine&#39;s Cursor
I&#8217;ve finally converted my unprojecting code to a more efficent method. It took alot of screwing around and I&#8217;m quite glad to blog the solution. But first, how was I doing it before?
Well, the objective is to translate the cursor coordinates 0nto the XY plane in 3D. We then have 2d coordinates relative to the work plane, and can render a cursor there with a scale based on the distance to the camera (so the cursor always appears the same size on the screen).
GLUT provides the very usefull gluUnProject function. When given the cursor coords, the projection matrix, the modelview matrix and the depth of the pixel below the cursor, will ouput translated 3D coordinates. The matricies are easy to get, but how do you get the depth? My (somewhat dodgey) solution was to draw a quad on the XY plane that covers the screen. I can then use the glReadPixels function to get the depth of the work plane under the cursor.
Anyway that&#8217;s a fairly convoluted way to get the depth value, surely there&#8217;s a way to directly calculate it?&#160;&#160;&#160;&#160; Yes, yes there is.
The new way to do it is this: Unproject the cursor position with a depth value of 0 (near clip plane) and 1 (far clip plane). We can then calculate the intersection point between the line these two points make and the XY plane. So those two positions can be computed with gluUnPoject, but what about the intersection? Heres the code:
bool LineXYPlaneIntersect3D(Vector3&amp; LinePoint1, Vector3&amp; LinePoint2, vect2d&amp; retIntersectPoint)
{
//Is the line parallel to axis?
if(LinePoint1.z == LinePoint2.z)
return false;
vect2d LinePoint12d(LinePoint1.x, LinePoint1.y);
vect2d LinePoint22d(LinePoint2.x, LinePoint2.y);
retIntersectPoint = LinePoint12d + (LinePoint22d &#8211; LinePoint12d) * (-LinePoint1.z / (LinePoint2.z &#8211; LinePoint1.z));
return true;
}
So there you have it. Or is it? What if we want to do the unprojecting ourselves? Well with quite a bit of screwing around (and Ogre&#8217;s matrix and vector classes), this is how you do it:
Get the normalized device coordinates from the cursor&#8217;s window coordinates. Device coordinates are in the range -1.0 to 1.0 for the x, y, and z axis. So,
float DeviceCoordX = ((WindowCoordX / WindowWidth) * 2.f) - 1.f;
float DeviceCoordY = (((WindowHeight &#8211; WindowCoordY) / WindowHeight) * 2.f) &#8211; 1.f; //Window coord Y goes from the top, needs to be reversed
float DeviceCoordZNear = -1.f;
float DeviceCoordZFar = 1.f;
We then put those coordinates into Vector4s (thanks Ogre). We need the fourth component for homogeonous coordinates (make this 1.f). We multiply this with the projection matrix, like this:
CursorPosNear = ProjectionMatrix * CursorPosNear;
CursorPosFar = ProjectionMatrix * CursorPosFar;
Order of operation look weird? Well I think so, but I&#8217;m a math noob. Now it&#8217;s time to multiply the x, y, and z components of the Vector4s with their w component. Like this:
CursorPosNear.x *= CursorPosNear.w;
CursorPosNear.y *= CursorPosNear.w;
CursorPosNear.z *= CursorPosNear.w;
CursorPosNear.w = 0.f;
//And the far pos as well&#8230;
Now we can multiply the vectors with the modelview matrix, but I ran into trouble here. I ended up pulling the rotation and translation out of the matrix and appling them directly to the vectors. But either way, it works fine. I guess I&#8217;ll update this post as my solution becomes better.
       </div></summary>
  </entry>

  <entry>
    <title>Drawing cirlcles with shaders</title>
    <link href="http://giantbucket.wordpress.com/2009/02/15/drawing-cirlcles-with-shaders/"/>
    <id>http://yoursite/article/?i=d05ead7102ea847ce4612dcd8d332728</id>
    <updated>2009-10-26T15:01:09-07:00</updated>
    <author>
      <name>http://giantbucket.wordpress.com/2009/02/15/drawin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In one of my recent (but misguided) attempts to improve efficiency, I&#8217;ve improved my circle rendering to take advantage of the wonders of shaders. Previously, I&#8217;ve rendered circles with a triangle fan with about 20 or so segments. I could make that number dynamic and have them adaptively subdivide based on the distance to the camera, but you have to think, why are we trying to draw curved shapes with triangles anyway?
Queue the shader. Here&#8217;s the solution: render a quad with texture coordinates (-1, -1 for top left corner, 1, 1 for bottom right etc.) and make a shader that uses those coordinates to calculate the distance the pixel is from the center of the quad, drawing an alpha of zero when it is outside the radius of the circle.
Here&#8217;s the shader code:
void main()
{
	if((gl_TexCoord[1][0] * gl_TexCoord[1][0]) + (gl_TexCoord[1][1] * gl_TexCoord[1][1]) &lt; 1.0)
		gl_FragColor = gl_Color;
	else
		gl_FragColor[3] = 0.0;
}
It&#8217;s fairly simple: if the squared distance from texture coords 0, 0 is below the squared distance to the edge of the quad (1.0*1.0 = 1.0) then draw the usual color, otherwise set the alpha to zero. You use the squared distance to avoid an expensive square root operation. To adjust the radius of the circle, just adjust the size of the quad.
What if we want just the outline of a circle (or an inner radius)?
uniform float InnerRadiusSquared;
void main()
{
	float v = (gl_TexCoord[1][0] * gl_TexCoord[1][0]) + (gl_TexCoord[1][1] * gl_TexCoord[1][1]);
	if((v  InnerRadiusSquared))
		gl_FragColor = gl_Color;
	else
		gl_FragColor[3] = 0.0;
}
Now we can use the uniform InnerRadiusSquared to set the inner radius. It&#8217;ll need to be the ratio of the inner radius to the outer radius (InnerRadius / OuterRadius) squared (again for performance). Awesome. But what if we want it textured? The texture coordinates are being messed with, it wouldn&#8217;t appear correctly? Notice that we&#8217;re using texture unit 1 (not 0) e.g. gl_TexCoord[1][]. So when drawing the quad we need to specify the texture unit we are passing the coords on is unit 1. We can pass normal texture coordinates for our texture on unit 0. So the quad drawing code would be:
//Bind you shader here
glBegin(GL_TRIANGLE_FAN);
glMultiTexCoord2i(GL_TEXTURE0, 0, 1);    //For the texture
glMultiTexCoord2i(GL_TEXTURE1, -1,  1);  //For the shader
glVertex2f(-2.f, 2.f); //Radius of 2
glMultiTexCoord2i(GL_TEXTURE0, 1, 1);
glMultiTexCoord2i(GL_TEXTURE1, 1,  1);
glVertex2f(2.f, 2.f);
glMultiTexCoord2i(GL_TEXTURE0, 1, 0);
glMultiTexCoord2i(GL_TEXTURE1, 1,  -1);
glVertex2f(2.f, -2.f);
glMultiTexCoord2i(GL_TEXTURE0, 0, 0);
glMultiTexCoord2i(GL_TEXTURE1, -1,  -1);
glVertex2f(-2.f, -2.f);
glEnd();
And the shader:
uniform sampler2D tex; //Automatically set to texture unit 0
void main()
{
	if((gl_TexCoord[1][0] * gl_TexCoord[1][0]) + (gl_TexCoord[1][1] * gl_TexCoord[1][1]) &lt; 1.0)
		gl_FragColor = texture2D(tex, gl_TexCoord[0].st);
	else
		gl_FragColor[3] = 0.0;
}
I haven&#8217;t covered the vertex shader, here it is:
void main()
{
	gl_Position = ftransform();
	gl_TexCoord[0] = gl_MultiTexCoord0;
	gl_TexCoord[1] = gl_MultiTexCoord1;
	gl_FrontColor = gl_Color;
}
It just passes the values through, nothing special. Anyway, you could add the inner radius code to this and have a textured, outlined circle with only two triangles. Yay! So how does it perform? I&#8217;d imagine much better, depending on the number of segments you would be using otherwise. LiquidEngine seems to be CPU bound at the moment, and it only made 2-3 frames difference (with about 200-300 circles). I&#8217;m sure this will pay off in the end though, when the CPU side is optimized more. Obviously you can optimize further by batching many circles together into VBOs etc. rather than using the horribly slow quad drawing code here.
One major issue though is anti-aliasing. I don&#8217;t think multisampling takes extra samples into surfaces covered by shaders (at least not by default). So either this feature must be somehow turned on, or the shader must anti-alias the circle edge. I&#8217;m not really sure at this point, but I&#8217;ll hopefully post a solution someway down the track.
       </div></summary>
  </entry>

  <entry>
    <title>E3 2010 - Pictures  Stories</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3666047"/>
    <id>http://yoursite/article/?i=8bb8197dda95beae19e5eed913c8bed3</id>
    <updated>2010-06-21T15:06:19-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey Guys,

  So I've been back in town (Raleigh, North Carolina) for a few days now, after attending my first E3 out in Los Angeles, California.  As I mentioned in my previous entry, a certain publisher flew me out there, put me up in a 5 star hote...</div></summary>
  </entry>

  <entry>
    <title>The road to E3 2010 ...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3662264"/>
    <id>http://yoursite/article/?i=a0e085cb8575ae05d9fe592c55849d1e</id>
    <updated>2010-06-16T00:54:21-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've never been to E3 before - but this year a certain publisher is flying me out there and taking care of everything, which made it possible.

I'm quite excited about it all, and I'm working feverishly to get the finishing touches &#111;n the demo...</div></summary>
  </entry>

  <entry>
    <title>Some new screenshots...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3660331"/>
    <id>http://yoursite/article/?i=3ffdd85cf805600cfa05df2ee2c69583</id>
    <updated>2010-06-16T00:54:21-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been working &#111;n re-integrating the roads...I also added helicopter physics, new artwork, bases, a procedural road generation system between command points/points of interest.  Also implementation of a deferred particle system, loading/saving of m...</div></summary>
  </entry>

  <entry>
    <title>Armored Warfare Update</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3653437"/>
    <id>http://yoursite/article/?i=a786c09eba5a4ff901c1b8f58443f42f</id>
    <updated>2010-05-26T09:00:50-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been working &#111;n every aspect of the game, as usual.  Most progress was made adding the Real-time Strategy aspects into the game, getting Havok Physics fully re-integrated into the engine, adding entities into the game's database (tanks, buildings...</div></summary>
  </entry>

  <entry>
    <title>Rendering millions of trees...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3649223"/>
    <id>http://yoursite/article/?i=4e4661683ebffd5ded2265a691f9a71c</id>
    <updated>2010-05-17T06:00:53-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Million Tree Rendering
The last few days I've been working &#111;n upgraded tree rendering system.  It needs to support a few million trees per world.  I use a static imposter system at far distances, a dynamic imposter system for nearer trees, ...</div></summary>
  </entry>

  <entry>
    <title>Unique way of rendering clouds...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3648259"/>
    <id>http://yoursite/article/?i=cf604ad4cb5a072d90e51526b64d9f88</id>
    <updated>2010-05-14T19:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, I was working &#111;n my cloud system earlier today and decided to rollback to my old billboarded solution ... this is temporary until I get some more time.  I have to put all my focus &#111;n the gameplay and more important parts of the visuals/...</div></summary>
  </entry>

  <entry>
    <title>New HDR Pipeline, Sky/Cloud Rendering, e</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3645127"/>
    <id>http://yoursite/article/?i=f303266096af68be7a8b88efcbc1a90c</id>
    <updated>2010-05-08T14:23:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Real-time Strategy  Water - Works in Pro</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3640115"/>
    <id>http://yoursite/article/?i=946bc8c92427dec8a082ef01084c008a</id>
    <updated>2010-04-27T08:00:38-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Bleh, seems I'm always tired when I post these journal entries, probably because I've been up for countless hours and it's now 9:30 AM.  I have to stop working &#111;n this stuff now lol.

In the last day or so I made a lot of progress &#111;n the ...</div></summary>
  </entry>

  <entry>
    <title>Armored Warfare - A Touch of Realism</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3638735"/>
    <id>http://yoursite/article/?i=96aecb3d8f1567a00e46fc166c75fbd4</id>
    <updated>2010-04-24T07:30:42-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys...I've been very busy lately working &#111;n a lot of things.  A lot has been going &#111;n behind the scenes, most of which I can't really talk about...but long story short I've made some modifications to Armored Warfare.

Some of the big...</div></summary>
  </entry>

  <entry>
    <title>A Touch of Realism -)</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3638735"/>
    <id>http://yoursite/article/?i=bb85720ecc72aec4d6d318e1d354303b</id>
    <updated>2010-04-24T05:30:48-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys...I've been very busy lately working &#111;n a lot of things.  A lot has been going &#111;n behind the scenes, most of which I can't really talk about...but long story short I've made some modifications to Armored Warfare.

Some of the big...</div></summary>
  </entry>

  <entry>
    <title>Armored Warfare Update...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3619452"/>
    <id>http://yoursite/article/?i=a7219d1b51dc7a75e92f3828ddfeefc6</id>
    <updated>2010-03-16T04:01:47-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Phew - I just uploaded a 3.2GB version of the game for some people to check out ;-)  Hopefully that will go well.

I just added a ton of stuff into the game ... everything about the aerial dropships has been coded since the last update.  I had to c...</div></summary>
  </entry>

  <entry>
    <title>Weapon muzzle flashes, early dropship sc</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3610145"/>
    <id>http://yoursite/article/?i=be6d2513eaeff786a67fbb50601b505c</id>
    <updated>2010-02-25T21:00:58-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, I'm about to check out so I'll keep this quick [ been working for many hours ].  

I posted a WIP image earlier of the aerial dropship based &#111;n the V22 Osprey design ... my artist finished the model.  The main LOD0 comes in at 11,500...</div></summary>
  </entry>

  <entry>
    <title>Character shading update, and more.</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3607206"/>
    <id>http://yoursite/article/?i=bc4c336c50605104897fe6995473e89f</id>
    <updated>2010-02-20T08:30:54-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I finally put some advanced shading &#111;n the new soldier/character model [ self-shadowing, indirect lighting, goggle shader, etc ].  In addition I've been working &#111;n the random map generator stuff [ fractal mountains, l-systems, erosion simulation,...</div></summary>
  </entry>

  <entry>
    <title>Aerial Dropship - WIP model</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3604386"/>
    <id>http://yoursite/article/?i=1149b0f30251332265970d6ad63d3c5c</id>
    <updated>2010-02-15T22:59:26-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">gamedev.net can't write a decent feed.
</div></summary>
  </entry>

  <entry>
    <title>High Resolution Soldier Model FTW...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3598394"/>
    <id>http://yoursite/article/?i=7097c4d2ef8849a897e15adab8ac6243</id>
    <updated>2010-02-03T23:30:59-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys,

  Sorry for the long break between updates.  I got burnt out and took a month hiatus...one of the benefits of being 'self employed' I suppose.  The freedom is a double edged sword for sure.

  Either way I'm back &#111;n the proj...</div></summary>
  </entry>

  <entry>
    <title>Win. ?!?</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3572602"/>
    <id>http://yoursite/article/?i=a17130fb39591ddbc18c1e0371b58b87</id>
    <updated>2009-12-14T06:31:36-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Wow, don't think I've ever worked so hard to get something finished &#111;n time, evar, in my life.

Just uploaded a new 930MB ( ~2.3GB unzipped ) version of this game for an undisclosed publisher to check out ;-)  I'm nervous ... pray to the progr...</div></summary>
  </entry>

  <entry>
    <title>New Name - New Websites  - etc</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3569988"/>
    <id>http://yoursite/article/?i=630102d298941cd8b959a3dbacd71946</id>
    <updated>2009-12-09T09:00:57-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In prep for BETA release #2 of my vehicle combat game ( previously known as Warbots &#79;nline ) -  I decided to change the name to something a bit better - just about every domain .com is taken for anything close to what I want.  So I decided to go...</div></summary>
  </entry>

  <entry>
    <title>Early Weather, Film Grain, Brightness/Co</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3563441"/>
    <id>http://yoursite/article/?i=db58a273056100bc1a54d38171db5335</id>
    <updated>2009-11-26T11:00:29-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, figured I'd post this stuff up before I get too back logged...I want to post new HD videos showing the Beach Assault gameplay, the weather, the construction cave, the walking robot, and all the new things I've added since August ... the game shou...</div></summary>
  </entry>

  <entry>
    <title>Inverse Kinematics + Mechs + MOAR WIN</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3559829"/>
    <id>http://yoursite/article/?i=ca785fc83e7bb8f3ba947f7400458138</id>
    <updated>2009-11-19T10:00:29-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">HAI.  I was going to hold off &#111;n this update - but I think this is so cool I have to show you right now :-o

I've been working &#111;n Inverse Kinematics, a fully-blown dynamic weather system [ rain, t-storms, clear, cloudy, overcast - more &amp;#...</div></summary>
  </entry>

  <entry>
    <title>A taste of things to come in Warbots BET</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3554880"/>
    <id>http://yoursite/article/?i=e1543afa1e6058631ca53b05d51d5326</id>
    <updated>2009-11-10T02:30:50-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, I guess I'm reverting to my old ways of &#111;ne journal update a month :-o  I've got a lot of stuff to show &amp; tell lol.  If you're &#111;n some kind of metered internet access you might want to bail out right about now. [ btw. almost @ 700,000 j...</div></summary>
  </entry>

  <entry>
    <title>Screen Space Global Illumination</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3543134"/>
    <id>http://yoursite/article/?i=1616ff5043410b5eee72ff94f51cb72c</id>
    <updated>2009-10-17T14:50:56-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I was browsing the forums and saw this thread about screen space global illumination (SSGI).</div></summary>
  </entry>

  <entry>
    <title>Warbots Online - Beach Assault Map (Part</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3540909"/>
    <id>http://yoursite/article/?i=cb539022e2dd1f4132f477b18bc58d25</id>
    <updated>2009-10-12T22:30:32-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys...omg two updates in a 4 day timespan.  I'm trying to change my evil ways of &#111;ne dev-journal update a month ;-)

I've been putting time into the most complex gameplay mode (and map) in the game, the "Beach Assault".  &#79;ne team is s...</div></summary>
  </entry>

  <entry>
    <title>Massive Warbots Online Update!</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3538988"/>
    <id>http://yoursite/article/?i=eb4167309daf800b42ffbe26d36f4768</id>
    <updated>2009-10-10T14:01:18-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys,
As usual I've been working insane hours on this game.</div></summary>
  </entry>

  <entry>
    <title>First person mode, new gameplay, and muc</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3529958"/>
    <id>http://yoursite/article/?i=fd858f5640e775dde27b51d06c3c7c08</id>
    <updated>2009-09-21T09:00:56-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, I'm very happy with some of the stuff I've come up with in the last week or so.

I've added the option for players to exit their warbots and play the game &#111;n foot with a machine gun...the catch is that the players have a communicatio...</div></summary>
  </entry>

  <entry>
    <title>Huge 'Warbots Online' Update / Lots of n</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3524571"/>
    <id>http://yoursite/article/?i=d7e66280174b13f28ad9739d587c2e3a</id>
    <updated>2009-09-11T07:00:58-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys,

  I wish I had more time to type up updates...instead they turn into &#111;nce-a-month-dumps of 100s of hours of work.  The sad part is this is going ot be a massive update, and it's &#111;nly part of the work I've done since the last &amp;#...</div></summary>
  </entry>

  <entry>
    <title>Warbots Online - BETA Download</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3508805"/>
    <id>http://yoursite/article/?i=e0a4cda6d805abb2267f1bf2cffa8a71</id>
    <updated>2009-08-13T00:30:40-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">August 12, 2009



Game's website - http://www.warbotsonline.com

BETA Installer download link...</div></summary>
  </entry>

  <entry>
    <title>3 HD Videos, Public Demo/BETA release in</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3507392"/>
    <id>http://yoursite/article/?i=e1e25d5e6460fd57fcd3fa9cae0b72ac</id>
    <updated>2009-08-11T01:30:33-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys,

  Yea I know it's been a while since the last update...I'm like the drunken delinquent game developing uncle you never had :-o. In spite of the lack of updates to the developer journal, and my website, and my forums, aaaand...yea...work ...</div></summary>
  </entry>

  <entry>
    <title>Warbots Battle Video - Freeze Frame</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3484135"/>
    <id>http://yoursite/article/?i=e32a1d4c4e2fc0f764550f7e1096333c</id>
    <updated>2009-07-02T15:30:18-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, sorry for the lack of updates.  It's not because I've not been working - I've just been very busy &#111;n Warbots and Urban Empires.

Warbots is currently being pitched, I just sent out a new build last night..hopefully I can find an inte...</div></summary>
  </entry>

  <entry>
    <title>Shield Defense Gameplay + More</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3465869"/>
    <id>http://yoursite/article/?i=edf7052e6dacc9607f506ea057a35255</id>
    <updated>2009-06-01T00:00:48-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Shield Defense / Command point Gameplay
Lately I've been working &#111;n the main gameplay mode that will be in the game. I'm calling it 'Shield Defense' for now.  

You basically fight for control over 5 command points &#111;n the map, ...</div></summary>
  </entry>

  <entry>
    <title>Quick update with more screenshots...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3464022"/>
    <id>http://yoursite/article/?i=00f0aaa2cd5490f5109e40c7313fbea1</id>
    <updated>2009-05-27T20:00:28-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys,
  
  I've got a quick update with a composite image of some new screens of the game.

  In addition to the usual stuff/improvements/WIP items, I'm working &#111;n a Vehicle Studio / Spray paint shop, where you can plaster unlimite...</div></summary>
  </entry>

  <entry>
    <title>Warbots Update - Nearing the finishline </title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3463035"/>
    <id>http://yoursite/article/?i=0e650724d63ff8461b216b16901578c3</id>
    <updated>2009-05-25T18:00:58-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys,

  I've been working &#111;n this vehicle combat game Warbots &#79;nline for about 6 months now, and I can see the light :-D.  I'm going for a sort of 'counter-strike but with vehicles' feel for the game.  It supports up to 64 play...</div></summary>
  </entry>

  <entry>
    <title>Warbots Online - Statue Scene  (Video Li</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3435588"/>
    <id>http://yoursite/article/?i=920d6441ba590cad7d437fbe80b5c7f8</id>
    <updated>2009-04-09T15:30:27-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys...a reaaally quick update in addition to the &#111;ne last night...I just 'finished' the scene for the main menu, I was just going to go with a spotlight and a black background...but I think a dark skydome looks much better.  

The scene u...</div></summary>
  </entry>

  <entry>
    <title>Havok + Main Menu Statue + Roads + More.</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3435092"/>
    <id>http://yoursite/article/?i=446d7de2f808966737652f28a3ada84c</id>
    <updated>2009-04-08T21:02:26-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A quick break from the Havok Physics updates, I've made a LOT of progress in terms of tuning the vehicles, and I'll have Part 4 of the Havok Physics Implementation ready in a few days.  Let's just say I'm leaving games of CS:S just to drive around &amp;...</div></summary>
  </entry>

  <entry>
    <title>Havok Physics (Part 3)  Video Link</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3433237"/>
    <id>http://yoursite/article/?i=2163a58e52a3c94ab897ce9e63e9c384</id>
    <updated>2009-04-05T14:00:52-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the first entry I showed the Havok visual debugger, which is &#111;ne of the coolest tools I've used before.  In the second I showed the integration of rigid bodies &#111;n the large 512x512 heightfields, and into my game.  Last night I finished the ...</div></summary>
  </entry>

  <entry>
    <title>Havok Physics (Part 2)  Video Link</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3432487"/>
    <id>http://yoursite/article/?i=2967a40f85d0c43a94bfd81c92a78051</id>
    <updated>2009-04-03T22:30:22-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So in the last entry I showed the remote visual debugger that Havok lets you play around with, it's very cool.  Today I have an update showing some in-game images and a video.  The vid/screens show implementation of a 32bit sampled heightfield in Havok, as...</div></summary>
  </entry>

  <entry>
    <title>Havok Physics [ Part 1 ]</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3431787"/>
    <id>http://yoursite/article/?i=e47263f3a288c60c490bc1518e45aea2</id>
    <updated>2009-04-02T19:00:40-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So I've made the leap to the Havok physics engine...after fully implementing ODE, Tokamak, Newton, Ageia PhysX, aaaand my own hand rolled...I, uh, think I've found what I've been looking for ;-)

In a few days I've put all I really need into my gam...</div></summary>
  </entry>

  <entry>
    <title>Robot Self Shadowing  Ground Illuminatio</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3406965"/>
    <id>http://yoursite/article/?i=6295c0ff14479f26e0205087b21dfedb</id>
    <updated>2009-02-22T10:30:17-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Sorry I've not much to show in terms of screenshots / videos like in the last entry [ http://www.warbotsonline.com to watch the 2 videos of the game ].

I've been putting a lot of work into various GUI el...</div></summary>
  </entry>

  <entry>
    <title>Warbots Online - Update!</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3401913"/>
    <id>http://yoursite/article/?i=8c021f48ab65defdf386983afd5f87bc</id>
    <updated>2009-02-17T14:31:04-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys I've been really busy.</div></summary>
  </entry>

  <entry>
    <title>Warbots Online - 2 Early Videos</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3402796"/>
    <id>http://yoursite/article/?i=7738aafe80cf4b1348d4ef1efc4b811e</id>
    <updated>2009-02-15T15:00:48-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, in addition to all the stuff I posted yesterday...I've created/uploaded two videos of the game :-)  So you can finally see it in motion a little bit at least.

The videos are embeded &#111;n the htt...</div></summary>
  </entry>

  <entry>
    <title>Warbots Online  working title  ... Big U</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3393807"/>
    <id>http://yoursite/article/?i=74f4219eab809d9c35ed358d0a282e23</id>
    <updated>2009-02-03T00:09:08-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">[ Warbots &#79;nline ]
Hey guys, yea I've been using 'Warbots &#79;nline' as a working title for the game I've been posting about lately [ mostly because www.warbotsonline.com is available xD ]...but yea, that's the name I'm going with.  </div></summary>
  </entry>

  <entry>
    <title>Respawn Bunker WIP, Part #2 (Lighting)</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3389868"/>
    <id>http://yoursite/article/?i=34845fcb435b9ee7bd3e2fee2ee21e33</id>
    <updated>2009-01-26T17:00:45-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Respawn Bunker Lighting
Sup guys, I introduced the respawn bunker asset in the last entry.  I &#111;nly showed the exterior [ because I had not written an interior shader for this game ].

Well I spent some time today and wrote the shade...</div></summary>
  </entry>

  <entry>
    <title>XAudio/XACT  Respawn Bunker Part #1</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3389087"/>
    <id>http://yoursite/article/?i=b14c22432a7251b8af6b77bef5cb5538</id>
    <updated>2009-01-25T15:00:17-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Well I guess I'll start out with the pictures, and hope you'll stay around for the Audio stuff lol.

Respawn Bunker/Forcefield
I literally just came up with this little forcefield effect a few minutes ago, I think it's pretty cool.  Basi...</div></summary>
  </entry>

  <entry>
    <title>Crepuscular rays #2, New sky rendering, </title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3387442"/>
    <id>http://yoursite/article/?i=9f2c812115eb88f1c96030ab7ab64279</id>
    <updated>2009-01-23T15:36:38-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ok I guess I have to make multiple updates per day here lol.  </div></summary>
  </entry>

  <entry>
    <title>Crepuscular Rays  Part #1</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3386999"/>
    <id>http://yoursite/article/?i=d2152d7b80964e3eb8ccc5fb9388ad20</id>
    <updated>2009-01-22T11:30:47-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Well since you were all taken so much by my last entry &#111;n AI/Pathfinding/Ambient Occlusion I'll try to pick an intersting topic for this post lol.

Crepuscular Rays

Ah yes, crepuscular rays [ no relation to fatty corpuscle ], o...</div></summary>
  </entry>

  <entry>
    <title>AI Pathfinding  Terrain Ambient Occlusio</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3386439"/>
    <id>http://yoursite/article/?i=bbdbd079fc04c321208873d8e7a9d8ad</id>
    <updated>2009-01-21T15:00:30-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm still rushing to have this "small" project out there in the next few weeks, hopefully finished [ offline mode ] by the end of the month, and the 64-player networked games working a week or two after that.  I should come in A little over half of my proj...</div></summary>
  </entry>

  <entry>
    <title>Quick update on the mystery project :-p</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3385730"/>
    <id>http://yoursite/article/?i=6be5e3355bcdbbe88a2dda405d031094</id>
    <updated>2009-01-20T15:30:41-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I have some more screenshots of the little "project" I'm working &#111;n now.

For more information about it, etc. see the last post.  I hope to have this game done by the end of the month [ at least the offline components ], it's going to be close...</div></summary>
  </entry>

  <entry>
    <title>What the hell have I been up to?</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3384074"/>
    <id>http://yoursite/article/?i=b5928340fb6c510802778966bcda533e</id>
    <updated>2009-01-18T12:40:37-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys :-)

Sorry for not posting anything here for so long.  I've been really busy, and I'm sort of working on two projects now :-)  For info about Urban Empires see the bottom of the post.</div></summary>
  </entry>

  <entry>
    <title>Oct 1. 2008 - Quick Status Update</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3325388"/>
    <id>http://yoursite/article/?i=b2fdf5c42d91089a5e61a92c1dea0acb</id>
    <updated>2008-10-02T23:30:18-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys...the game is 99% artwork complete, 90-95% code complete.

I still have to get the car physics working as well as I want...I'm tired of wrestling with the raycast PhysX vehicles...I'll be working &#111;na  true rigid body simulation of the...</div></summary>
  </entry>

  <entry>
    <title>Vehicle Test Track - Early Video</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3309875"/>
    <id>http://yoursite/article/?i=31f7de77df314af93686fdaa5952f972</id>
    <updated>2008-09-08T07:00:10-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I uploaded a quick 1 minute video showing the test track I'm using to fine-tune and refine the vehicle physics...

Expect drifting videos soon...lol...I've already got some decent physics using Ageia, but it's probably 60% what I had with Newton.  ...</div></summary>
  </entry>

  <entry>
    <title>Two new weapons, and my physics test cou</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3309130"/>
    <id>http://yoursite/article/?i=47d0b2874975a131eb2312c205b4cae9</id>
    <updated>2008-09-06T20:30:10-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, I just got images of the final 2 weapons in the game...bringing the total to 51.

Also I'm working &#111;n the car physics so I plopped a little race track in the middle of the city, I found &#111;ne &#111;nline for like 100 bucks...it sh...</div></summary>
  </entry>

  <entry>
    <title>New Weapons Art  ...I can haz Porsche?</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3304792"/>
    <id>http://yoursite/article/?i=7f31d9d70f2e5bd7b58482ff6f1fbdcd</id>
    <updated>2008-08-30T19:30:10-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys...some new guns from my fantastic weapons artist - This makes 49 / 51 completed.  

I'm working towards a point where I can start showing some more in-game stuff again...the game is in pieces now though.

I'm juggling 10 different ...</div></summary>
  </entry>

  <entry>
    <title>8/9/8 - Weapons display video [ 45 weapo</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3289810"/>
    <id>http://yoursite/article/?i=b7f896b76ae534160b2a75986edce3de</id>
    <updated>2008-08-10T06:00:27-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So yea, this was my saturday afternoon project.  There are so many parts that can be tweaked.

This sort of interface is going to be used a few places throughout the game...


Here is the video link.....

[ best to watch full...</div></summary>
  </entry>

  <entry>
    <title>Quick Update - 4 new guns...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3282783"/>
    <id>http://yoursite/article/?i=510d088b83146b01b72224a20e151e8d</id>
    <updated>2008-07-30T17:00:09-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, quick little update...I've got 4 more guns from my weapons artist...

Remember the game is played from the 3rd person view when you're controlling &#111;ne of your gangsters, so I think the guns are detailed enough.

I'm holding m...</div></summary>
  </entry>

  <entry>
    <title>The Bridge [ WIP ].</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3271420"/>
    <id>http://yoursite/article/?i=f2013d8e262b15968bfb0df35f1a77c9</id>
    <updated>2008-07-16T10:30:07-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I want to use this bridge as the centerpiece of &#111;ne of the cities in the game.  As you might know the game comes with an integrated city editor, and there are multiple cities that will ship with the game, etc.  

It's sort of like a Battlefiel...</div></summary>
  </entry>

  <entry>
    <title>Yay, 400,000 journal views...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3269953"/>
    <id>http://yoursite/article/?i=535a522b9f3ec32bc395421a1d270d0c</id>
    <updated>2008-07-14T15:08:17-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yes.  400,000 plus journal views.  This calls for an animated .gif</div></summary>
  </entry>

  <entry>
    <title>Need ideas for 3 more weapons!</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3267516"/>
    <id>http://yoursite/article/?i=d34123445745dc64fbd865db012619a3</id>
    <updated>2008-07-14T04:58:01-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">DONE means they are already created, if not then they are in the works by my gun artist.

Here is his latest work for me, a FAMAS F1...</div></summary>
  </entry>

  <entry>
    <title>Finished Sex Shop + More Screenshots</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3231199"/>
    <id>http://yoursite/article/?i=ef5ace0a4518af1eb214c4fe2b66a7a8</id>
    <updated>2008-05-24T18:00:25-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So the latest building is in-game...it's a sex shop.  Yea I said sex shop, big whoop, wanna fight about it?  xD

David did the model and I did some texture work and created the logos, now playing, etc...

This building looks plain during th...</div></summary>
  </entry>

  <entry>
    <title>Down here at the pwn shop xD - Video, et</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3229443"/>
    <id>http://yoursite/article/?i=f507707b3443fb5e6a512affb266fb4c</id>
    <updated>2008-05-21T23:00:07-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Where to start ;-) [ edit: all in-game images are shown @ 50% texture quality because 32-bit operating systems suck :-p ]

I've got a lot of new artwork etc. for the game.  David, &#111;ne of my buddies is helping me with some environment art.  I'v...</div></summary>
  </entry>

  <entry>
    <title>Multiplayer - 64 people per server / etc</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3201301"/>
    <id>http://yoursite/article/?i=ec371bb3c8272eea097edcbd41e66c17</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm working &#111;n all kinds of fun stuff right now :-D  Here is a quick update/some info &#111;n a few random topics -

Multiplayer, 64 players per server
I've decided to make the game support 1-64 players per multiplayer server when I...</div></summary>
  </entry>

  <entry>
    <title>Physics Test Course  More Civilians</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3191536"/>
    <id>http://yoursite/article/?i=c25291516cb8232d289e69527a65b76b</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yea so here is today's progress &#111;n the crowds &amp; physics... etc.

I've created a new physics test map...this also allows me to re-integrate the city selection functionality into the game.  I've also gotta get mini-map generation working again u...</div></summary>
  </entry>

  <entry>
    <title>7000+ Civilians / Semi-Instancing</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3190782"/>
    <id>http://yoursite/article/?i=64b1d7d527e611be009d481186496c46</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yea if you've been following the game you've probably been wondering where the hell the civilians are at.  I've recently got them back into the game...but with a twist.  I coded a light weight character class for the civilians, and based their rendering ar...</div></summary>
  </entry>

  <entry>
    <title>Video - AK47/ Unlimited ammo...weeee</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3188862"/>
    <id>http://yoursite/article/?i=240e9450d262ad222f2c6cdcc460788a</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ayee...I've been tweaking a lot of stuff, removing the glow from everything that is visible in the old screenshots....I'm much happier with the HDR lighting etc. now.

This video just shows a character moving around while constanly firing an AK-47....</div></summary>
  </entry>

  <entry>
    <title>Dynamic Debris/Trash</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3188096"/>
    <id>http://yoursite/article/?i=196165b047e258f1fc68f7b01a4d6317</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yes I've added dynamic debris/trash to the city...as part of my 5 classes of objects in the game.

- 1) Items which can be picked up and used by the player (guns, drugs, etc.).
- 2) Dynamic debris...which is newspapers, bags, paper, cups, small...</div></summary>
  </entry>

  <entry>
    <title>March 24, 2008 - Urban Empires Update + </title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3186955"/>
    <id>http://yoursite/article/?i=15cc711c853cedbe711b94415a815170</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm working &#111;n a lot of stuff right now including : 

- iteration #2 of the dynamic debris system 
- iteration #3 of the dynamic civilian system
- Various RTS aspects
- Vehicle movement tweaking
- Mini-map stuff
- Blah blah...</div></summary>
  </entry>

  <entry>
    <title>City Props / Object physics</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3179824"/>
    <id>http://yoursite/article/?i=8a3ed54caeace94d016ee192f883325f</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I finally got around to implementing all the streetside/city props into the game.  I decided to take my time and write a generic object system.

There are 5 types of "objects" as far as the game is concerned...all of which are handled by this new s...</div></summary>
  </entry>

  <entry>
    <title>Some Urban Empires Environment pics  Nex</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3170594"/>
    <id>http://yoursite/article/?i=8f224d12c778c8906753fabe427c949e</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hey guys, I can't leave ya hangin' with no screens for too long .  Here is a collection of screenshots showing the environment and vehicles.  It doesn't show gangsters/civi...</div></summary>
  </entry>

  <entry>
    <title>Countdown 'til BETA...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3154727"/>
    <id>http://yoursite/article/?i=db965e2a54f6be47448183e5e1f0cbc7</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ok I'll let you know when the BETA is coming, the &#111;nly catch is you have to decode it, I'm evil ...have fun you clever bastards...I give it 1 hour lol.

Fre...</div></summary>
  </entry>

  <entry>
    <title>Urban Empires - January 13, 2008 Update</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3138881"/>
    <id>http://yoursite/article/?i=762e654887f62785674f3249987fed8b</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've got some more work in progress images of the terrain/environment....should be about done with it.  Also coded up an effect for when the camera/player is under water.  Players can now swim.

There is so much stuff I'm working &#111;n...s...</div></summary>
  </entry>

  <entry>
    <title>Terrain/Environment update #1</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3135471"/>
    <id>http://yoursite/article/?i=be87cebf6b3d077f4d77183341b1a767</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm going to be making a lot of progress &#111;n the terrain/environment in the next few days, so I'll try to post pixtures showing :  

- (Done)Volumetric/per-pixel fog will allow volumetirc layer of clouds above city, also simple distance based f...</div></summary>
  </entry>

  <entry>
    <title>Happy New Year!  Some new artwork / Upda</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3131771"/>
    <id>http://yoursite/article/?i=5b2c9065c6e31a9514bdb3a6c54f92b5</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ah I had a pretty good New Year/Christmas/Holiday and I hope everyone else did too!

I've been stepping away from the project for about a week so I've got fresh eyes now.  Unfortunately I'm kind of sick at the moment...combined with the New Years p...</div></summary>
  </entry>

  <entry>
    <title>ZOMG 250.000 views!   Texture Cache/LOD </title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3126780"/>
    <id>http://yoursite/article/?i=2e7fab2c24d8c6822faff39d7d180ebc</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Noiiice, I guess that's some kind of landmark in journal-land?

I wonder who will be the first to get 1,000,000 views :-O

'Tis the season to pimp some sweet new artwork...

Too bad I don't have any great new in-game screens or artw...</div></summary>
  </entry>

  <entry>
    <title>December 19, some new vehicles.</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3124263"/>
    <id>http://yoursite/article/?i=726c84818045721200e5bce9a16c2c9e</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I think they turned out great :-)

On delivery of these I'll get some high res shots so you can see all the details.

I'm working &#111;n vehicle physics, and many other things right now.  I didn't want these vehicles to get lost in the nex...</div></summary>
  </entry>

  <entry>
    <title>The AR-15.  My little tribute.</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3116677"/>
    <id>http://yoursite/article/?i=c9c96cb4f9e19a9e61e7ede34ea479fa</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">*OFF TOPIC*

 Yeaaa I know this isn't "game related", but it's still cool.  So here are some of my pictures of "The patriot weapon of choice"...the AR-15.  I just got that wording from this YouTube video ...</div></summary>
  </entry>

  <entry>
    <title>New Environment / Building WIP</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3215443"/>
    <id>http://yoursite/article/?i=ccf852fc58e176c44de7e22c8f3339ec</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been working &#111;n this &#111;ne for a few hours...it's the first of many new buildings I'm creating for the game...

I'm really tired and don't care to get into the specifics of all the stuff I've been up to...but I'll try to post more freq...</div></summary>
  </entry>

  <entry>
    <title>Bridge/Underpass Artwork</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3216523"/>
    <id>http://yoursite/article/?i=48b99aab996a9da3fd279f63701790f7</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ok Here is today's Environment WIP / Art Update

Today I've modeled/textured a small bridge/underpass tile for the cities.  I'm going to start &#111;n some more buildings in a few minutes after a break.  Check out the gun range in the last p...</div></summary>
  </entry>

  <entry>
    <title>Environment Art Update #3 / Bowling Alle</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=323649&amp;reply_id=3217024"/>
    <id>http://yoursite/article/?i=305e95037997d7a4f55089be69f5907b</id>
    <updated>2008-05-06T14:30:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finished Bowling Alley &amp; step-by-step construction screenshots.

These are all in-editor shots, with basic lighting &amp; texturing, no shaders...

...</div></summary>
  </entry>

  <entry>
    <title>Make ‘em Up – Got a game idea? Win 6</title>
    <link href="http://turborilla.com/turborilla/make-em-up-have-a-game-idea-win-65-000-euros/"/>
    <id>http://yoursite/article/?i=54819e9842dfa678282fd25533b77df5</id>
    <updated>2010-06-01T04:31:03-07:00</updated>
    <author>
      <name>http://turborilla.com/turborilla/make-em-up-have-a</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Make ‘em Up – Have a game idea? Win </title>
    <link href="http://turborilla.com/turborilla/make-em-up-have-a-game-idea-win-65-000-euros/"/>
    <id>http://yoursite/article/?i=c48d9eb85524de639a1f8d8e6929bc35</id>
    <updated>2010-06-01T03:01:08-07:00</updated>
    <author>
      <name>http://turborilla.com/turborilla/make-em-up-have-a</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Multiplayer Chase Mode Teaser</title>
    <link href="http://turborilla.com/development/multiplayer-chase-mode-teaser/"/>
    <id>http://yoursite/article/?i=ece3378ad17d399d4c89f120112ab370</id>
    <updated>2010-05-03T00:30:36-07:00</updated>
    <author>
      <name>http://turborilla.com/development/multiplayer-chas</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m working hard on Multiplayer as usual, and I though I&#8217;d share some of it with all of you. So here&#8217;s a teaser video of Chase Mode:
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=jv0NAueoXnI
The point here is that both players see the same view of the game, so that when you outrun your opponent far enough he can not see his bike anymore. Increase the distance a bit more and he explodes and you get a point.
On the other hand, you will not see much of the track ahead when you are in the lead. This provides a quite natural negative feedback loop, which is good. Negative feedback loops means that the player in the lead is given a disadvantage.
What do you all think? Looks fun?</div></summary>
  </entry>

  <entry>
    <title>vote for Gore and three Monday links</title>
    <link href="http://turborilla.com/blog/vote-for-gore-and-three-monday-links/"/>
    <id>http://yoursite/article/?i=7f5f18b14c593a6e74de524412de1a7e</id>
    <updated>2010-04-19T03:30:51-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/vote-for-gore-and-three</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">&#8220;Moonstone&#8221; from the weekend post below got me thinking of our moon. Thinking about our moon led to remembering this pic from a couple of weeks back:

This is a heat pattern from &#8220;Mima&#8221;, one of the moons orbiting Saturn, you can read more about it here . The reason for this post is not to share space gossip with you though. I was responsible for a nasty scare a few days back. My victim, Profilar Per, has requested various pastries and&#160;lazy Monday afternoon diversion as redemption:
 


	A poem 
	Make a mess &#8211; clean it up &#8211; an inspirational Mac story
	Spy Party

 

Have a great day and remember to vote for Gore 
Joel</div></summary>
  </entry>

  <entry>
    <title>Moonstone Gore Mode?</title>
    <link href="http://turborilla.com/development/moonstone-gore-mode/"/>
    <id>http://yoursite/article/?i=58a048d12e9e18ae15944ca69f770834</id>
    <updated>2010-04-15T23:00:55-07:00</updated>
    <author>
      <name>http://turborilla.com/development/moonstone-gore-m</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Turborilla is proud to be Bloody Bills&#8217;s friend. We recently discovered an old Mad Skills suggestion of his and got excited:&#160;He points out that crazy crashes calls for crazy blood splatter. We are thinking &#8220;Moonstone gore mode&#8221;:
Unfortunately the post got lost in a pile of changes going on at the time. What do you guys think?
We really want this so ourselves so if we get 20 comments, from different individuals, saying &#8220;Yej -- give us a Bloody Bill mode&#8220;, we will give you (and ourselves) a &#8220;Bloody Bill mode&#8221; as a thank you for patiently waiting for the multiplayer (and to Tobias for working really hard on the multiplayer):
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=_5CZ6TqCgps
I am taking the rest of the day off as I have to prepare for a weekend long NHL 2010 battle by zoning out to &#8220;Mogwai fear Satan&#8221;
Take Care!
Joel
 

comment
Man -- it is so incredible&#8230;..raw&#8230;.and funny -- I think I like the part in the vid where he get&#8217;s lifted up on a spare and then just slides through it -- man -- this in tough competition with the drunken blondes at the end ceremony though
And also: &#8220;Yej -- give us a Bloody Bill mode&#8221;
vilken l&#228;nk?
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=y1lbCWqiqyk
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=_5CZ6TqCgps</div></summary>
  </entry>

  <entry>
    <title>Replays in Mad Skills Motocross</title>
    <link href="http://turborilla.com/mad-skills/replays-in-mad-skills-motocross/"/>
    <id>http://yoursite/article/?i=9d76f44a268dec391179be6c144102ff</id>
    <updated>2010-04-14T05:01:11-07:00</updated>
    <author>
      <name>http://turborilla.com/mad-skills/replays-in-mad-sk</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">&#8212;&#8211;&#8212;&#8211;
 

To decide who should get the rights to the one glorious cream puff (got a better word for it? &#8211; let me know) that arrived here at the office this morning, we put together a comp inspired by the contest the Swedish MX site, MX Star, is currently hosting here: &#8220;Vinn spelet Mad Skills Motocross&#8221;. Feel free to go tease, &#160;push or compete with our Swedish friends.
While competing I realized that some of you might have missed out on last week replay update.
You have to download the game again as the update did not roll out with the autoupdate. Just go to your Mad Skills account  , log in and download the new version.&#160;In time attack you will be able to check your replays!
The 1 kilo cream monster got us all a bit shaky &#8211; 20 minutes of hardcore office swearing and the heavenly pastry was MINE &#8211; my stomach aches now.
Before I got to enjoy my prize we had to quickly go through the results though. The competition triggered a couple of wagers, as you can see below, we believed Tobias would win&#8230;.but he did not:
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
 

Have &#160;a great Wednesday!
Joel</div></summary>
  </entry>

  <entry>
    <title>A simple tip to keep a programmer sane</title>
    <link href="http://turborilla.com/highlights/multiplayer-musings/"/>
    <id>http://yoursite/article/?i=c548f31e607b8481aee74df4c4fb46f4</id>
    <updated>2010-04-13T08:30:50-07:00</updated>
    <author>
      <name>http://turborilla.com/highlights/multiplayer-musin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As you may know, I am working on the upcoming multiplayer feature of Mad Skills Motocross. I really think this will take the game up to a whole new level of bone-shattering fun. And, it&#8217;s fun to make.
There are a lot of design decisions to make as to how it should work. Different modes, options, buddy lists and so on. I&#8217;d like to share the prototyped game modes we are testing: Chase, Race and Trick as well as a tip that have kept my head straight and focused over the last couple of years as a developer.
Before that I&#8217;d like to thank Bloody Bill and Joel (who still struggles with &#8220;Sinks&#8221;) &#8211; the &#160;last couple of days of harassment related to Bloody Bill&#8217;s amazing race and Joel&#8217;s big mouth has fueled the current dev phase. We&#8217;re closing in, well on our way and maintaining great speed. Bloody Bill &#8211; keep practicing, you&#8217;ll need it &#8211; Joel, shut up!

The three modes as follows:
Chase
Both players see the same view, as if playing on the same computer. This means that when one player gets a significant lead the other player will be left behind and even out of the view of the &#8220;camera&#8221;. When that player&#8217;s bike is not visible anymore, because it left the screen, it explodes and the leading player earns a point.
Then both bikes are reset at the same place and the chase starts again. Get a certain number of points to win.
Oh, and several tracks are chained together into one big track.
Race
Just a regular ol&#8217; race, first to the finish line wins. Exploding bikes might make an appearance, just for the sake of it.
Trick 
Win the race by getting more stars than the opponent.
 

Oh yeah, the tip: Set a time for ending the day&#8217;s work, at the end write down what you have done today and what you are supposed to do first thing tomorrow &#8211; doing this is the reason I am still sane. Very simple.
Take Care!
Tobias</div></summary>
  </entry>

  <entry>
    <title>SQL Highscore Table Database</title>
    <link href="http://turborilla.com/development/database-tips-n-trix/"/>
    <id>http://yoursite/article/?i=edf1228645894c9312abb212945d4498</id>
    <updated>2010-04-12T15:00:44-07:00</updated>
    <author>
      <name>http://turborilla.com/development/database-tips-n-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We have been receiving a couple of questions in regards to games involving scores over the last few weeks. Therefore I put together something I would have wanted to see when I first started out:
If you save the score for each game session you will end up with a database similar to the scores table below.



player
game
score




1
A
150


2
A
250


1
B
250


2
B
50


3
B
125


The example above has two game sessions. In the game called A there were two players and in the game called B three players. If we look at player 1, we can see that she lost the first game but won the second.
Usually we&#8217;d like to look at all the game data we&#8217;ve stored and say how many game sessions a particular player has won. But how do we do that automatically with a database SQL query? It seems simple enough since it&#8217;s such a small table, but it can be a little more tricky than you would first expect.
Below is one way to do this. The idea is that we calculate the total number of games the player has participated in and subract the number of games she lost.
SELECT total.number - lost.number
FROM

(SELECT COUNT(DISTINCT scores.game) AS number
 FROM scores 
 WHERE scores.player = '1')
AS total,

(SELECT COUNT(DISTINCT my_scores.game) AS number
 FROM scores AS my_scores
   INNER JOIN scores AS other_scores
   ON my_scores.game = other_scores.game
 WHERE my_scores.score &lt; other_scores.score
   AND my_scores.player = '1')
AS lost;
So if you&#8217;re making a game that saves scores this code might come in handy for you.
Do you see what would happen if two players have the same score?Do you know how you can improve the performance?
The spring finally hit Ume&#229;, I&#8217;m off to enjoy it
Have a great weekend
Peter</div></summary>
  </entry>

  <entry>
    <title>Cortex Command – have you tried it?</title>
    <link href="http://turborilla.com/games/cortex-command-have-you-tried-it/"/>
    <id>http://yoursite/article/?i=bca276e0d10d5421b7f213eeee0c78f8</id>
    <updated>2010-04-12T09:01:08-07:00</updated>
    <author>
      <name>http://turborilla.com/games/cortex-command-have-yo</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s important to play a lot of games if you aspire to be a great game developer. Or so I keep saying to myself anyway.
I want to let you know about some of the games I play and that I find inspirational. This post is about a game with really, really nice physics: Cortex Command. The developers, Data Realms, also use an interesting business model.
What&#8217;s it all about then? Well, it&#8217;s not finished yet, but it&#8217;s a great sandbox to play around with. It&#8217;s got pixel-perfect physics. Also, you know how recent big games brag about &#8220;destructible terrain&#8221;? Cortex Command has destructible everything. Blow stuff up and watch the pixels and parts flail around, or dig a tunnel with the &#8220;digger&#8221; to get to your enemy (Worms, anyone?).
Check out the video below, it&#8217;s a bit hard to see the details so watch it in full screen. Then go to the official site: Cortex Command
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=G8gdIcdVkEM
There&#8217;s a free demo to try out.
&#8220;But&#8221;, you are probably not thinking, &#8220;What about the business model?&#8221;
Well, Cortex Command is not nearly finished and they have been charging for it for years now. The money they get from that helps them keep developing the game. And that is interesting to us. By accepting pre-orders, we could embark on making a bigger game.
But, even more important, they get valuable feedback from their customers. Potential customers might say that they would like to have this and that feature, but do they pay for it? By charging money during development, Data Realms get hard data on what customers really do like as they put their money where their mouth is.
Money and Feedback. Sweet. In Sweden, we call that &#8220;killing two marketers with one blow&#8220;.</div></summary>
  </entry>

  <entry>
    <title>Motocross outfit</title>
    <link href="http://turborilla.com/mad-skills/motocross-outfit/"/>
    <id>http://yoursite/article/?i=c762bb7104416d481d6aea03948e68a9</id>
    <updated>2010-04-10T01:31:03-07:00</updated>
    <author>
      <name>http://turborilla.com/mad-skills/motocross-outfit/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Our Mad Skills hero seem to have a leather outfit and what appears to be a MC helmet on &#8211; why?
</div></summary>
  </entry>

  <entry>
    <title>Highscore table, database</title>
    <link href="http://turborilla.com/development/database-tips-n-trix/"/>
    <id>http://yoursite/article/?i=0298e9bfe8b3ea57e859a9a03d60341a</id>
    <updated>2010-04-09T08:30:31-07:00</updated>
    <author>
      <name>http://turborilla.com/development/database-tips-n-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We have been receiving a couple of questions in regards to games involving scores over the last few weeks. Therefore I put together something I would have wanted to see when I first started out:
If you save the score for each game session you will end up with a database similar to the scores table below.



player
game
score




1
A
150


2
A
250


1
B
250


2
B
50


3
B
125


The example above has two game sessions. In the game called A there were two players and in the game called B three players. If we look at player 1, we can see that she lost the first game but won the second.
Usually we&#8217;d like to look at all the game data we&#8217;ve stored and say how many game sessions a particular player has won. But how do we do that automatically with a database query? It seems simple enough since it&#8217;s such a small table, but it can be a little more tricky than you would first expect.
Below is one way to do this. The idea is that we calculate the total number of games the player has participated in and subract the number of games she lost.
SELECT total.number - lost.number
FROM

(SELECT COUNT(DISTINCT scores.game) AS number
 FROM scores 
 WHERE scores.player = '1')
AS total,

(SELECT COUNT(DISTINCT my_scores.game) AS number
 FROM scores AS my_scores
   INNER JOIN scores AS other_scores
   ON my_scores.game = other_scores.game
 WHERE my_scores.score &lt; other_scores.score
   AND my_scores.player = '1')
AS lost;
So if you&#8217;re making a game that saves scores this code might come in handy for you.
Do you see what would happen if two players have the same score?Do you know how you can improve the performance?
The spring finally hit Ume&#229;, I&#8217;m off to enjoy it
Have a great weekend
Peter</div></summary>
  </entry>

  <entry>
    <title>A simple tip to keep a programmer sane</title>
    <link href="http://turborilla.com/mad-skills/multiplayer-musings/"/>
    <id>http://yoursite/article/?i=93a6fece642cc1175c32934208bb5f04</id>
    <updated>2010-04-08T00:01:28-07:00</updated>
    <author>
      <name>http://turborilla.com/mad-skills/multiplayer-musin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As you may know, I am working on the upcoming multiplayer feature of Mad Skills Motocross. I really think this will take the game up to a whole new level of bone-shattering fun. And, it&#8217;s fun to make.
There are a lot of design decisions to make as to how it should work. Different modes, options, buddy lists and so on. I&#8217;d like to share the prototyped game modes we are testing: Chase, Race and Trick as well as a tip that have kept my head straight and focused over the last couple of years as a developer.
Before that I&#8217;d like to thank Bloody Bill and Joel (who still struggles with &#8220;Sinks&#8221;) &#8211; the &#160;last couple of days of harassment related to Bloody Bill&#8217;s amazing race and Joel&#8217;s big mouth has fueled the current dev phase. We&#8217;re closing in, well on our way and maintaining great speed. Bloody Bill &#8211; keep practicing, you&#8217;ll need it &#8211; Joel, shut up!

The three modes as follows:
Chase
Both players see the same view, as if playing on the same computer. This means that when one player gets a significant lead the other player will be left behind and even out of the view of the &#8220;camera&#8221;. When that player&#8217;s bike is not visible anymore, because it left the screen, it explodes and the leading player earns a point.
Then both bikes are reset at the same place and the chase starts again. Get a certain number of points to win.
Oh, and several tracks are chained together into one big track.
Race
Just a regular ol&#8217; race, first to the finish line wins. Exploding bikes might make an appearance, just for the sake of it.
Trick 
Win the race by getting more stars than the opponent.
 

Oh yeah, the tip: Set a time for ending the day&#8217;s work, at the end write down what you have done today and what you are supposed to do first thing tomorrow &#8211; doing this is the reason I am still sane. Very simple.
Take Care!
Tobias</div></summary>
  </entry>

  <entry>
    <title>Turborilla top five indiegames</title>
    <link href="http://turborilla.com/games/turborilla-top-five-indiegames/"/>
    <id>http://yoursite/article/?i=ba54ce493be5b9241ecf8f0fe2c6de0a</id>
    <updated>2010-04-06T06:01:16-07:00</updated>
    <author>
      <name>http://turborilla.com/games/turborilla-top-five-in</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yo!
We all enjoyed a really long weekend here at Turborilla. I finally got my Braid adventure started, f&#8217;n ey that is an amazing game. As Braid our last&#160;newsletter got&#160;a fair bit of positive feedback. We share one of the articles, a short list of a few really cool games, below.
From the Turborilla newsletter:
&#8220;5 games you should check out:
Joel joined us a few weeks  back. Among other things he will take care of spreading &#8220;Mad Skills  Motocross&#8221; to the world. As he got to know us we ended up talking a fair  bit about which games we were in to at the moment. The list was  actually not as long as you would expect and surprisingly uniform. In  case you`ve missed out on any of the games at the top five list we  compiled below make sure you go check it out:

	Minecraft &#8211; Amazingly simple and fun concept. I&#8217;d describe it as massively  multiplayer lego-building with survival mode.
	Spelunky &#8211; As an Indiana Jones like adventurer you will save the damsel on every  level, which are randomly generated. Very interesting situations can  arise from this game&#8217;s simple rules. Windows only.
	Machinarium &#8211; Haven&#8217;t  played it yet? Go do it now. Gorgeous point-and-click adventure reviving  the genre.
	Sumotori - The  silliest man-made thing to date. Have a good laugh with it.
	Dicewars &#8211;  Risk, but simpler and more fun. I&#8217;ve wasted hours here. There&#8217;s a  multiplayer version out there when you feel ready.l &#8220;

 

I am off to an exciting meeting with 24MX
Take Care
 

Joel</div></summary>
  </entry>

  <entry>
    <title>T-Bone n’ Turborilla presents – East</title>
    <link href="http://turborilla.com/development/easter-weekend/"/>
    <id>http://yoursite/article/?i=ff2868420d3654ea993b8969efdcded4</id>
    <updated>2010-04-02T02:01:03-07:00</updated>
    <author>
      <name>http://turborilla.com/development/easter-weekend/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
It is weird how you sort of shut down just before it is vacation time ey? This Friday and next Monday are public holidays here in Sweden, so we all begun a four day weekend yesterday.
I need your help coming up with a great idea! &#160;All I could focus on yesterday was snowy picnics and drinking games involving Worms 3D. I love my job, but yesterday my office head was filled with jello and my irresponsible play head was filled with guarana &#8211; all n&#8217; all weird n&#8217; wonderful.
Anyways I need your help:
What kind of game would you pitch with the following constraints:
It has to involve a shipbroker, a psychologist and a company distributing plastic cards such as the credit card you used to pay for Mad Skills. The game is NOT supposed to involve pitching the companies and you should play for about an hour. It does not have to be playable in a browser.
Great ideas will be rewarded! Email me at joel@turborilla.com
Happy Holidays!
Joel</div></summary>
  </entry>

  <entry>
    <title>Testing a prototype</title>
    <link href="http://turborilla.com/development/testing-a-prototype/"/>
    <id>http://yoursite/article/?i=d7c1b59812b0ab1f068b5a7b4899fe1b</id>
    <updated>2010-03-31T07:30:55-07:00</updated>
    <author>
      <name>http://turborilla.com/development/testing-a-protot</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Besides Joels and Tobias shenanigans we actually do work here at Turborilla. Work is extraordinary fun though. One example is the recurring task of playtests:



The pic above is from the very early development stage of the sequel to&#160;Planet M.U.L.E. A few days ago we tested a prototype.&#160;We have forked off a few bastardized modifications of PM and reused all graphics, networking and crap, but changed the game mechanics. We wanted to compare the funniness between two of those versions. One was a Real Time Strategy thing with all players running around simultaneously doing whatever actions they like, and the other a Boardgame type game played in phases with more structure and the players having to wait for each other to take their turn. The boardgame type may sound like the original but it had some changes and new expanded, strategic fluff added.

During the test we were three guys crammed in one room at our office. Me, Joel and our conscientious intern Fredrik. We had another dude on loud speakers through Skype and a fifth guy playing from Germany. Three of the testers had never played MULE before and I had to quickly brief them on the rules as we played. That&#8217;s why we were in the same room. The boardgame version gave us lots of laughs. After a while all players got the hang of it and they started to screw each other over by some self-sacrificing, mean tactics. There was especially much laughter during the auctions, which some earlier newbie testers have found to be the most boring part of the game. Interesting indeed.



After playing one full game of each version the conclusion was unanimous. All testers found the boardgame style more fun. The main problem with the real time version is that it feels like you&#8217;re playing alone with a bunch of other unimportant guys running around in the perimeters. There was not enough interaction between players. Instead of trading with others, which is a core component of Planet MULE, players rather produce all goods they need themselves and sell it to the store. To make the RTS float we&#8217;ll have to come up with something to make players more dependent on each other.
Even though we believe that an RTS version could be made fun, and we have some nifty ideas on how to improve it, we&#8217;ll be exploring the turn based approach for now. Personally I think a turn based MULE will turn out the most fun in the end.
Happy Holidays!
And don&#8217;t forget to hand in your leaderboard ideas to win a game.
Peter</div></summary>
  </entry>

  <entry>
    <title>No more acute accent`s ya`ll</title>
    <link href="http://turborilla.com/drama/no-more-acute-accents-yall/"/>
    <id>http://yoursite/article/?i=8b4b99e26a2a9ca8b6141913140e8111</id>
    <updated>2010-03-29T07:31:16-07:00</updated>
    <author>
      <name>http://turborilla.com/drama/no-more-acute-accents-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">T-Bone, has gone through a fair bit of trouble (including coming in on a Sunday) making a VERY important point. More critical that that though &#8211; he delivers a bitch slap to the linguistic authority here at Turborilla &#8211; YEH! &#8211; it`s on &#8211; that`s right it`s ON!

Joel</div></summary>
  </entry>

  <entry>
    <title>A crowdsourcing solution – full versio</title>
    <link href="http://turborilla.com/development/a-crowdsourcing-solution-full-versions-to-win/"/>
    <id>http://yoursite/article/?i=fc96e2ea0ea375d476a4caf93c8216d1</id>
    <updated>2010-03-28T04:31:35-07:00</updated>
    <author>
      <name>http://turborilla.com/development/a-crowdsourcing-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We want to try something we have never done before. We would like to invite you to be an integral part of the further development of Mad Skills Motocross. Even though we have sold thousands of games already, we consider you Mad Skills gamers out there early adopters. The development of this game and the possibilities that comes with it are amazing. If our little group here at the office think it is amazing we are sure we can create something even more amazing utilizing the power contained in you guys.&#160;Each member of this group are an important part of the savvy crowd that know of Turborilla and Mad Skills, an early adopter. Your ideas and choices are important.
We will test asking you questions, utilizing you thoughts, in incremental steps and hopefully we can deliver value in exchange for your ideas and solutions. Value defined as an increasingly better game, but also in the form of individual rewards and more importantly, cred. If you come up with great code, graphics or ideas, you will be recognized for it.
The first inquire &#8211; a Facebook leaderboard?:
We need to create a leaderboard solution, we are considering using facebook and dividing it in to regions but we have not written any code yet. Do you have ideas, applications, examples of games that currently use a great solutions or example code for a facebook application that would work well for Turborilla and Mad Skills? Write to tobias@turborilla.com or joel@turborilla.com. Post your questions as a comment below
The three best suggestions gets rewarded regardless of actual implementation 
 

all the best
Tobias</div></summary>
  </entry>

  <entry>
    <title>NES, Excitebike and the right path</title>
    <link href="http://turborilla.com/highlights/nes-excitebike-and-the-right-path/"/>
    <id>http://yoursite/article/?i=c65ccee7aa180af02fc6277fa7546908</id>
    <updated>2010-03-27T07:01:35-07:00</updated>
    <author>
      <name>http://turborilla.com/highlights/nes-excitebike-an</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mr 100% -- Kieren from Queensland, Bloody Bill, lent us a few  minutes of his time, we were eager to talk to him since he is the first person ever to finish &#8220;Mad Skills Motocross&#8220;. In addition to this he has conducted one of the most impressive gaming sessions we have seen in many months. Check the vid below, the man is a SUPERSTAR!
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=9A8rtR5FmloTell us Kieren -- how did you, as the first person ever, manage to finish Mad Skills Motocross?I  grew up playing quite a few motorbike games such as Excitebike which I  still own on 8bit NES.I am not one to give up on something once I  start it. If I am ever unable to do something I have set out to do, I  sleep on it and I will generally succeed within a short time of starting  it back up afterwards.How long did it take you?I  have been playing Mad Skills Motocross on and off since I got it in  September 2009. I tried the Demo first and I loved it so I bought the  full version.Recently I have been playing most afternoons after I  get home from work.Did you have problems with any particular  track, which one was toughest to beat?The hardest track I  believe is based on what you aim to achieve, whether it be the best  possible time or just beating the computer player in career mode. I  didn&#8217;t have that much trouble with career mode at all as I find games  like this come natural to me. Alright, so who are you,where  do you live and what do you do?I am 22 next month.I am from  Queensland, Australia. I am a desktop support officer, I enjoy my job  and the people I work with.What improvements or new features  would you like to see in Mad Skills over the next few months?Many  people have made excellent suggestions to the game on the forums. I  believe many of these are great ideas but everyone wants the multiplayer  and leaderboards!Finally, how can I bump my Mad Skills to your  level?Three tips that I would like to share  with other players are; Learn the best path in a track, become adept at  controlling the bike from all landing approaches and last, persistence.  If you think you make a good time on a track, try and beat it, chances  are someone else will.Alright, any thing we haven`t covered  or something else you`d like to share?For those of you who  still need the 30 stars in one race to reach 100% Career, Turbo Nitro 2  is where I got it. Get the wheelie and stoppie down straight up, then  get your double backflips in where ever you can. (Think outside the box  here) the front flips are easily done in the few bigger jumps in the  middle of the track, remaining double backflips come at the end and the  big air jump, use your nitro and jump over the finish.From  what I`ve understood Kieren will beat Tobias once he get a chance -- I  can not wait for the Mad Skills multiplayer to be donejippikajej Kieren and  a happy, Swedish, afternoon to you all!
If you have yet to try &#8220;Mad Skills Motocross&#8221; you can download the demo here
Joel
joel@turborilla.com</div></summary>
  </entry>

  <entry>
    <title>Developers diary and acute accents</title>
    <link href="http://turborilla.com/development/developers-diary-and-acute-accents/"/>
    <id>http://yoursite/article/?i=c67d689b5d23dccd72340c82ee2ee289</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/development/developers-diary</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally we&#8217;re going to revive the dev diary. I do love writing, but it takes a lot of time. Now Joel is here to help us with the planning and writing of diary entries. Or rather, blog entries, since it seems this space is now called a &#8216;blog&#8217;. Whatever that is. Remember &#8216;The Blob&#8216;? I do, fondly.
Speaking of Joel, he is the latest star of Turborilla. We hired him three weeks ago and he still hasn&#8217;t learned to use the apostrophe correctly.
Look at all the posts made by Joel, he is writing gangsta like&#160;ya&#8217;ll but instead of an&#160;apostrophe he uses the&#160;acute accent as in ya&#180;ll. I find that infinitely annoying. Don&#180;t you?
He is also practicing to be a cheerleader, but more on that later. I am off to work on an solution for choosing tracks in the multiplayer
Tobias</div></summary>
  </entry>

  <entry>
    <title>Mad Skills in Queensland</title>
    <link href="http://turborilla.com/mad-skills/bloody-bill-got-mad-skills/"/>
    <id>http://yoursite/article/?i=e296ba91382496b2481a84022ed36f45</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/mad-skills/bloody-bill-got-m</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">100% -- 30 stars
again:
100%  -- 30 stars
We here at Turborilla are&#160;extraordinarily impressed. Well, everyone but  Tobias are impressed -- Tobias is out of this world impressed n` also  ein bischen crazy. The reason being the way our Australian mate Kieren, a.k.a Bloody Bill, finished our talk the  other day -- &#8220;Will I beat Tobias in multiplayer? Of course&#8221;
	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=FmkRRr_tmHY
As  Tobias is now fine tuning his Mad Skills, leaving work to the rest of us  -- I think the multiplayer feature might be somewhat delayed :DIf  you want to know more about Kieren just check back here in a couple of  days, he`s got a few useful tips for ya`ll trying to finish the darn  game&#160;I`m off to discuss addictive flash games -- have you got any good examples I might not know about,email me
- tjimmiJoel (still not passed f`n Sinks) (still  without a tagline)</div></summary>
  </entry>

  <entry>
    <title>Mad Skills Multiplayer</title>
    <link href="http://turborilla.com/adventures/143/"/>
    <id>http://yoursite/article/?i=ff747621cac58d55772d1dbcbc3c91b1</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/adventures/143/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">jiiiiiiiiha -- The Mad Skills Multiplayer is, sort of, near.






You  guys have been pushing hard for a Mad Skills Motocross (our  motocross game focusing on pure, fast paced fun) multiplayer. We are  therefore working hard on developing the multiplayer feature. We  would like you all to be a part of giving it the final touch  though. Therefore we want you to get busy with the questions we`ll post  here.&#160; We really like the idea of involving you in our process.  Our plan is therefore to include you in the development of &#8220;Planet  Mule 2&#8243; as well. Planet Mule has been described as &#8220;monopoly  mixed with risk -- on crack&#8221; and has approximately 15000 online  players at the moment. Judging by the initial tests of this version it  will be AMAZING!

We hope to get you quite involved, but can only  test this in incremental steps, so stay alert.

Since we are  superdedicated and fear nothing, Tobias sent us all on a  inspirational hillbilly trip last weekend -his buddies are iiiiinsane, check the pic`s above or the movie with the coolest stunt the Mad Skills team could muster below:

	
	
		
			
			
			
			
			
		
	www.youtube.com/watch?v=n5EBBCKx8Ng
I`m off to a meeting bout`&#160;leaderboard solutions for Mad Skills -- take care!Joel -- Turborilla
oh -- I just  commenced work with the boys here at Turborilla, they all got cool  taglines for themselves, felt like the nerdiest thing ever initially&#8230;&#8230;but now I want one&#8230;.if anyone got a cool  tagline for me&#8230;..email me at joel@turborilla.com, the current  suggestion is Joel -- the stick, I dont like it</div></summary>
  </entry>

  <entry>
    <title>Riding a snowmobile/motocross hybrid</title>
    <link href="http://turborilla.com/blog/riding-a-snowmobile-motocross-hybrid/"/>
    <id>http://yoursite/article/?i=7f018dc75913b4a39356a264705efc09</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/riding-a-snowmobile-mot</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We enjoyed a wonderful day on Sunday, the sun was shining and the snow glittered. Also, it wasn&#8217;t very cold.  A perfect day for some motocross riding.
A friend of mine have bought a snowmobile  traction mat kit for his motocross, along with a ski for replacing the front wheel with.  Thus making the motocross able to go in very deep snow like a snowmobile.  The kit is called The Explorer.
Check out some pictures where we take it for a spin on a motocross track:







We should make a game out of this :)</div></summary>
  </entry>

  <entry>
    <title>Mad Skills Motocross forums</title>
    <link href="http://turborilla.com/blog/mad-skills-motocross-forums/"/>
    <id>http://yoursite/article/?i=2c4fa655cdaf8345d8d46675ac78e4ab</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/mad-skills-motocross-fo</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally we have sorted out some proper forum software for discussing Mad Skills Motocross. There always was a forum here on Turborilla, but we didn&#8217;t really promote it and it was messy and buggy.
Now we have fixed this with a brand new install of Simple Machines Forum, and we are pimping it all over the place. Please help us get some discussions going, since it needs interesting conversations to pull people in and it needs people to provide interesting conversations. Catch 22 in all its glory.
So, without further ado: Brand New Mad Skills Motocross Forums</div></summary>
  </entry>

  <entry>
    <title>Multiple Use Labor Element</title>
    <link href="http://turborilla.com/blog/multiple-use-labor-element/"/>
    <id>http://yoursite/article/?i=4b0a4e22c0004d5c1138d24561ca9cfc</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/multiple-use-labor-elem</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"> Some days ago we released Planet M.U.L.E. together with Blue Systems. It&#8217;s a remake of an old game from 1983 you may not (but should have!) heard of called M.U.L.E.
Some call it the grandfather of all realtime strategy games, while some call it &#8220;the best game of all time&#8221;. In short it&#8217;s a 4 player game about economics where players builds factories to produce goods and sell for high prices to other players. The winner is the player who makes the largest profit.
Simple huh? No. If you haven&#8217;t read the manual or seen the (soon to come) instruction video you won&#8217;t have a chance to understand this game. It&#8217;s probably the genre furthest away from Mad Skills Motocross.
About a year ago Blue Systems contacted us with the idea of a remake, and since then we&#8217;ve been working on it. Now it feels great to finally release it. The development has been a bumpy ride where we&#8217;ve tried lots of different play styles and graphics. What we settled on is what you can find here: www.planetmule.com .
As I&#8217;m writing this Planet M.U.L.E. has over 2600 registered users and the number has been growing steadily since the release. With all the good feedback from the fans we&#8217;re now working on getting an update out to improve the game.</div></summary>
  </entry>

  <entry>
    <title>Grappling Hook</title>
    <link href="http://turborilla.com/blog/grappling-hook/"/>
    <id>http://yoursite/article/?i=73f5e6c91a249c17db7c19503e9ddf22</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/grappling-hook/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s hard for indie games to get attention in today&#8217;s saturated market where games  that cost more than a bag of peanuts gets hate-mailed into oblivion.  Therefore we need to stick together, and do a bit of cross-promotion now and then.
Me and Christian of SpeedRunGames made a deal: I review his game, he reviews mine.
Now, don&#8217;t think I am going to go easy on him just because we have a deal, that  would make it all pointless and ruin everyone&#8217;s day. So let&#8217;s get on with the  review of Grappling Hook.

In one sentence: It&#8217;s like Portal, but with a grapple gun instead of a portal gun.
Now that&#8217;s not bad, Portal is in my mind one of the best games ever made.  Enough with the portals, this is about grappling.
You get a grappling gun,  and with that you can pull yourself towards green surfaces with blinding speed from  far away. If you release the trigger while traveling in this manner, your momentum  will keep you going. Kind of like a human rail gun, first a large pulling force   and then no force at all. Not even friction.
During the level, you collect   access codes. When all access codes are collected, the level can be won by entering   the portal at the end of it.
Around this mechanic Christian has constructed   levels of varying cleverness, where some are ingenious and some are just frustrating.   Don&#8217;t fret though, just do the frustrating ones and you&#8217;ll have fun again in   the next level.
Good points:

	Innovative puzzler
	High velocities
	Frequent save points

Bad points:

	The graphics (programmer art)
	Too much jumping on platforms (more puzzling, less timing please)
	Limited green surfaces (I&#8217;d wish you could lash onto anything,   except red surfaces, and then design levels around that)

Anyway, the good points are pretty strong so go try the free demo now:  Grappling Hook Demo
</div></summary>
  </entry>

  <entry>
    <title>The Next Feature</title>
    <link href="http://turborilla.com/blog/the-next-feature/"/>
    <id>http://yoursite/article/?i=f8265c3952e576f6953fa8bd491c1300</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/the-next-feature/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The results of the poll? In strong favor of Online Multiplayer:

As you can see, not many voted. So, for the next time you know that your vote really makes a difference.
So, time for me to dig down and start working on those ip-numbers, packets, NATs, latencies, TCP, UDP and what have you. I&#8217;m pretty good at this stuff and I think I&#8217;ll enjoy most of it. The boring part will, as always, be the GUI code.</div></summary>
  </entry>

  <entry>
    <title>Most Wanted Feature</title>
    <link href="http://turborilla.com/blog/most-wanted-feature/"/>
    <id>http://yoursite/article/?i=c5601a475fd8becb82e21542a0e0db3c</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/most-wanted-feature/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mad Skills Motocross was released two months ago, but that does not stop us from updating and adding new features. However, we are uncertain as to which way to go now. So, we thought, we need quantitative feedback from fans and customers.
Please, help us. Multiplayer or different difficulty levels? Sharing tracks, or scoreboards? Cast your&#160;vote now.
Thanks for helping us making Mad Skills Motocross even better.</div></summary>
  </entry>

  <entry>
    <title>Mad Competition at Loading.se</title>
    <link href="http://turborilla.com/blog/mad-competition-at-loading-se/"/>
    <id>http://yoursite/article/?i=917196b60a01ababde8a62141cfed3d5</id>
    <updated>2010-03-25T03:30:29-07:00</updated>
    <author>
      <name>http://turborilla.com/blog/mad-competition-at-load</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Loading.se, a swedish gaming website, recently held a competition. The challenge was to get the fastest time possible on the track &#8216;Andover&#8217; in the demo of&#160;Mad Skills Motocross. The five fastest times won a free full version.

I don&#8217;t know what I was expecting really, but the skills of the competitors blew me away. They crushed my best time by almost 10 seconds, and I bloody&#160;made&#160;the game. Check out the five best races in the video below:



Results:

	L&#246;vet (33.29)
	Avgrundsvr&#229;l (37.73)
	Troppi (38.14)
	RoadHazard (38.38)
	Narcissus (39.36)

Congratulations to the winners.

PS. I think a combination of RoadHazard&#8217;s first few seconds and the rest L&#246;vets race would be able to push below 30 seconds :)</div></summary>
  </entry>

  <entry>
    <title>Riding a snowmobile/motocross hybrid</title>
    <link href="http://turborilla.com/content/view/48/41/"/>
    <id>http://yoursite/article/?i=ae4b1d9faf868ac5889b9f9377524a56</id>
    <updated>2010-02-07T23:30:29-08:00</updated>
    <author>
      <name>http://turborilla.com/content/view/48/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We enjoyed a wonderful day on Sunday, the sun was shining and the snow glittered. Also, it wasn&#39;t very cold. A perfect day for some motocross riding. A friend of mine have bought a snowmobile traction mat kit for his motocross, along with a ski for replacing the front wheel with. Thus making the motocross able to go in very deep snow like a snowmobile. The kit is called The Explorer (http://www.explorermoto.com/).Check out some pictures where we take it for a spin on a motocross track:    We should make a game out of this :)</div></summary>
  </entry>

  <entry>
    <title>Mad Skills Motocross forums</title>
    <link href="http://turborilla.com/content/view/47/41/"/>
    <id>http://yoursite/article/?i=1bff9dd57a756cd89837e664464ba2e3</id>
    <updated>2010-01-19T05:30:38-08:00</updated>
    <author>
      <name>http://turborilla.com/content/view/47/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally we have sorted out some proper forum software for discussing Mad Skills Motocross. There always was a forum here on Turborilla, but we didn&#39;t really promote it and it was messy and buggy. Now we have fixed this with a brand new install of Simple Machines Forum, and we are pimping it all over the place. Please help us get some discussions going, since it needs interesting conversations to pull people in and it needs people to provide interesting conversations. Catch 22 in all its glory.So, without further ado: Brand New Mad Skills Motocross Forums (forums/)</div></summary>
  </entry>

  <entry>
    <title>Multiple Use Labor Element</title>
    <link href="http://turborilla.com/content/view/46/41/"/>
    <id>http://yoursite/article/?i=346740e949d7a2b231abdbf85cd60109</id>
    <updated>2009-12-09T08:01:45-08:00</updated>
    <author>
      <name>http://turborilla.com/content/view/46/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">manual (http://www.planetmule.com/how-to-play)  or seen the (soon to come) instruction video you won&#39;t have a chance to understand this game. It&#39;s probably the genre furthest away from Mad Skills Motocross.About a year ago Blue Systems contacted us with the idea of a remake, and since then we&#39;ve been working on it. Now it feels great to finally release it. The development has been a bumpy ride where we&#39;ve tried lots of different play styles and graphics. What we settled on is what you can find here: www.planetmule.com (http://www.planetmule.com/) . As I&#39;m writing this Planet M.U.L.E. has over 2600 registered users and the number has been growing steadily since the release. With all the good feedback from the fans we&#39;re now working on getting an update out to improve the game.</div></summary>
  </entry>

  <entry>
    <title>Grappling Hook</title>
    <link href="http://turborilla.com/content/view/45/41/"/>
    <id>http://yoursite/article/?i=855a58f23600bfaba7a082951b485d91</id>
    <updated>2009-11-17T03:30:40-08:00</updated>
    <author>
      <name>http://turborilla.com/content/view/45/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#39;s hard for indie games to get attention in today&#39;s saturated market where games that cost more than a bag of peanuts gets hate-mailed into oblivion. Therefore we need to stick together, and do a bit of cross-promotion now and then.Me and Christian of SpeedRunGames made a deal: I review his game, he reviews mine.Now, don&#39;t think I am going to go easy on him just because we have a deal, that would make it all pointless and ruin everyone&#39;s day. So let&#39;s get on with the review of Grappling Hook.Grappling Hook Demo (http://ghook.speedrungames.com/)QAn9mw5wPNo</div></summary>
  </entry>

  <entry>
    <title>The Next Feature</title>
    <link href="http://turborilla.com/content/view/44/41/"/>
    <id>http://yoursite/article/?i=c680be624e154b7dc8b2943467e20a42</id>
    <updated>2009-10-29T07:01:17-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/44/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The results of the poll? In strong favor of Online Multiplayer: As you can see, not many voted. So, for the next time you know that your vote really makes a difference. So, time for me to dig down and start working on those ip-numbers, packets, NATs, latencies, TCP, UDP and what have you. I&#39;m pretty good at this stuff and I think I&#39;ll enjoy most of it. The boring part will, as always, be the GUI code.</div></summary>
  </entry>

  <entry>
    <title>Most Wanted Feature</title>
    <link href="http://turborilla.com/content/view/43/41/"/>
    <id>http://yoursite/article/?i=69e76796bdf1873d8d0217b05bcc7a91</id>
    <updated>2009-10-27T04:01:02-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/43/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mad Skills Motocross was released two months ago, but that does not stop us from updating and adding new features. However, we are uncertain as to which way to go now. So, we thought, we need quantitative feedback from fans and customers.Please, help us. Multiplayer or different difficulty levels? Sharing tracks, or scoreboards? Cast your vote now (http://www.madskillsmotocross.com/most-wanted-feature) .Thanks for helping us making Mad Skills Motocross even better.</div></summary>
  </entry>

  <entry>
    <title>Mad Competition at loading.se</title>
    <link href="http://turborilla.com/content/view/42/41/"/>
    <id>http://yoursite/article/?i=4510c9d27f1f022dd7e318e19e979fe6</id>
    <updated>2009-09-24T14:23:16-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/42/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Mad skills Wii remote</title>
    <link href="http://turborilla.com/content/view/41/41/"/>
    <id>http://yoursite/article/?i=c82c29bf79497238fdceb9bd4a2be843</id>
    <updated>2009-09-14T04:30:43-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/41/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As you may know (http://johnnylee.net/projects/wii/) it&#39;s possible to connect a Wii Remote to your PC. The guy doing our gameplay videos (hello Lars) did this recently and configured it for Mad Skills Motocross. This was his impression:Shit, it owns to play with the Wiimote :D. For the sake of thefeeling I&#39;ve also added Rumble on the gas. (H) You notice thedifference much more in Turbocharged. It&#39;s real lovely to do abackflip and then straighten up before landing by turning your handsinstead of pushing a button.Have a look at the video below to see it in action. If you have a Wii Remote and are interested in how to set it up for MSM, please drop a mail to peter@turborilla.com (mailto:peter@turborilla.com).eV8Ft2shnu0</div></summary>
  </entry>

  <entry>
    <title>Mad Skills Motocross coming soon</title>
    <link href="http://turborilla.com/content/view/40/41/"/>
    <id>http://yoursite/article/?i=81a7e948d69c11767a607474a6de7e07</id>
    <updated>2009-07-16T09:00:48-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/40/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I know you have heard it before, but a release date has been set for Mad Skills Motocross. This time it is for real though, and we have even gone live with the website. Check it out, if you want to know the date of release: www.MadSkillsMotocross.com (http://www.MadSkillsMotocross.com)The game has both grown and shrunk in scope since the first plan was made. This is always the case in games development, I think, because a very large part of developing a game is to experiment and see what works and what doesn&#39;t. Keep reading to find out how the game is structured nowadays.</div></summary>
  </entry>

  <entry>
    <title>Inspired by Braid</title>
    <link href="http://turborilla.com/content/view/39/41/"/>
    <id>http://yoursite/article/?i=e9bb6df775503af36bd910e1e7e5810b</id>
    <updated>2009-04-22T03:03:16-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/39/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Part of being a game developer is the chore of playing other games to find inspiration and ideas. The much-hyped (for an indie game) Braid (http://braid-game.com/) was recently released for Windows, and I just had to try it. Did that, and bought it immediately. It&#39;s a brilliant game and you should all try out the demo at least.So what has this got to do with Mad Skills Motocross, you ask? Stop playing around and get that game finished already you lazy bum, you say.I agree. However, I did get an idea from Braid. It has been done before, but this got me thinking about it. In Braid, you can play the next level even if you didn&#39;t manage to complete the previous. The mere action of playing a level unlocks the next one, so you are forced to try the levels in order, but not to complete them in order.Frankly, Braid would have been unplayable without this particular feature of its meta-structure. The puzzles are really intelligently constructed, but you still get frustrated sometimes when you can&#39;t complete them. All you need to do is continue playing and bend your mind around a few other puzzles, and then go back and complete the unfinished ones.Invaluable, because otherwise I would have shut down the game when I got frustrated. Most likely I would have returned to it later to bang my head against that particular puzzle again, but it is so much more fun to keep playing other levels than to stop playing.So that&#39;s how we are going to do it in Mad Skills Motocross, I believe. When you play the first race the second race is unlocked, and so on. But to continue to the next division, you have to win all races in the current division. So when you get stuck, just play the next race to improve your skills.What do you all think of this? Sounds like a good idea? We&#39;d love to hear your feedback in the forums (forums) or by mail (contact).</div></summary>
  </entry>

  <entry>
    <title>Timestepping</title>
    <link href="http://turborilla.com/content/view/38/41/"/>
    <id>http://yoursite/article/?i=4906c18aa785ce2deb9bf7db6d2ae21e</id>
    <updated>2009-04-06T09:01:01-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/38/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi, this is my first dev diary entry even though I&#39;ve been working at Turborilla for a while now. I plan to make more frequent posts in the future and tell you about what I&#39;m doing and get some thoughts on programming out there. Currently though I&#39;m working on a half-secret project so I can&#39;t say much about that just yet.However, if you&#39;re a games programmer you might find this (timestepping.html) interesting. I&#39;ve wanted to write that article for quite some time and now I finally got around to do it. It&#39;s been bugging me that no other article on timestepping talks enough about vertical synchronization.In shot it says that you should use a fixed time step and strive to enable vsync. Then it explains what you should think about when making your timestepping algorithm based on that goal. It covers the problem when vsync rate is different from the targeted framerate and the likely superflousness, lag and unevenness (frame time variation) of interpolated draws. Don&#39;t worry if you didn&#39;t understand the paragraph above. The non-programemr version is: It makes your game run smoother. / Peter</div></summary>
  </entry>

  <entry>
    <title>Backflip Bonanza</title>
    <link href="http://turborilla.com/content/view/37/41/"/>
    <id>http://yoursite/article/?i=d247f952f73b51a2f6f15a81db52b5ee</id>
    <updated>2009-04-02T01:31:07-07:00</updated>
    <author>
      <name>http://turborilla.com/content/view/37/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A commenter on newgrounds (http://urkel.newgrounds.com/news/post/283049)  had this to said after watching the trailers: looks like every other motocross game where you can lean forward and backwards but never quite pull off a flip So I had to make this video to shut him up:TMtkc6Kpe8I</div></summary>
  </entry>

  <entry>
    <title>Time Attack</title>
    <link href="http://turborilla.com/content/view/35/41/"/>
    <id>http://yoursite/article/?i=7c369ffd6fdf7a37c381cb83c4cfd1b0</id>
    <updated>2009-02-04T02:30:31-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Right now we are working on the Time Attack mode. In this mode you can race against yourself, at least against your previously best time. This is the shit, It really is, it&#39;s just so much fun trying to shave a few tenths of a second from your previous time.  But what if I activate the nitro before instead of after that jump over there? Let&#39;s try it. Oh, regarding the nitro. In an earlier diary entry (developer-diary/october--07--spices-and-menus.html) I said that nitro doesn&#39;t add anything to the gameplay because it&#39;s all about skill. Well, it turns out that now that we have one Arcade mode and one Simulation mode, we can happily add all sorts of crazy power-ups to Arcade and still keep Simulation intact for the purists. This was really the best solution I think, since the testers said that the game is crazy fun but will get a bit boring without new stuff coming up all the time.So now we have the Jumparoo, Nitro, Glider and Jetpack. They are all great fun, and more or less useful. I think we need one more, because they are so much fun thinking up. We have had some great brainstorming sessions over here</div></summary>
  </entry>

  <entry>
    <title>How to get a free beta</title>
    <link href="http://turborilla.com/content/view/34/41/"/>
    <id>http://yoursite/article/?i=d6eba87fa71f95a2605b9d12ddb64b0e</id>
    <updated>2009-01-29T07:30:32-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We have decided to release a free beta version of Mad Skills Motocross. There is a catch though, we won&#39;t release it until we have 1001 fans on our Facebook fan page (http://www.facebook.com/pages/Mad-Skills-Motocross/58755926184). So if you want to get the beta version of Mad Skills Motocross when we reach the magic number of fans, just go to the fan page and become a fan. It is very important that you actually become a fan, otherwise we cannot contact you to give you the secret download link. Hurry up, things can happen quickly on Facebook.On that page we have also uploaded concept art, screenshots and videos. To check them out, just go there (http://www.facebook.com/pages/Mad-Skills-Motocross/58755926184). You don&#39;t even need a Facebook user to access the page.</div></summary>
  </entry>

  <entry>
    <title>October -07 : Spices and Menus</title>
    <link href="http://turborilla.com/content/view/24/41/"/>
    <id>http://yoursite/article/?i=bf05a8ac2413023abdae989b84a69eed</id>
    <updated>2009-01-29T05:00:32-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This diary entry is about spicing up the gameplay of Mad Skills Motocross, and also about an often overlooked part of games: the menus.</div></summary>
  </entry>

  <entry>
    <title>September -07 : New graphics, screenshot</title>
    <link href="http://turborilla.com/content/view/23/41/"/>
    <id>http://yoursite/article/?i=61754d8a072b5e1c0e231d57c8294d8c</id>
    <updated>2009-01-29T05:00:32-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">New graphics from my excellent artist. Screenshots and videos of in-game action. Mad Skills Motocross is shaping up nicely and is a blast to play.</div></summary>
  </entry>

  <entry>
    <title>August -07 : Brains</title>
    <link href="http://turborilla.com/content/view/20/41/"/>
    <id>http://yoursite/article/?i=813b780a15399aad419e7a921860aa3f</id>
    <updated>2009-01-29T05:00:32-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Bad screwups, deadline woes, and the training of a brain. Information about the AI techniques being used in Mad Skills Motocross and a crash-course in Neural Nets.</div></summary>
  </entry>

  <entry>
    <title>July -07 : The beginning</title>
    <link href="http://turborilla.com/content/view/18/41/"/>
    <id>http://yoursite/article/?i=b21944c946104383c72f10ef780f2608</id>
    <updated>2009-01-29T05:00:32-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The development of Mad Skills Motocross so far. Screenshots, background, tools and libraries, implementation details, and plans for the future.</div></summary>
  </entry>

  <entry>
    <title>Vimeo doesn't like games</title>
    <link href="http://turborilla.com/content/view/33/41/"/>
    <id>http://yoursite/article/?i=6aba7041788e5edac8659f1daaf5fe02</id>
    <updated>2009-01-23T00:30:24-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apparently, Vimeo (where we hosted our latest trailer) doesn&#39;t like games. We received an email today saying that our video...</div></summary>
  </entry>

  <entry>
    <title>A particle system for jME</title>
    <link href="http://turborilla.com/content/view/31/41/"/>
    <id>http://yoursite/article/?i=cfb66475bf3874b10d9d9006ddd64dfb</id>
    <updated>2009-01-23T00:30:24-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The Turborilla Developer Diary will now be in the format of a regular blog. The lenghty articles that where its...</div></summary>
  </entry>

  <entry>
    <title>October -08 : Distractions</title>
    <link href="http://turborilla.com/content/view/30/41/"/>
    <id>http://yoursite/article/?i=e6b198142cc917a3cf6c05a34fecdfe6</id>
    <updated>2009-01-15T01:30:35-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Not much has happened development-wise, but a lot in other areas. Turborilla has hired! Read all about it here...</div></summary>
  </entry>

  <entry>
    <title>July -08: Divisions and Tracks</title>
    <link href="http://turborilla.com/content/view/29/41/"/>
    <id>http://yoursite/article/?i=868b8ec51d95b764addd3e10d49c3c49</id>
    <updated>2009-01-15T01:30:35-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The main game mode of Mad Skills Motocross is the career mode, but what does that mean? This and much...</div></summary>
  </entry>

  <entry>
    <title>April -08 : The Test Results Are In</title>
    <link href="http://turborilla.com/content/view/28/41/"/>
    <id>http://yoursite/article/?i=fecb4adeda61932c1a6dfef92d7e4423</id>
    <updated>2009-01-15T01:30:35-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The testers have given their verdict on the first alpha version of Mad Skills Motocross.</div></summary>
  </entry>

  <entry>
    <title>December -07 : Testing</title>
    <link href="http://turborilla.com/content/view/26/41/"/>
    <id>http://yoursite/article/?i=f906a767032d2a3abb07a285a7c02ae1</id>
    <updated>2009-01-15T01:30:35-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">What is the difference between alpha and beta tests? This developer diary entry describes my take on alpha and beta...</div></summary>
  </entry>

  <entry>
    <title>November -07 : Editor</title>
    <link href="http://turborilla.com/content/view/25/41/"/>
    <id>http://yoursite/article/?i=5f63ea3ee6f585593e543f9030bfe4f0</id>
    <updated>2009-01-15T01:30:35-08:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This diary entry is about the editor in Mad Skills Motocross, which will enable players to make their own tracks...</div></summary>
  </entry>

  <entry>
    <title>October -08 : Distractions</title>
    <link href="http://turborilla.com/content/view/30/27/"/>
    <id>http://yoursite/article/?i=9ef62fb8a4441e84adcd9f5632db6910</id>
    <updated>2008-10-01T08:00:30-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Not much has happened development-wise, but a lot in other areas. Turborilla has hired! Read all about it here...</div></summary>
  </entry>

  <entry>
    <title>July -08: Divisions and Tracks</title>
    <link href="http://turborilla.com/content/view/29/27/"/>
    <id>http://yoursite/article/?i=2f7cc5007ad0b76f5c44f8cd964dc488</id>
    <updated>2008-06-30T14:30:11-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The main game mode of Mad Skills Motocross is the career mode, but what does that mean? This and much...</div></summary>
  </entry>

  <entry>
    <title>April -08 : The Test Results Are In</title>
    <link href="http://turborilla.com/content/view/28/27/"/>
    <id>http://yoursite/article/?i=71e621468a3c74ce8de56780dfb56e9e</id>
    <updated>2008-05-09T20:36:54-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The testers have given their verdict on the first alpha version of Mad Skills Motocross.</div></summary>
  </entry>

  <entry>
    <title>December -07 : Testing</title>
    <link href="http://turborilla.com/content/view/26/27/"/>
    <id>http://yoursite/article/?i=b89357fb366143a2901a2c2caa3f8a6d</id>
    <updated>2008-05-09T20:36:54-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">What is the difference between alpha and beta tests? This developer diary entry describes my take on alpha and beta...</div></summary>
  </entry>

  <entry>
    <title>November -07 : Editor</title>
    <link href="http://turborilla.com/content/view/25/27/"/>
    <id>http://yoursite/article/?i=f26b67cb4572a90da72cfe5401058806</id>
    <updated>2008-05-09T20:36:54-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This diary entry is about the editor in Mad Skills Motocross, which will enable players to make their own tracks...</div></summary>
  </entry>

  <entry>
    <title>October -07 : Spices and Menus</title>
    <link href="http://turborilla.com/content/view/24/27/"/>
    <id>http://yoursite/article/?i=ddffe71a5d7dda8e7c8a33f70b8c5939</id>
    <updated>2008-05-09T20:36:54-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This diary entry is about spicing up the gameplay of Mad Skills Motocross, and also about an often overlooked part...</div></summary>
  </entry>

  <entry>
    <title>September -07 : New graphics, screenshot</title>
    <link href="http://turborilla.com/content/view/23/27/"/>
    <id>http://yoursite/article/?i=b1a422a6988fdf2c19ef8f1d3c5523e0</id>
    <updated>2008-05-09T20:36:54-07:00</updated>
    <author>
      <name>http://turborilla.com/content/vi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">New graphics from my excellent artist. Screenshots and videos of in-game action. Mad Skills Motocross is shaping up nicely and...</div></summary>
  </entry>

  <entry>
    <title>Animating Game Characters with Havok Beh</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/0u--PG7Mmao/"/>
    <id>http://yoursite/article/?i=83222138e9991c5a784ba0140530747f</id>
    <updated>2010-08-31T14:29:14-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/0u--PG7</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Over the past decade, blend trees have established themselves in the games industry as a reliable and flexible technique for animating game characters. However, it can take a lot of development time to build up an efficient runtime and powerful toolset, and obviously middleware companies are stepping up! In this interview-style presentation with Jason Turbin, you'll find out everything you need to know about Havok Behavior, the middleware animation system that powers WORLD OF ZOO (among many other titles). Jason goes behind the scenes into the architecture and implementation of Havok Behavior, and provides insights into the tools and how they are used.[...]</div></summary>
  </entry>

  <entry>
    <title>CIG '10: Computational Intelligence in G</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/9MtxIwH1XcU/"/>
    <id>http://yoursite/article/?i=a4c45b170c5f97c68862cfc7287a1588</id>
    <updated>2010-08-31T14:29:14-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/9MtxIwH</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2010. NOTE: We're currently preparing a new part of the site called AiGameDev.com PLUS, designed for students and hobbyists among you. If you'd like to give us feedback on our current plans, please read this page and sign-up to the mailing list there. Thanks! - Alex  Earlier this month, the IEEE Conference on Computational Intelligence in Games took place at the IT University in Copenhagen. Over 100 researchers from around the world showed up to present their very latest research. In between, there were inspiring keynotes from highly respected figures in the research community, with topics ranging from A-life and bottom-up aesthetics to top-down drama management. AiGameDev.com was there to cover the event, and I (Alex Champandard) gave a tutorial on the first day too. The rest of this report includes some background about the conference (including things I learned from my first attendance to this event), the state of industrial-academic collaboration (and why many researchers were so depressed because of me), a report from the various competitions run at CIG 2010 (such as the 2K BotPrize and Mario AI), and finally further references so you can find out more about the research track and the papers presented. 

Photo 1: The view just outside the ITU in Copenhagen, where the Computational Intelligence in Games conference 2010 was held.
 Some Background... CIG events have historically brought together researchers with a focus on game theory, evolutionary algorithms and neural networks, but now moving quickly into video games (e.g. 2D arcade classics or 3D action games), as well as diversifying the techniques in use. Current popular trends include monte carlo tree search and temporal difference learning. On the other side of the Atlantic, the AIIDE conference has historically focused more on the classical AI approach, such as logic reasoning and symbolic approaches. 'CIG has historically focused on game theory and evolutionary algorithms, whereas AIIDE focused more on classical AI approaches.' Having followed the erruption of tensions at AIIDE on Twitter last year, from hearing feedback from previous attendees there, combined with last year's CIG report from Luke, I was a little apprehensive about the event; it was my first "big" academic conference about game AI. However, based on its success and the feedback, this year's CIG in Copenhagen will no doubt go down as one of the best so far, setting a very high bar for next year's event in Korea. The 2010 edition of CIG officially became a conference rather than a symposium, attracted the most papers with the lowest acceptance rate (higher quality papers), and further bridged the gap between the CIG and AIIDE community as well as with industry. I very much enjoyed those few days also! The credit for this success goes to Julian Togelius and Georgios Yannakakis, the organizers from the ITU Copenhagen - one of a handful of research departments that seem to really "understand" game AI. From my seat on the organizing commitee, it was impressive watching Julian and Georgios pull off lots of great ideas, including the live stream for example, on top of a solid line-up. I also learned a few things for the next edition of our very own Paris Game AI Conference! The State of Academic Research 

Photo 2: Approximately half of the CIG 2010 attendees in the auditorium for the main track.
 On the first day of the conference this year, I gave a 1h30 tutorial about working with industry, and how best to approach collaboration. The talk included some observations about current trends in industry, to help researchers understand the big picture better and hopefully tackle better problems. I focused my talk on the academic side of things, because it'll take an inside job to fix the problems on the industry side. The crux of my argument was really that you need to pick problems very carefully, to make sure not to compete or overlap with middleware developers, consultants, open source developers, indie game developers, or even stuff that's already being done in a satisfactory way in industry. Despite preparing for this presentation more than any other I've given, and getting more developer's opinions about it than any other, I was rather apprehensive about the whole thing beforehand. From my analysis, I thought the whole situation was rather grim. Based on all papers from 2009 at both CIG and AIIDE, few researchers seemed interested in working on techniques aiming directly towards the games industry; those that were interested could use another iteration to find a breakthrough. Since the talk, based on conversations and feedback from the at CIG 2010, I realized the following: 
The part of academia that's working closely with industry is getting a much better idea of what commercial games require. The many more outlets for information are indeed proving themselves to be benefitial for the community as a whole, though there's still room for improvement in actually using the information that's available already! Industry still does not put as much focus put onto AI than say graphics or animation, and I'd say there's insufficient interest. In the case of academic research, this translates into much less funding for game AI projects, compared to the variety of animation work that seems to have less trouble finding funding from industry sources. The same goes for government funding as well, which points to a problem of notoriety of "game AI" accross the board. Multiple Ph.D. students and research groups (who are doing the more relevant work) are in a tricky situation. Either there aren't enough post-doctoral positions available in this area, or the funding is drying up due to the prestige of the area (as measured by journals). It seem that industry is not particularly open to disruptive or even innovative game AI techniques that affect the design of games anyway. So the occasional ideas that come from academia that are already applicable are not necessarily taken on board... I had trouble justifying this to a local journalist, but that unfortunately seems to be the case!
 Despite all this, my talk went down surprisingly well in the end. Most researchers thanked me for my honest perspective on things, and it was a surprisingly diplomatic presentation in the end :-) That said, even though I outlined many action steps for research groups to take, considering the bad news my tutorial carried implicitly, the whole picture remained grim. Someone said to me afterwards: "Thanks for the great talk... but it was really depressing!" There's obviously a lot to be done on both sides - and number #1 on the list must be advocacy! Steve Rabin followed the next day with his keynote about the history of game AI, and tried to pick up the mood with the amazing opportunities in design. AI has been a driving factor for innovation, as shown by the many titles in the past. However, Steve came to the same conclusion I did in his last slides; the picture remains grim for game AI research in the near future. Steve thinks there'll be incremental improvements from certain studios in industry over the next years, but it'll take a while for a disruptive technology to come along. There's no sign of this at all... 

Photo 3: Steve Rabin's keynote on the first day, delivering an inspiring and humorous look at the past of artificial intelligence in games, but an equally grim picture of the short-term future of game AI.
 Bottom-Up Aesthetics vs. Top-Down Drama In other news, the 2010 CIG conference answered the question of which famous researcher would win if they got into a fight; Espen Aarseth or Marc Cavazza. Espen won this particular battle and will no doubt turn out right in the near- to medium-future, but Marc's research is addressing interesting issues that are valuable for the long term. As he puts it: "We're inventing a new medium that nobody wants." Not yet, at least! Many of us at the conference and watching the live stream felt Espen's argument was more convincing, as the case for the bottom-up approach in the short term is incredibly compelling: 
It takes little or no technology; we can do it today.
As a simple emergent approach, it's indie friendly and low-budget.
Focusing on the bottom-up benefits gameplay directly.
It makes for more replayable experience with longer gameplay times.
Little tricks can probably help remove boring moments without a planner.
 Afterwards, Michael Mateas helped clarify a few points for me. From the narrative perspective, top-down is typically a story-driven approach whereas bottom-up is effectively character driven. If you look at it from the perspective of control system, top-down is more of a goal-driven planner where as bottom-up is characterized by more reactive techniques. (That confused me a bit!) So if you include some story-driven elements but encoded as reactive rules to help drive the narrative, then it seems to be both top-down and bottom-up - depending which perspective you're thinking about :-)   Competitions 

Photo 4: One of the CIG attendees judging a level in the open-source clone of Mario.
 Overall, the competitions were extremely useful, and went as far as drawing out practical &amp; focused approaches from many of the contestants! Maybe there's a little hacker within every academic researcher if you look deep enough? Except for a few assumptions in the competitions rules, the barriers between industry mostly disappeared during those contests, as the participants went through very similar problem solving processes than you do in industry. From my perspective it was also interesting to see the different tools chosen compared to what I would have used. 'Most contests should be run online before the conference to get statistically significant results.' In practice, however, many of the new contests had glitches, and some of the older contests seem to struggle with recent changes as well. I think most contests that require human voting and feedback should be run online before the conference, so there are more statistically significant data points than a handful of academic researchers (deciding which level is more fun or which bot looks more realistic). The Super Mario procedural level generation contest was designed to provide gameplay experiences customized to each and every player. The customizations were based on the results of playing one first fixed level, but the level chosen was extremely difficult, and by the time people got used to the controls they'd have died three times within 5s. Hardly enough information to base a customized level generation algorithm on. It turns out the data provided to the level generators was relatively coarse anyway, and it seems no entry even used the statistics to customize the levels at all. Also, confirming the noise in the evaluation method, the winning entry was a 6h hack from Ben Webber - though Peter Mawhorter's entry (his lab colleague) would probably have won hands down if it wasn't for a unicode file encoding bug that generated incredibly bizarre but playable patterns in the levels instead (think Mario levels generated by Salvatore Dali). 

Photo 5: Julian Togelius (organizer) playing what should have been the winning entry, but ended up generating random and very difficult levels due to a text file encoding bug. In the end, the levels were surprisingly playable, extremely creative and probably the most rewarding of all levels generated despite the bug!
 The 2K Bot Prize suffered a bit this year. There were fewer entries than previously, presumably due to the high barrier of entry compared to the Mario AI contest. Working with Java when most game AI code is C++ and having an outdated closed source engine doesn't help, but many developers seem to be focusing on the Starcraft competition later this year. A few factors also made the competition logistics sub-optimal: 
The whole evaluation is a set of free-for-all deathmatch games, with bots and judges playing in a large level. This results in rather chaotic gameplay with little signs of tactical play. The bots are primarily being judged on their motoric skills such as aiming/turning and moving. The movement seems to be heavily constrained by Unreal Tournament 2004's navigation implementation, and the turning still seems to be very robotic when spectatic from a first-person perspective. The judging now happens at runtime within the game. You pick the link gun and aim for the player to tag, then LEFT click to mark as bot and RIGHT click to mark as a player. You only need to do this once, but judges found themselves doing this repeatedly. Bots could judge, but were not built for it. So it was particularly easy to pick out the humans (only judges, who were judging) and the bots (who were playing normally). One judge actively tried to act like a bot, but still scored higher than the best bot. This was the result of the meta-game of having judges compete against each other to identify bots &amp; players. All judges (effectively also players) were in the same game and even the same room, so it made things easier to evaluate implicitly if you were fighting against another judge... Chances are you'd get a subtle reaction from them or a pattern in the mouse and keyboard activity.
 As I mentioned afterwards, the contest could be vastly improved by focusing on 1 vs. 1 matches with many more tactical opportunities (like Quake Live), having the human players under evaluation not be judges, and letting them make the decision of bots (or not) out of the game. The link gun may have some benefits for tagging realistic or unrealistic behaviors "online" but it could also be done more accurately by going over the recordings. 

Photo 6: A judge (Gordon Calleja) playing against the bots in Unreal Tournament 2004. Gordon not only turned out to be the best judge, but was also trying to behave like a bot. Yet he still scored 38% "humanness", noticeably above the winning bot at 31%.
 Final Thoughts We're expecting the papers from CIG 2010 to be published online shortly, and when that happens I'll write some reviews of the best papers on the blog. In the meantime, check out the recorded sessions online on Vimeo. (My tutorial is there too...) CIG 2010 was an interesting duality for me. While the conference itself was an amazing and stimulating event for me and many others there, my feeling after leaving were not the most optimistic ones. If this post seems less positive than usual, it's no coincidence! There really hasn't been much academic research &amp; collaboration for game AI in the past, and things now are still in their infancy compared to other fields of video games. It doesn't help that few industry developers attend such conferences, and once they do (e.g. to give a talk) they don't return. That said, things are on the right track! The competitions are a great way to encourage practical solutions from the community, even if I'd personally allow the AI to access all the information it wants. Also, there's much better information available to researchers so new projects are better informed. That's a big motivation for us at AiGameDev.com as well, and rest assured we're working hard on the other issues I brought up too! 

Photo 7: View from the top of the main auditorium during CIG 2010 in the IT University in Denmark.
</div></summary>
  </entry>

  <entry>
    <title>Are Waypoint Graphs Outnumbered? Not in </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/O2YSL5zZRho/"/>
    <id>http://yoursite/article/?i=24fe4f78cedb4564c61830c949e82fa8</id>
    <updated>2010-07-23T13:27:06-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/O2YSL5z</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2010.  If you've been following recent trends in game AI, you could think of navigation meshes as an angry horde set to kill off waypoint graphs. Meshes are everywhere: from the various middleware libraries presented in Paris last month like Autodesk's Kynapse, PathEngine, or Havok's to open-source implementations like Recast as well. Some veteran developers have even declared waypoint-based approaches to be obsolete... Yet, waypoint graphs are still regularly used in the games industry. I personally often recommend them - especially to independent developers - since they're a simple and effective approach to navigation, and if you're going to implement something yourself for a game, you might as well use waypoints and save yourself the torment of writing a robust navigation mesh that you may never make the most of! The recent release of AlienSwarm (free on Steam) is a perfect illustration of how waypoints are still used in practice, and are supported by Valve's Source engine. In this post, you'll find some insights into the code from the SDK (also available) as well as screenshots from the game itself. Oh, and be sure to join our official AiGameDev.com Group on the Steam Community! 

 Instructions... If you'd like to follow along with this article, you need to do a couple things once you have the game installed. Keep in mind you can click on all the images below to view the large version! 
In the AlienSwarm keyboard configuration menu, you have to enable the developer console.
When you need it, you can activate the console using the tilde (~) key below the ESC key.
You may want to setup god mode by typing asw_god 1, which should prevent you from dying while you're exploring.
Also, for screenshots disable the heads-up display (HUD) using asw_draw_hud 0.
 The SDK is installed via your TOOLS tab in the Library within Steam, and the source code is stored on disk in your Steam folder, for example C:&#92;Games&#92;Steam&#92;steamapps&#92;common&#92;alien swarm&#92;sdk_src&#92;game&#92;server. AI Nodes Technically speaking, the graph in AlienSwarm is made up of "nodes" and the term "waypoint" is used to describe the path that results from the pathfinding. Nodes are essentially points in space with additional information such as an identifier, type, additional information, a zone, etc. The data-structure used to store these nodes can be found in #/sdk_src/game/server/ai_node.[h,cpp]. 
enum NodeType_e
{ NODE_ANY, NODE_DELETED, NODE_GROUND, NODE_AIR, NODE_CLIMB, NODE_WATER }; enum NodeInfoBits_e
{ bits_NODE_CLIMB_BOTTOM = (1 &lt;&lt; 0), bits_NODE_CLIMB_ON = (1 &lt;&lt; 1), // ... bits_NODE_CLIMB_OFF_RIGHT = (1 &lt;&lt; 4), bits_NODE_CLIMB_EXIT = // ... NODE_ENT_FLAGS_SHIFT = 5, /* Flags for default and custom hulls. */
}; class CAI_Node
{
public: int m_iID; Vector m_vOrigin; float m_flVOffset[NUM_HULLS]; float m_flYaw; NodeType_e m_eNodeType; int m_eNodeInfo; int m_zone; CUtlVector&lt;CAI_Link*&gt; m_Links; float m_flNextUseTime; CAI_Hint* m_pHint; int m_iFirstShuffledLink;
};
 

Screenshot 1: Ground nodes are placed on the floor and given a NODE_GROUND type. Most aliens use these nodes.
 

Screenshot 2: Some of these nodes are aerial nodes, and have the NODE_AIR type. Flying aliens use these.
 The nodes in the levels can be placed manually using the map editing facilities from the console. AI Links Nodes are connected together via links, which implicitly creates a graph. Each node stores a set of links, and the links hold two identifiers to point towards its end nodes. The links are specified in #/sdk_src/game/server/ai_link.[h,cpp] and the resulting graph is #/sdk_src/game/server/ai_network.[h,cpp]. 
/* Edited for conciseness. */
enum Link_Info_t
{ bits_LINK_STALE_SUGGESTED = 0x01, bits_LINK_OFF = 0x02, bits_LINK_PRECISE_MOVEMENT = 0x04, bits_PREFER_AVOID = 0x08, bits_LINK_ASW_BASHABLE = 0x10,
}; class CAI_Link
{
public: short	m_iSrcID; short	m_iDestID; byte m_iAcceptedMoveTypes[NUM_HULLS]; byte	m_LinkInfo; float m_timeStaleExpires; int m_nDangerCount; CAI_DynamicLink *m_pDynamicLink;
};
 You can display the links from the console using the command ai_show_connect. 

Screenshot 3: The AI node graph in a tight corridor.
 

Screenshot 4: A small set of stairs and its node graph.
 There are two types of links: static links like in the screenshots above, which don't change during the game and can be stored very efficiently in memory. However, since some parts of the world may change, dynamic links are also required. These are hooked into the graph by having each static link store an optional pointer to a dynamic link. The dynamic links are full entities capable of receiving game events to deal with the changes around it. See the files #/sdk_src/game/server/ai_dynamiclink.[h,cpp] for details! 

Screenshot 5: Dynamic links that are currently disabled, re-enabled after nearby objects are destroyed.
 In the standard campaign, dynamic links are used when infected biomass is burned with the flamethrower, or rocks that are in the way are destroyed using the mining laser. AI Hulls The links in the graph seems to be connected via brute force, as shown in the images below. There are many links that are created which will never be used at runtime. However, these are marked as disabled - shown in red. 

Screenshot 6: The links to be checked by the convex hull collision.
 The links are disabled using a convex hull collision test. If the hull around a link collides with geometry, then it's deemed to be in-traversable at runtime and the link is turned off. You can see the hulls from the console using the variable ai_show_hull 1. 

Screenshot 7: Convex hulls associated with the previous node graph.
 

Screenshot 8: Aerial node graph and a representation of its hulls.
 There are different convex hull types for the different link types, in this case ground units and air units. The hulls for both those unit types are rendered in a different color within the game. Another Example 

 

 

 Conclusion Waypoints have picked up a bad reputation over the years, but AlienSwarm is an example of a game that seems perfectly fine with this approach. The navigation of the aliens is certainly not perfect, but this is mostly due to human-placed dynamic obstacles like turrets. Navigation meshes wouldn't resolve this problem directly either, you still need local avoidance for that... Arguably though, a navmesh would make it easier to resolve these problems and support dynamic obstacles, but getting this right is far from trivial! What's your take on waypoints and their use in AlienSwarm? Let us know and post a comment in the forums!</div></summary>
  </entry>

  <entry>
    <title>Paris Game AI Conference '10: Highlights</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/gna9dtWGGtA/"/>
    <id>http://yoursite/article/?i=4786c0cd0cb0f0d5f4772dcb0e6f85b4</id>
    <updated>2010-07-10T02:54:44-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/gna9dtW</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Find Jobs in Game AI Thanks to Our Middl</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/HuDpL26HM-M/"/>
    <id>http://yoursite/article/?i=9e0ce314a58a2690d1198df4f31f350f</id>
    <updated>2010-05-14T16:25:40-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/HuDpL26</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Grand Strategy and Political Simulation </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/VSzWszWpyGI/"/>
    <id>http://yoursite/article/?i=7f8c2b1b53853bd0b99f8e6f027dfaf1</id>
    <updated>2010-05-14T16:25:11-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/VSzWszW</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Autonomous Drivers and Racing Skills in </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/9nKda-282fc/"/>
    <id>http://yoursite/article/?i=551d029b8714717652b1e8e3a8c02c9b</id>
    <updated>2010-05-14T16:24:34-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/9nKda-2</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Autonomous Drivers and Racing Skills in </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/9nKda-282fc/"/>
    <id>http://yoursite/article/?i=7b8d7fd6ae3380f1a00630eadf913055</id>
    <updated>2010-05-05T15:57:07-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/9nKda-2</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Rubbish</div></summary>
  </entry>

  <entry>
    <title>Hierarchical Task Networks for Mission G</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/dfTqJnunle8/"/>
    <id>http://yoursite/article/?i=e3603c72fa60b61dbc52eec045fd8d21</id>
    <updated>2010-05-05T15:56:01-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/dfTqJnu</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Rubbish</div></summary>
  </entry>

  <entry>
    <title>Hierarchical Task Networks for Mission G</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/dfTqJnunle8/"/>
    <id>http://yoursite/article/?i=f712818c292c231aedf04af63701f378</id>
    <updated>2010-04-21T05:33:35-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/dfTqJnu</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">...</div></summary>
  </entry>

  <entry>
    <title>The Quest Towards the Holy Grail of AAA </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/O7yv1QTpCPo/"/>
    <id>http://yoursite/article/?i=ed11e49049fa7a6126e2f665c92476ca</id>
    <updated>2010-04-21T05:32:23-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/O7yv1QT</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Badly formatted html from someone who should know better.
</div></summary>
  </entry>

  <entry>
    <title>Non-Determinism and Statistical Outcomes</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/HNYH-As6AJY/"/>
    <id>http://yoursite/article/?i=c6fdb1e1ad3b730a3c1d62aa179a16e0</id>
    <updated>2010-04-13T13:01:08-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/HNYH-As</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2010.  I've been enjoying the OPERATION FLASHPOINT: DRAGON RISING campaign recently. In brief, the game is a large-scale open-world sandbox tactical combat simulation whose feature list would make programmers around the world whimper. The AI does a pretty impressive job considering the challenges! My playthrough, however, has occasionally thrown unintended challenges at me - in particular reloading automatic checkpoints that end in disasters within 15 seconds. But rather than start the mission from scratch, this obviously seemed to me like an invitation to play around with the simulation and figure out its underlying mechanics... In this short article, I'll look into a particular scene that ends in one of my rescue targets being shot at close range while I'm rushing away towards the pick-up zone like a coward. This raises interesting questions about determinism, level of detail and statistics - and makes a perfect topic for a developer discussion! NOTE: If combat AI and sandbox games interests you, be sure not to miss our very own Paris Game AI Conference on June 23rd and 24th, which bring together a variety of developers from FPS and action games. It Doesn't End Well (Mostly)... 

Screenshot 1: In the full 3D game, the pilot (left) ends up being shot at close range by the enemy soldier (middle) and often shoots me trying to grab a good screenshot too!
 OF:DR is not a deterministic game, like a majority of first-person shooters. Everytime I reload the checkpoint something slightly different happens, even when I don't move a muscle. When I move, obviously, things turn out even more differently. Due to the Sandbox nature of the game, this turns out to be much more interesting to play as you're forced to keep rethinking situations even after you reload... However, in my situation, the pilot I was supposed to rescue almost always ends up being shot at close range by an enemy soldier. He occasionally escapes, but as you'd expect from an un-escorted target, he indeed bites the bullet a majority of the time - despite my best efforts to find creative solutions to this predicament! Trying to make the most out of the ~15 seconds I had at my disposal to save the pilot, I tried various orders to my squad from the game, but switched to the map view when that failed. That's where things got interesting... Safety in Map Mode 

Screenshot 2: Switching to the map view, my squad (white) manages to shoot the enemy soldier (red) while moving around the center building, or the pilot (in blue) manages to sneak past without being harmed.
 By switching to the top-down map view, the statistics of the outcome changed significantly. Most of the time, the pilot managed to escape from the building he was being ambushed in! The ratio of success to failure was reversed, now 80% to 20%. Again, this wasn't guaranteed, but two new situations were the most common in map mode (that never happened otherwise while in 3D): 
If I switched to the map instantly, my squad would manage to take out the enemy threat almost immediately while moving towards my position. Without switching the map view, they'd never deal with the enemy soldier and simply end up just following me.
When waiting a moment before switching to the map, the pilot managed to sneak past the enemy target in many situations. He did occasionally get hit but that was an exception rather than a rule, unlike it was previously...
 The question arises, what could cause such a radical change in the outcome of this situation, at the mere press of the 'M' key to engage the map?  Combat Simulation Statistics... There are two ways to interpret such a large deviation in the simulation: 
There's a different simulation that kicks in when you enter map mode. This different simulation operates in such a simplified fashion (e.g. no animation) compared to the full detailed simulation that the two different encounters end up differently in practice.
The game's non-determinism is significantly affected by entering map mode. It's possible that disabling the 3D rendering allows more resources to be spent on AI. My squad responded better and the rescue target managed to deal with his threat more capably!
 It's certain that OF:DR has a level of detail implementation. You couldn't build such a game without it, and in this developer commentary on Intel's site, they mention that the animation in particular is handled differently. However, it's unlikely that the simulation would be affected by the LOD just by the press of a key to switch into map mode. 

Screenshot 3: My squad follows me around when I try to run to the target rendez-vous point like a coward rather than defend the pilot!
 The Impact of Non-Determinism This kind of in-game situation (and I guess this article too) raises more questions than it does answers. 
Does it matter that the same situations play out significantly depending on the hardware configuration and rendering settings?
Assuming you want to preserve the performance benefits of non-determinism, how can you make sure your simulation behaves similarly everwhere?
How many developers treat different hardware configurations (PC) as different SKUs and balance each of them accordingly?
If the game's simulation statistics can be affected significantly at runtime (in different situations), will it even be noticed or is it a loophole?
Is determinism a solution to all of these problems, or does it just mean we implement a lowest common denominator for gameplay and AI?
 If you have any thoughts on the subject, feel free to post a comment below!</div></summary>
  </entry>

  <entry>
    <title>14+ Reasons for Coming to Paris in June:</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/jRsch9-K5iw/"/>
    <id>http://yoursite/article/?i=e80d521592fc527aea3f5763941e5870</id>
    <updated>2010-04-07T15:31:06-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/jRsch9-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Building on the incredible success of last year's sell-out event, AiGameDev.com is proud to announce the program of the third annual Game AI Conference in Paris, co-organized with the CNAM where the event is held. This year's conference takes place on June 23rd and 24th 2010, following a workshop about character animation on June 22nd. The schedule blends invited sessions from top AI developers from industry as well as tutorials, reviews and R&amp;D oriented sessions. The organizing committee consists of Petra &amp; Alex Champandard from AiGameDev.com, Stephane Natkin from the CEDRIC lab, and Axel Buendia of the Paris-based middleware company Spir.Ops. The program committee includes Phil Carlisle, Mikko Mononen, and William van der Sterren. We'd also like to thank our three most recent sponsors, Game Talents, Havok and MASA Group for making this event possible.    

  Thanks again also to our early sponsors Autodesk and PathEngine and all other sponsors for their support and encouragement. Animation Workshop Date &amp; Location  Duration: 1 full day. Date: Tuesday 22nd, June 2010. Time: 9:00 to 18:00. Location: CNAM &#8212; Paris 3&#232;me (map) Price: &#8364;270 to &#8364;370. Extras: Lunch and coffee breaks included.
Details: See the official workshop page.
 NOTE: This workshop is intended for developers that are serious about character animation, and designed for a small group only - in the spirit of a mastermind session. There are a total of 20 seats available in the room, and approximately half of them are left.  
Photo 1: Discussions at the Paris Game AI Workshop &#8216;08.  Agenda for the Animation Workshop The day is split into four parts, each covering an important aspect of creating believable characters. While the focus is on specific behaviors &amp; features that you can integrate into your game, you'll also learn about the low-level details of the animation blend tree and how it all fits together. 
Observing: Looking Around, Gazing
Interacting: Picking Up, Touching
Locomoting: Moving Around, Taking Steps
Reacting: Being Pushed &amp; Hit Reactions
 In each part, you'll hear the most important things you need to know from multiple experts, including practical tips and simple tricks that can make the difference without a huge amount of work! You'll then work examples and problems in a small group, under the guidance and supervision of industry veterans. Game AI Conference Dates &amp; Location  Duration: 2 days. Dates: Wednesday 23rd and Thursday 24th, June 2010. Time: 9:00 to 18:00. Location: CNAM, Amphi C &#8220;Abb&#233; Gr&#233;goire&#8221; &#8212; Paris 3&#232;me (map) Price: From &#8364;77 to &#8364;97, 50% discounts available. Event: Party on the evening of the 23rd; to be announced.
Registration: See the official conference site.
 IMPORTANT: There are only 200 tickets available in the amphitheatre, and we've already sold over 160! We expect the last 30+ seats to be taken within the next couple weeks. Be sure to move quickly if you want to attend. 

 Confirmed Speakers &amp; Sessions Ken Perlin - Modern Procedural Animation  Ken Perlin is a leading expert in the field of character animation who received numerous awards for his invention of multi-layered noise. He has consulted for companies like Valve on HALF-LIFE 2 to help them improve their facial and body animations. In this invited talk, Ken will discuss how procedural techniques can complement traditional animation or motion capture in your game. Mikael Hedberg - BATTLEFIELD: BAD COMPANY 2  The most recent FPS from EA's acclaimed DICE studio certainly has its fair share of AI challenges with destructible environments, physics vehicles, and class-based gameplay. Lead AI Programmer Mikael Hedberg will share some insights about the AI for the BAD COMPANY series, what changed this time around, and how it affected the overall experience. Bruce Blumberg - WORLD OF ZOO  How do you make a virtual lion fun to interact with? Bruce Blumberg was a key member of the WORLD OF ZOO team that developed compelling AI animals for the players to observe and interact with. Previously, Bruce was a Professor at the MIT Media Lab and director of the Synthetic Characters Group. His research focuses on creating believable characters using better cognitive models, such as spatial awareness and reinforcement learning. Mikko Mononen - Local Navigation  Mikko Mononen was Lead AI on CRYSIS and programmer at Crytek. Last year, he gave the highest rated presentation, about navigation mesh generation and pathfinding. We've invited him back by popular demand! Mikko will talk about the challenges of local navigation, demonstrating existing algorithms in the field, and discussing solutions... Gwaredd Mountain - Personality Profiling in SILENT HILL  The most recent game in the survival horror series, SILENT HILL: SHATTERED MEMORIES uses a clever form of player modelling to infer which of the Big Five personality profile is dominant. Listen to Gwaredd, technical director at Climax, explain how it works and how it affects the content in the game to deliver a customized experience to the player. Think of it as another step for AI Director technology like LEFT 4 DEAD! Paolo Maninetti - Physics-based Driving in SUPERBIKE 2010  Milestone is famous among racing fans for delivering a hyper realistic driving simulation, both in V8 racing cars and superbikes. But how is the AI built to cope with such physically-accurate vehicles? Senior Programmer Paolo Maninetti will explain the basics of racing AI, in particular the low-level details like steering control and maneuvers such as overtaking and avoidance. Claudio Pedica - Social Interactions for EVE ONLINE  The makers of EVE ONLINE (CCP Games) are collaborating with Reykjavik University to build the character technology that will populate the inside of spaceships and hubs. Listen to Claudio present the motivations for the research, and discover the technology that powers these social interactions and inter-personal behaviors that help bring life tomorrow's indoor environments in space. Sponsors - The Best of AI Middleware  Discover what's new in leading AI middleware solutions thanks to this series of short microtalks. Each company is given 6 minutes to impress you by showing off an aspect of their technology. A fast pace and highly informative way to stay up-to-date with the top middleware companies!  Panel - Tales &amp; Advices from the Design Trenches  Based on last year's most popular panel with stories from the programming trenches, we've invited some designers with decades of experience to give their perspectives on the development of gameplay and AI. You'll hear from Stephane Bura, Noah Falstein, Jurie Horneman and stories from their respective game projects and careers. Alex J. Champandard - Multi-threading AI in Practice  From one to eight threads in a few months! Find out exactly how AiGameDev.com went through the process of parallelizing all aspects of the AI Sandbox, in particular the pathfinding, sensory calculations, reasoning, and animation. You'll learn about the practical challenges in each part of the code and the dirty secrets about modern computer hardware. (Warning: No Theory Included!) Further Information If you'd like more details about the conference or the workshop, be sure to visit the official site. You can also find more details here: 
Registration Details
Frequently Asked Questions
Hotels &amp; Accommodation
Contact the Team!
  Accommodation will become increasingly harder to book as the conference gets closer, and our special offer with two hotels will end on May 10th. Be sure to move quickly as Paris gets extremely busy at this time of year! Conference Sponsors  Game Talents is an agency specialized in selecting and recruiting talents exclusively for the videogame industry. We cover all positions, and all levels of experience. Game Talents is the first European videogame recruitment agency, and benefits from an international network. Game Talents brings new business models to the industry, that offer studios and candidates a win-win configuration.   Havok is the premier provider of interactive software and services for the games industry. With world leading expertise in physics, animation, and artificial intelligence, Havok&#8217;s business is to turn customers&#8217; creative aspirations into technical realities. Havok&#8217;s modular suite of tools making sure that clients can reach new standards of realism and interactivity while mitigating the cost and risks associated with creating today&#8217;s leading video games.   MASA Group is a leading provider of advanced software solutions using Artificial Intelligence technologies for modelling, simulation, games and virtual worlds. MASA products enable integrators to develop complete turn-key simulation solutions for the modelling and simulation market. MASA services and technologies help automate systems, reduce operator workload, increase fidelity and improve the "suspension of disbelief" of virtual reality simulations. </div></summary>
  </entry>

  <entry>
    <title>Case-based Reasoning and User Generated </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/76y5_GLFM-M/"/>
    <id>http://yoursite/article/?i=20c7c07322d1a99d3317d5a5471a781f</id>
    <updated>2010-04-07T15:31:06-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/76y5_GL</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Content generation for games is rarely an easy task, but when it comes to creating behaviors it's even harder! This not only makes it slow for game developers to build games, but it rules out players from leveraging their own behaviors as user-generated content. Case-based reasoning (CBR) is a technique that's starting to address these issues... In this 1h audio/video interview with Ashwin Ram, Associate Professor at the Georgia Institute of Technology and expert on CBR, you'll hear how the technology has been applied to games in research projects. You'll also find out more about how Ashwin's team is leveraging CBR to open up the AI &amp; behaviors for many games as part of the Make Me, Play Me project. This full interview from the AiGameDev.com Premium area was brought to you thanks to the sponsorship of PathEngine, a game AI middleware company specializing in navigation.[...]</div></summary>
  </entry>

  <entry>
    <title>AI Summit '10: Slides, Notes, Highlights</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/TMDEU4iDXg4/"/>
    <id>http://yoursite/article/?i=a78e5c1d0dc14016261528ecacca3e15</id>
    <updated>2010-03-24T12:57:40-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/TMDEU4i</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>On the AI Strategy for KILLZONE 2's Mult</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/cBp67_W9wR4/"/>
    <id>http://yoursite/article/?i=4e9a774b296f7585bf94fb86988c0c42</id>
    <updated>2010-03-09T12:19:01-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/cBp67_W</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Introversion's AI: From Darwinia to Mult</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/tSu_dBecSTQ/"/>
    <id>http://yoursite/article/?i=ad6b8ffb6af4870dac07eed565e6d5d3</id>
    <updated>2010-02-08T12:31:28-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/tSu_dBe</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.
Learn about the design tricks that help bring the Darwinians to life in this 1h20 interview with Chris Delay, Lead Designer and Director at Introversion - the developer of Darwinia and Multiwinia. Chris goes into details about how instinctive behaviors work and they way they brought the Darwinians to life. He also talks about implementation of the behaviors, key challenges, performance and optimization to get 2,000 entities battling in Multiwinia. The high-level strategy of the opponent AI is also explained in detail. This audio/video recording was published on January 31, 2009 for AiGameDev.com Premium members. To celebrate Introversion's release of Darwinia+ this week - and this week only - it's available free for Insiders signed-up to the site![...]</div></summary>
  </entry>

  <entry>
    <title>Global Jam Report: On Little Old Cleanin</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/kzyyF_pG73g/"/>
    <id>http://yoursite/article/?i=be446998965ff6d836a430344c22eedf</id>
    <updated>2010-02-08T12:31:28-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/kzyyF_p</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Last weekend, the Global Game Jam was held worldwide and we took the opportunity to turn it into an AI Marmalade. (For those of you that still don't get the breakfast joke: jam, marmalade. See what I did there?) Part of the AiGameDev.com "team" of contributors was available on Saturday and Sunday - Radu, Richard, and partly Nick - and I (Alex Champandard) made some changes in my usual schedule for the weekend, and we built a stealth game! As a base for the implementation, we decided to use our AI Sandbox as a framework and build this game on top. The goal of the AI Sandbox, beyond just demonstrating AI algorithms and techniques, is to be a good prototyping environment for gameplay &amp; AI - so we figured this would be a good stress test! (The AI Sandbox is currently only available to Premium members, but there's now an official site you can visit!) NOTE: Parts of this article were written by Radu Septimiu Cristea, who was the main driving force behind the coding this weekend. I'll post a video of the game after the next release of the AI Sandbox, which will include the source code. 

Screenshot 1: A screenshot from the final game. The player is in white, and guards in red. (Click to enlarge.)
 Design The idea to make a stealth game made the most sense for a few reasons: 
Such games often exhibit fascinating AI &amp; interesting gameplay dynamics.
They don't necessarily require you to implement an entire combat system!
 The design came together in discussions on Friday (and a few before). I described the basic idea in our project log in the forums: 'You play a character that's infiltrating a premise: indoor building, or outside location. Your goal is to try to get to one or more point in the building to pick up / drop off something. There are guards on patrol, and their behavior is mostly predictable. These guards move relatively slowly and don't see too far. If they get suspicious they approach the last known position, look around and repeat. An old cleaning lady is also on the premises, she's pretty smart. If she sees something, she'll keep looking and do an exhaustive and methodical search - albeit very slowly. She's there to keep the pressure on.' The idea of the little old cleaning lady was the best received on Twitter - clearly one of the best modern tools for early design feedback! The cleaner provides a good way to keep the pressure on as a gameplay mechanic, but she&#8217;s a good comedy addition to the game too. In fact, we got quite a few suggestions from other Jammers on Twitter for what the old cleaning lady could do. Anyway, That design was good enough to get started&#8230; Preparations 

Screenshot 2: The reports of our build servers, as we stabilized the repository post-merge. (Click to widen.)
 Reusing an existing framework seems like taking shortcuts for a Game Jam, but in our case it took the best part of Saturday morning to get to our starting position. In particular, we wanted to merge some experimental branches into the trunk that we&#8217;d been working on in our SVN repository: 
An improved skeleton that Richard Fredriksson has been working on. The new skeleton is designed to be much faster and simpler to mirror at runtime, and comes with its own Rig in our animation tools.
The 2D grid for pathfinding that Nick Samarin had implemented as a dynamic alternative to the waypoint graph, similar to UNCHARTED 2.
 It paid off in the end, however. We managed to reuse everything, including the A* pathfinding, the navigation, the locomotion, and the basic character animation to build a real 3D game. Also, since Richard had the character Rig, we managed to make some new walk animations when we needed them. Nick&#8217;s code was intended to be the base of the occupancy grid that the cleaning lady would use to hunt you down, but unfortunately we didn&#8217;t get around to implementing that&#8230; From then on, we could start work on the behaviors. NPC Behaviors, by Radu Once the preparation were over, the starting point of our game was a skeleton of the Hide &amp; Seek demo. After removing the code that was not needed, the first order of business was creating two brain components for the guard and cleaning lady. It soon became apparent that this is going to be the perfect time to stress test out the behavior tree framework and the helper functionality that came with it, namely the tree builder. Where the guards BT was somewhat similar to the seekers in the Hide &amp; Seek demo, the star of the show was the cleaning lady&#8217;s BT. It consisted of three main parts. The idle part - represented by the cleaning around behavior; the suspicious part, which called for movement in the direction of the most likely player position and finally the combat part that made the cleaning lady call the guards on the player&#8217;s position. Careful monitoring insured a reactive BT that would reliably switch from one part to another, depending on the world state. This was insured by the monitor and check node decorators that used atomic conditional actions that did the actual state checks. Being under time pressure I didn&#8217;t fully use the modules that the framework provides and some code duplication issues are visible. Fortunately, I plan to refactor the code into reusable modules that use the build-in-place construction technique. This would especially help out with the game state monitoring nodes. 

Screenshot 3: A test level that Radu hand-designed, along with the cleaning lady in yellow who just alerted the guard in red. (Click to enlarge.)
 Another problem that we had to solve was one of &#8220;communication&#8221; between the level dwellers. The cleaning lady notified the guards of the players&#8217; intrusion by setting a flag in its brain blackboard and subsequently a controller would read the flag and dispatch that message to the guards. I found this technique really lacking and the fact that it would not scale very well pretty obvious. The use of an event system would be really well suited to solve this problem of inter-actor notification. The recently added reasoning layer (as described in the masterclass with Damian Isla) was adapted to handle IsInView interrogations from the BT conditional actions. As we have seen in our previous implementation of this reasoning layer, this proves to be a very powerful technique greatly simplifying the actual BT actions that just have to pull data from this layer. The layer made heavy use of the underlying Query &#8211; Job Processor, constantly sending LOS queries to the sensory system. At this point it was obvious that the LOS queries and inherent querying mechanism was not flexible enough, having to hardcode the field of view in the LOS job. Navigation &amp; Moving Targets, by Alex 

Screenshot 4: Four guards following the player while moving around, with the debug rendering for the navigation enabled. In red pixelated sprites you see the patrol routes and the last known player position. (Click to enlarge.)
 One thing that inevitably came up was the navigation system. So far, it was only used for situations where the targets were static and the AI planned ahead until its next destination. When used on dynamic targets, there were problems with starting and stopping every time the target changed. Radu mentioned these concerns: 'One concern was the navigation system, having to handle a constantly changing destination point and keep the motion fluent enough to make chasing the player exciting and engaging. This concern was laid to rest sometime Sunday afternoon when I got the first glimpse of the walk animation from Rikki and improvements in the navigation system from Alex.' Supporting dynamic targets in a navigation system is a topic that often comes up, and the best solution is often the easiest. When the target has moved a certain distance (say 5m) then run the pathfinder again, or if the target has moved a bit and a certain time has elapsed (say 5s) then also run the pathfinder again. The only change that was required in the AI Sandbox code was to not tell Locomotion system to stop and go into Idle, and instead keep it Running. The results look pretty good, despite some issues in the underlying locomotion... Locomotion Improvements, by Alex 

Screenshot 5: The set of walking motion clips (individual steps) that make up the walking motion graph. In yellow are left to right steps, and in white are right to left steps. (Click to enlarge.)
 So far, we've only used running motions in the AI Sandbox since the motion capture we used was focused on running, jogging and sprinting. There were also some walks, but they weren't as useful nor as good quality animations. Luckily, Richard touched them up for the new skeleton, and re-exported them and so I had something to work with. However, I ran into a bit of trouble with the motion graph code&#8230; The core of the problem was the footplant detector. I need to detect footplants for the different types of motion, so they can be aligned when the foot is down. For the running motions, I managed to create a function that extracts local minima of the feet position, and filters out the false positives to hopefully end up with only the exact footplants. However, this broke for the new walks and I had to make some adjustments to thresholds and various parameters. The code works fine now, but in retrospect there are a few problems with our current solution, in particular that the code finds footplants one side at a time, and does not consider the other foot nor the rest of the body. There&#8217;s lots of academic research on the topic, but so far we&#8217;ve not needed it. That may not be the case for much longer! One last problem that remains is a question of alignment in the motion graph builder. The two walk steps are not aligned or synchronized quite perfectly, which leads to a zombie like walk. It works well enough for this game though, since it is supposed to be an old cleaning lady, but this part of the code will need reworking a little in the future&#8230; Game Logic &amp; User Interface, by Radu Another technique that proved its value was the Model-View-Controller pattern. I was quickly able to get a &#8220;treasure&#8221; entity and graphical representation in the world, but I was very surprised how I was able to create a game state controller class that handled win/loose conditions and plug painlessly plug it into the main controller manager class of the game. The duties of the controller that handled the burden of handling the game state included monitoring of the player position in regards to the guards, checking if the player collected all the gold on the map. While collecting all the gold would trigger loading of the next level, the consequence of getting caught by the guard was basically a game reset. The reset, as trivial as it sounds, implied resetting player position and gold, resetting the blackboards and positions of the NPCs and finally stopping the execution of the BT interpreter. Except the behavior part, everything went smoothly. Resetting the behavior called for cleaning of the blackboard that holds a considerable amount of data. It became apparent that in the near future this has to be broken up into smaller components (ordering, visualization flags, patrol data&#8230;) to avoid the monolithic construct that the blackboard is slowly becoming as it holds more and more data. Another minor issue was stopping the interpreter that called for a stop feature to the Brain base class in the behavior library. As necessity is the mother of invention, this feature will surely make it in the next sandbox release. 

Screenshot 6: The user interface elements all together, including top-left progress icons, over-head indicators for each NPC, and the game logic overlay for winning/losing the game. (Click to enlarge.)
 With a couple of hours left on the clock, and energy resources slowly dwindling I got to revisit the UI system I have written some months ago. The test driven development approach used a while back, suggested and enforced by Alex, really paid off in full. The UI code quickly fell into place with the use of the WidgetHelpers and behaved as expected without any problems. Most of the time was spent tweaking colors, timing and finding nice pictures to use. Gameplay &amp; Levels, by Alex In parallel, I was working on the camera system. I started out experimenting with a GTA-like follow camera; being involved so closely certainly increased the tension of the game. However, such cameras often need a lot of fine tuning to work, for example to avoid obstacles when walking close by, to move into better positions to help the player visualize the scene. Instead, I reverted back to the top-down camera which we used for early development, but I moved it lower down to only about 25 meters above the ground and added smooth following movement. This camera works relatively well because you can see the action locally around you (as the player), but you can't see the whole level. You still have to be careful locally, but you have enough information to be tactical. Also, it makes it much easier to see what the AI is doing, so we can show it off in a better light this way, for instance watching the old cleaning woman track you down! After that, Radu and I spend a bit of time tweaking variables that affected the AI, for instance the field of view or maximum view distance, and various timers that trigger behaviors. Speed and movement of the player relative to the guards was also an important thing to adjust, and I experimented with a simple sprint button locally to help you loose guards if you get into too much trouble. Finally, I finished of implementing random level generation, so you get some nice structured levels (with walls and recognizable features) that are beyond just randomly placed blocks. Summary The biggest lesson learned here is probably the most common from Game Jams: short events are really great for focusing attention and development on ambitious yet achievable goals. This was both great for those of us that worked on the game, but also for the AI Sandbox itself. We now have a much clearer picture of where to spend our time - although many of the things that came up were already known issues! Beyond that, a big take-away for me was the real-world value of unit testing. Not just automated testing, we have functional tests for most of the components and systems. I mean specifically unit testing. The parts of the code that were unit tested "Just Worked" and scaled whenever we needed them without sweating. This was the case for my Behavior Tree code and Radu's User Interface code. The pathfinding in the navigation that Jad Nohra wrote with tests also had no issues... However, the locomotion builder and its component caused lots of trouble - and those have little or no unit tests. Going forward, we will be holding these AI Marmalades more often, possibly once every month or two. They'll help apply our code and bring the team together for a weekend event! As a result, we'll also have a large prioritized list of things to work on for the AI Sandbox, as we do now!</div></summary>
  </entry>

  <entry>
    <title>Would You Like Some AI Marmalade to Acco</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/DSIu4apnA-8/"/>
    <id>http://yoursite/article/?i=a99377994f9f30457d06f2fbfcc68834</id>
    <updated>2010-01-27T10:02:05-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/DSIu4ap</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  The Global Game Jam will take place worldwide this weekend. For those of you participating that are looking for a challenge, fresh ideas to distinguish your game, moral support or help for building your AI, then the AI Marmalade is for you! AiGameDev.com is proud to announce the AI Marmalade, which will take place on January 29-31 at the same time as the Global Game Jam. You don't have to be at an official Jam location to participate in the Marmalade; in fact you can do it from anywhere! Here's how it works... What Is the AI Marmalade? The AI Marmalade is a common underlying theme for the Global Game Jam. If you're interested in pushing the boundaries of Game AI or just learning something new in this area, then join in! The AI Marmalade is here to help by providing: 
Inspiration and Ideas - If you'd like to design something innovative, or find a topic that explores artificial intelligence in games, then come and talk to us!
Technical Advice - We'll also be around for programming support if you need it. Brainstorm about solutions with the resident experts at AiGameDev.com!
Feedback or Comments - As you get something up and running, you need play testers or a review of your design, we'll be there too.
 You can at least count on Phil Carlisle and I (Alex Champandard) on being around, and presumably the regulars in the forums and IRC channel too. Where Will it Happen? The AI Marmalade will take place online, so you can join in from whatever location of the Game Jam you chose. In particular  
The Official #gameai channel on IRC.freenode.net. Join us at any time during the weekend to discuss any of the topics above.
The AiGameDev.com forums. Use the Projects forum to post reports of your progress, screenshots, videos, descriptions, etc.
We may even use our online meeting room with audio and whiteboard to brainstorm or explain things if necessary.
 If in doubt, join the IRC channel and you'll find friendly people to help at most times of the day! How Does it End? We'll finish the AI Marmalade at the same time as the Global Game Jam. However, afterwards we'll post about all the games, screenshots, descriptions, videos on the AiGameDev.com blog. That's all you need to know... I hope to see you on IRC or in the forums this Saturday and Sunday. 

 Let's make some AI Marmalade!</div></summary>
  </entry>

  <entry>
    <title>Predictions in Retrospect, Trends, Key M</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/DlEZlWNBY7A/"/>
    <id>http://yoursite/article/?i=1556103b51f09fef85208eb2593354a7</id>
    <updated>2010-01-25T17:31:03-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/DlEZlWN</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  2009 has been a very important year for game AI as a discipline, possibly one of the most significant yet. I feel a bit less guilty about struggling to keep up with everything just looking at how fast our field is moving! In this editorial, I'll break down some of the things I expected to happen and what actually did happen. There were also quite a few significant moments this year, as well as a few controversies, which I'll describe in their juicy details as well. I'd love to hear from you what you thought was significant about 2009, and which moments you think we'll remember in the distant future! Please post a comment below. Also, while you're in the forums, don't hesitate to share some of your predictions for 2010... Look Back at 2009 Predictions I posted my predictions for 2009 in this forum thread. They were... #1
More Experience Management 

 The first thing on my list of predictions was based on LEFT 4 DEAD 1's momentum in last year's Awards and critical acclaim: 'Use of high-level AI as experience management (the big gain, better gameplay), and slowly moving towards better procedural narrative.' The key word in there was slowly. Certainly, there has been some progress in this area. For example: 
UNCHARTED 2: AMONG THIEVES - This game had a very complete in-game context-sensitive hints system which made sure you'd never get stuck. However, some players felt it was a little too aggressive in helping you out while you were still thinking about a solution!
LEFT 4 DEAD 2 - The concept wasn't broken, so Valve didn't make too many changes to the core mechanics. If anything, the zombies were made a bit more aggressive and the hordes seem to be more frequent. The new features of the AI Director 2.0 seem to be either scripted (e.g. weather in Hard Rain) or random (e.g. the procedural geometry).
HALO 3: ODST - Bungie's latest game introduced an open-world hub which required a mechanism to guide the player towards interesting areas. You can see this in action in the CO-OP review of the game. See the screenshow below with the yellow highlight.
 Even though it's a variation on a concept that you can find in the user interfaces of many games before, HALO 3: ODST's design is interesting as it's more subtle and blends with the world better. It feels more like "experience management" rather than a gameplay mechanic displayed on a UI. Matt Chandronait from Area5.tv mentions this in his review: 'I thought the environmental cues did a really good job. The AI that controls the city is guiding you around subtly to different areas.' The big open questions for 2010 are how to take this experience management beyond layered randomness for scenario alterations, beyond an in-game hints system that helps you complete a linear story, and beyond a user-interface displays that help you orient yourself in the world. Can these things be combined? What other opportunities are there to adapt the game to the player and make it more fun to play? #2
Thriving Indie Game AI Scene 

 There's always been a trickle of talented developers from big publishers going independent, but I predicted an increase at the start of 2009: 'The rise of independent game developers, using less conventional AI.' It's been a prolific year for independent games and with more layoffs from big publishers more talented developers are becoming independent developers. What's particularly interesting is the different techniques that independent developers are using, in particular:  AI WAR: FLEET COMMAND - This indie game is the brainchild of Chris Park, who comes from a database background. He used those ideas to manage the simulation of tens of thousands of ships. GALACTIC ARMS RACE - Implemented by Ken Stanley's team, this game's purpose is to demonstrate content generation research technology. It certainly poses more questions than it answers!
 This diversity is very healthy for the industry as a whole, and I think it's arguably the best way for new ideas to make their way into the mainstream. That said, it will take a bit more time to see the indie scene really shine, for example with character AI. But there are many things to look forward to in 2010... In particular, look forward to contributions from Damian Isla and Borut Pfeifer. #3
Progress in Character Animation 

 In early 2009, I rather ambitiously predicted the following: 'Developers place much focus on character animation / locomotion, and reach a near-consensus how to "solve" it.' Games such as ASSASSIN'S CREED 2 and UNCHARTED 2: AMONG THIEVES (among others) are leading by example. It's now more obvious what kind of technology makes up a cutting-edge game animation system:  State-based blend tree, Multi-layered blending, Motion capture driven, Inverse kinematics solvers, ...and occasional ragdolls.
 In the future, there are going to be variations on this theme and improvements in each of the components. But the overall approach has established itself over the past few years, and it's solid enough to move forwards. As for locomotion, there are still some sliding artefacts for things like walking and running. I'd argue we can still make good progress in this department, as I hinted in my presentation at the Game Developer's Conference where I talked about the holy grail of locomotion. However, we're not quite there yet; it'll take a few years more - though it's refreshing to hear about studios attempting this now! #4
Industry Consolidation At the start of the year, based on the economic downturn, I predicted the following: 'Industry consolidation in the middleware business in general, possibly with big publishers buying startups.' Buy outs or mergers didn't happen as I expected. Big publishers have been spending less money, cutting staff, and investing in social media rather than technology companies. All the middleware companies working in artificial intelligence are still officially in business though! That said, middleware companies have been collaborating increasingly together - which is arguably a form of consolidation. Many AI vendors have worked on the integration of their solutions within third-party engines, in an attempt to reach more customers. There's also been a "Race to the Bottom" and a competition based on low price or free services, for instance providing free integration or cheap licenses for independent developers. #5
Useful Multi-threading 

 Parallelism and multi-threading isn't new to 2009, but I predicted last year to be a turning point: 'More talk about useful multi-threading beyond "cosmetic improvements" (from all sides) and good prototypes emerge showing this.' While more and more games leverage multi-threading, both on console platforms like UNCHARTED 2: AMONG THIEVES, or on the PC like OPERATION FLASHPOINT: DRAGON RISING to great effect, games that leverage these resources for AI are few and far between. KILLZONE 2 is another great example of leveraging current-generation "fixed" console hardware (in this case PS3) for the purposes of artificial intelligence. In terms of massive parallelism and large scale multi-core applications on more flexible hardware (like on the PC), the responses beyond cosmetic improvements are mixed: 
CUDA applied to a simulation of flocking planes (see this YouTube video). It's a promising approach, although the question is how this will work as a game.
Intel's TBB used for scaling up ambient animation and AI. This works in practice easily, though the improvements are not as impressive.
 The big question is whether better hardware can be leveraged for AI at all, without it becoming a very different game. I mean, if you're using 1 TFlops extra computation for your AI, that's going to affect the gameplay - so you'll have to treat it as a separate game. A second big topic is how we can push the limits of console hardware with multi-threading, while still preserving the determinism of the simulation required by many networked games these days. Along these lines, 2009 did bring the advent of promising technologies such as OpenCL, CUDA, and Intel's TBB. OpenCL in particular seems to be the most promising, as I discuss below. Bonus
Academic Integration In retrospect, this last bonus prediction of mine was a little overly ambitious! I claimed: 'More academic AI concepts/ideas/techniques make it into industry thanks to a better flow of research knowledge.' There's certainly been some transfer of knowledge in the area, as the awards for Most Influential Research in our 2009 Awards indicated. That said, objectively it's hard to claim the situation is improving. In fact, subjectively it feels like the divide is getting bigger - as I mention in more details below. I remain optimistic about this, but it will take a long time. From reviewing recent conferences, I get the sense part of the new generation of research associates and Ph.D. students are better in touch with industry, and of course this will help educate professors and supervisors that don't have a gaming background. But I also hope that the tight budgets this year help increasingly raise the bar, and make institutions a bit more competitive at providing useful research for industry. Trends for 2009 in Retrospect #1
Parallelism and Data-Oriented Design 

 Because of particularly long console hardware cycles, game developers have been able to spend more time optimizing their software. What the programmers have increasingly found is that memory is the biggest concern as well as the most precious resource.  Tony Albrecht's Latency Elephant Article Mike Acton's Sketches on Concurrency, Data Design and Performance Data-Oriented Design on Game Developer Magazine
 How does this affect AI? As we apply multi-threading to various aspects of the collision raytests or pathfinding searches, understanding the layout of the data is becoming particularly important. Beyond that, as these low-level parts of the AI are optimized, the high-level AI - in particular behavior trees - impose a huge toll on the cache. #2
The Challenges of Sandbox AI 

 It's always tough to find enough time to polish the AI in any game, if you want to keep your deadlines! However, sandbox games have it particularly tough... When I interviewed Mikko Mononen 18 months ago, we also discussed his work as Lead AI Programmer on Crysis, a game which certainly had its fair share of YouTube fan clips made about the AI's bugs after launch. However, a few patches later and the game's AI on Hard mode is still cited in gaming forums as a reference for combat AI. I attribute such bugs to the complexity of making AI for sandbox games. Because there's just so much more that can happen in open worlds, there are more edges to smoothen out. If anything, this year has seen more sandbox games than any other year, so there are quite a few examples to draw upon, ranging from super-hero style city combat games to highly realistic military simulations. With few exceptions, the AI that shipped in those sandbox games this year originally received criticism in their reviews - only for the bugs to be addressed later via multiple patches. Is there hope for solid AI in a Sandbox game at launch? #3
Better Characters: Money Talks 

 This year, the bar has been raised for non-player characters thanks to games such as DRAGON AGE: ORIGINS, GRAND THEFT AUTO: GAY TONY and of course UNCHARTED 2: AMONG THIEVES. As resident expert Phil Carlisle pointed out however, there's a direct correlation between the quality of the results and the amount of money spent. In particular, things like: 
Voice acting Motion capture
Hand animation
Facial expressions
Texturing and modeling
 The AI &amp; behavior comes into play afterwards, but it's main responsibility seems to not break the illusion once the character has been established with all these other expensive and time consuming processes! In particular, the whole process of hiring actors, rehearsing and shooting the scenes has had more impact on the critical reception of UNCHARTED 2: AMONG THIEVES than any other game. Watch the Behind The Scenes video Our Process Was Different and see how important this was for establishing the characters, compared to anything the AI could do. #4
Utility-based Architectures Utility-based architectures describe a whole decision making system that chooses actions based on individual floating-point numbers that indicate value. (At least that's as close to an official definition I can come up with.) Utility in itself isn't new, and you'll no doubt remember using it as a voting or scoring system for specific problems like threat selection, target selection, etc. What's new in 2009 for is: 
There's now an agreed-upon name for this architecture: utility-based, which is much more reflective of how it works. Previous names, such as "Goal-Based Architectures" that Kevin Dill used were particularly overloaded already.
A group of developers advocate building entire architectures around utility, and not only sprinkling these old-school scoring-systems around your AI as you need them.
 The second point is probably the most controversial. That said, there are entire middleware engines, such as motivational graphs which have been effective in military training programs, and Spir.Ops' drive-based engine applied in other virtual simulations. The discussion about applicability to games is worth another article in itself, and the debate will certainly continue into 2010! #5
Would You Like to... Parkour With Me? 

 A general trend for the last few years has been the rise of Parkour-based movement. What's special about 2009, is that the AI seems to be following in the player avatar's footsteps, notably in traversing the world in a more complex manner than before... Notable examples are: 
UNCHARTED 2: AMONG THIEVES - As Christian Gyrling mentioned in his interview with me last year, making the AI NPCs traverse as well as the player was a major goal for this sequel.
ASSASSIN'S CREED 2 - When you cause trouble in the game, soldiers will somehow find their way on to the rooftops to challenge you, though they don't seem to be quite as agile as the player (by design).
 It's great to see that NPCs with better abilities that are symetrical with the player's has indeed improve the diversity of the gameplay! #6
Academic Rift 

 The main academic conferences in game AI this year, AIIDE and CIG, brought together academics (mostly) with a handful of developers from industry - in a similar format to previous years. What was new this year is that tensions at AIIDE erupted onto Twitter. It's a bit difficult to piece together 140 charater messages to figure out what caused these underlying tensions to bubble to the surface, but what seemed to be missing was someone neutral to arbitrate and reprimand the cheeky or out-of-line comments from both sides! Reading back about the 2007 and 2005 editions of AIIDE from Tara Teich's notes, it seems this "disconnect" between academia and industry has been there since the start - most likely due to the format of the event. For CIG, the problem is less obvious as the conference attracts fewer people from industry. Luckily, research keeps going and now there's more information flowing from industry conferences &amp; publications the relevance of research projects can only improve... #7
The Rise of the GPU 

 This year started out with a marketing drive from NVIDIA and AMD to establish the benefits of GPGPU computations for game AI. The idea is that general purpose processing units on graphics cards (GPGPU) would be ideal for certain pathfinding operations in dynamic worlds. The article cited Relic's Chris Jurney, who used such techniques on Dawn of War 2. Interestingly enough, Chris Jurney wasn't even aware of this marketing drive, and only found out about it when I mentioned it to him! (This was during the HPAA* masterclass with Daniel Harabor, if you have a Premium AiGameDev.com account.) Chris Jurney then went on to elaborate how there were significant issues with using a GPU for AI, in particular Dawn of War 2, since the entire engine must be deterministic for networking reasons, and no graphics driver could guarantee that. Since then, however, OpenCL hit the scene and its standard apparently guarantees a deterministic implementation... At this stage, we can still only speculate about applications though. #8
Behavior Trees Everywhere 

 If there was a battle over the past few years for an AI technique that could provide scalable, designer-controllable, programmer-extensible behaviors - then behavior trees would have won it in 2009. Games this year including [PROTOTYPE], DARK SECTOR, UNCHARTED 2: AMONG THIEVES, HALO 3: ODST (and many indie games) are all using a variation of behavior trees under the hood. This trend is in my opinion due to the strength of the technique, plus the fact it describes the many patterns that actually work and that game developers use in practice. I like to think of behavior trees as the first thing you should establish, as it gives you a framework to insert any other decision-making technique into your AI in a modular way. Of course, our evangelism of behavior trees here on AiGameDev.com may also have helped a bit! Notable Moments in 2009 #1
Industry Conferences &amp; Events 

Photo: The audience at the Paris Game AI Conference 2009.
 Artificial intelligence in games has always had its fair share of academic conferences. However, 2009 marked the year of industry events on the subject. In March, the inaugural AI Summit took place at the GDC. This event was a highlight of the first two days at GDC, otherwise normally made up of a "series of press releases" in sponsored events - as one attendee told me! The down side is that this Summit sucked the AI out of the rest of the GDC, which seemed rather bland in comparison. In June, AiGameDev.com ran its second annual Paris Game AI Conference. This standalone event brought together around 200 people from around the world, in contrast mostly programmers from industry, middleware developers and students. This conference was unique in its friendly atmosphere, and everyone in the audience attended specifically because of their passion in game AI. In case you missed it, the event will return by popular demand in 2010! #2
What's the IGDA AI SIG? 

 The Game Developer's Conference 2009 featured a roundtable about the IGDA 's AI SIG. It's a officially a "Special Interest Group" like many other SIGs in the IGDA. The AI SIG is infamous for its AI Standards Committee, which unofficially went into cardiac arrest silently a few years ago without a defibrillator nearby. The roundtable was the most uncomfortable GDC session I've ever been to, firstly because the topic of the AIISC was not officially on the agenda, and discussion was rushed along awkwardly when the topic came up. Secondly, there was almost no acknowledgement that the AI SIG is only an annual newsletter, and that nobody will actually implement the ideas discussed. Andrew Armstrong, a very active IGDA contributor, asked about this and there was no answer. Here's Andrew's report of the roundtable: 'Something that annoyed me was, despite this being a sometimes good set of ideas being put forwards, without anyone actually wanting to do the work, nothing will get done and the SIG will continue to stagnate. None of the ideas raised are easy to do.' I had lengthy discussions with IGDA members from other SIGs about this subsequently... We came to the conclusion and a big problem seems to be the process these special interest groups go through. The chairperson can be self-proclaimed and there's nothing that can be done about it. In fact, people with the drive and initiative about their respective "special interests" tend to be driven away from under the IGDA's wing for these reasons - although it varies depending on the SIG and the chairperson. It's certainly the case with the IGDA AI SIG. For reference, the rest of the year since the roundtable has been entirely quiet on the IGDA AI SIG front, as Andrew suspected would be the case. #3
R.I.P. AI Game Programming Wisdom 
  
 The bad news of the year came as an announcement just before the Paris Game AI Conference 2009; the AI Game Programming Wisdom series was terminated by the publisher. Steve Rabin (series editor) and I were discussing the book publishing business generally after the AI Summit; we were joking that websites like AiGameDev.com and our Premium area are one of the reasons why books are having a hard time... Little did we know that a few months later, the series would be permanently shelved. The four books in the series will remain on the desks of serious programmers in industry, and hopefully future papers will be published via more academic channels such as AIIDE, TCIAIG or CIG. #4
Mikko Mononen's Recast 

 In April this year, Mikko Mononen (Lead AI on Crysis and ex-Programmer at Crytek) released his navigation mesh and pathfinding library called Recast and Detour, which have since become open source. The libraries have since been stimulating a burgeoning indie game development scene, which was severely lacking an open-source pathfinding library. For me, it was most incredible to see the professional respect and encouragement towards Mikko from established middleware companies - excluding of course the vendor that threatened to sue! Of course in the long run, such a library can only improve AI in the open-source community as well as industry as a whole. #5
Infinite Mario Goes Mainstream 

 At CIG this year there was a Mario AI Competition, held alongside the usual Bot Prize in Unreal. The competition hit the mainstream press thanks to Robin Baumgarten's A*-based implementation that showed Mario solving an infinite level. Such a widespread coverage of this as news was quite incredible to watch, including Robin's interviews with reputable print newspapers. This in itself was more of an achievement than the competition itself, showing off the power of AI in computer games to the masses. I certainly hope this inspired some people to get into game AI! Conclusion Now you can see why 2009 was such an important year for game AI as a field and an industry. It's hard to believe how things changed over the past few years let alone this decade! Stay tuned for the follow-up with predictions for (the rest of) 2010. Be sure to post your own predictions for the coming year in the forums in the meantime. NOTE: Make sure you don't miss out on all the action in 2010, and sign-up now for our Paris Game AI Conference this year. Tickets are already available!</div></summary>
  </entry>

  <entry>
    <title>Announcing the Paris Game AI Conference </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/0kDiQtki8M0/"/>
    <id>http://yoursite/article/?i=82a66a9c128e5bd4a75df05e4c970d50</id>
    <updated>2010-01-13T12:40:56-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/0kDiQtk</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Those of you who stay up-to-date with AiGameDev.com behind the scenes (on Twitter or in the Forums) know that we've been preparing the 2010 edition of the Paris Game AI Conference for many months already. Organizing last year's event entirely was one of the most rewarding moments of my career, but at the same time it was probably the most difficult thing Petra (Mrs. AiGameDev.com) &amp; I had done so far professionally! It took a lot of preparation and scouting around before committing to taking the event into its third year, but thanks to your tremendous feedback from 2009 and early support from our Conference Sponsors this year, we're pleased to announce that we'll return to the CNAM in June. In particular, we'd like to thank Autodesk, PathEngine, Spir.Ops, and Four Door Lemon for their sponsorship and making it possible. 





 Read on for details about the conference itself, the call for proposals, and how you can secure your seat at the event... The (Un)Official Details Officially, the event is scheduled for the 23rd and 24th of June and is co-organized by AiGameDev.com and the CNAM, where the event is held. The organizing committee consists of Petra &amp; Alex Champandard from AiGameDev.com, Stephane Natkin from the CEDRIC lab, and Axel Buendia of the Paris-based AI middleware company Spir.Ops. You can check the standalone site below for more details... Paris Game AI Conference - Official Website  

Photo 1: Q&amp;A with the audience at the end of the Paris Game AI Conference 2009. (Click to enlarge if you recognize someone!)
 Unofficially, I think the conference is absolutely unique. Of course, it brings together many of the brightest game developers in the world working on artificial intelligence in industry, including Ubisoft, Crytek, Arkane, Splash Damage, Rebellion, Quantic Dream, etc. But beyond that, it's what you said about the event that made it unique... 
Friendly - Outside the amphi-theatre in the photo above, there's a small-sized courtyard. You'd think this wouldn't be a feature of the event, but seeing almost 200 people chatting there about the practical side of game AI during coffee breaks made it obvious. At bigger conferences, people just disappear after sessions to hang out with people they knew before. Here, the busy courtyard was a great opportunity to network without pressure.
Passionate - Everyone who came to Paris in 2009 came especially for the conference. These were actual developers from industry, designers, technical animators, students in computer science, programmers from other fields, etc. At larger conferences, many business-minded people, PR or managers tend to show up rather than developers, and frankly, they have nowhere near as much passion for game AI!
 I don't believe this is a coincidence. We never set out to achieve this explicitly, but that's the kind of energy we put into the organization and the event itself, so it's not a surprise that's how it turned out. The little decisions and lucky breaks, from making the conference affordable to finding a great venue, all contribute to this! For 2010, we won't be changing the recipe of the event, though there's always room for improvement with the various ingredients. Rest assured, we're working on that already. :-) Tickets, Registration and Bonuses! Last year's event was completely free to attend, which contributed significantly to the unique atmosphere and that almost palpable passion . However, it was also one of the main reasons we spent so much time managing the event. This year, it'll cost a symbolic amount between &#8364;47 and &#8364;97 to attend depending how you choose to sign up, and subject to the following discounts. You can get 50% off the listed price under these conditions: 
If you're a Premium member at AiGameDev.com,
If you're currently an under-graduate Student,
If you're specifically traveling from outside of Europe.
 The first Silver (&#8364;77) and Gold (&#8364;97) tickets will be available on the official conference site from January 15th onwards, at exactly 13:00 CET or 12:00 GMT. This is the best way to secure your seat for the conference and show your support! For the past the past two years we stopped registrations once we reached room capacity, and we expect to sell out again this year. Be sure to plan accordingly... 

Screenshot 2: Ticket registration page that will open on January 15th. A limited number of Bronze tickets will be on sale from February 15th onwards.
 To encourage you to register sooner rather than kick yourself later, if you purchase a Gold ticket in the first seven (7) days before January 22nd, you'll receive the following bonuses: 
If you're an individual Premium member of AiGameDev.com already, you get a whole bonus month of free membership! (First 10 individuals.)
Otherwise, you'll receive access to the audio/video interview with Christian Gyrling about the AI in UNCHARTED 2: AMONG THIEVES. (First week only.)
 Later on February 15th, we'll have the Early Bird sale for Bronze tickets (&#8364;47). There are a limited number of these tickets, and they'll only be available for a few weeks at the most, so make sure you're around! Program Committee No details about the conference program have been announced yet, but you can rest assured we'll have the best invited speakers and featured games we can find - at least as good as 2009! We've picked from best independent developers who presented last year as Advisors to make sure the conference program is the best it can be.  Mikko Mononen   Mikko was the Lead AI on Crysis, and worked as a Programmer at Crytek for multiple years. He's also an independent developer, AI consultant and leading open-source developer. You can find information about his projects on his blog. 
 Phil Carlisle   Phil is an industry veteran who worked on the Worms franchise at Team 17 for many years. As well as doing research into emotions, animation and expression, he's working on an indie title called Box Mental. See his blog for details. 
 William van der Sterren   William is a game AI consultant for CGF-AI, who worked on Shellshock 'Nam and Killzone 1 with Guerrilla Games. He's currently developing mission planning as scenario generators for the ArmA game series.


 Call for Proposals If you'd like to speak at the Paris Game AI Conference 2010, now's also your chance. We're interested in hearing about game development of course, but specifically artificial intelligence in the broad sense, including character animation, or gameplay integration, including how it relates to testing and production. We're also interested in hearing short talks about any of the following: 
Independent Games - Did you build an independent game that includes AI? Was it an interesting experience?
Innovative Research - Are you applying AI to new aspects of games or simulations that you'd like to show?
Experimental AI - Did you build a prototype or demo that shows off something new and unique?
 If you're interested, contact &lt;events at AiGameDev.com&gt; with your proposal! Conference Sponsors  Autodesk Kynapse middleware is a trusted artificial intelligence solution for game development and real-time simulations adopted for over 100 game titles. This high-performance AI engine supports 3D pathfinding in destructible environments, including large-crowd pathfinding in complex terrains, dynamic 3D topology analysis, and team coordination. With its efficient production tools and architecture designed for easy integration &amp; customization, Kynapse helps streamline the process of creating top-quality console and PC games.   PathEngine provides a sophisticated toolkit for agent movement, built around an advanced points-of-visibility pathfinding core. This gives you powerful paired path planning and collision against a sophisticated, continuous space, pathfinding movement model, with robust integrated dynamic obstacle functionality and exact representation of agent shape, for seamless movement over overlapping ground geometry.   SpirOps is a middleware development team focused on AI. Their ultimate goal is to allow video games and simulations development teams to enter what we call "the Living Game era." To design more realistic behaviors with a never reached complexity, the SpirOps developed an artificial intelligence design paradigm called "Drive Oriented" which allows designing AI with graphical tools and keeping a linear complexity during the brain creation process.   Four Door Lemon is an indie games developer who offer work-for-hire, prototyping and technology to the games and interactive industries. Established in 2005, FDL have been involved in over 35 projects across multiple platforms of varying scale. Recently FDL launched their trivia game QuizQuizQuiz on the iPhone which was a great success in the UK/Europe, further great games and related announcements will follow in 2010. If you need help with your project in any way, please get in touch!</div></summary>
  </entry>

  <entry>
    <title>This Year's Brightest Games: 2009 AiGame</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/TN29-0BoAts/"/>
    <id>http://yoursite/article/?i=93aa068d3966ca364e34443d011659b4</id>
    <updated>2010-01-10T12:31:47-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/TN29-0B</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  This 3rd edition is set to be the most controversial - yet fascinating - Annual Awards for Game AI! Let me clarify. The whole procedure, including the nominations and the voting, is done by the community here at AiGameDev.com. Of course, there's a certain editorial process involved in picking the nominees, but the rest is mechanical and just a question of collecting the results. Typically, I've been able to predict the winners... mostly. This year, however, that wasn't the case! I speculate this could be due to the following reasons: 
It's been a very constructive year for Game AI, more games deserve the spotlight, and it's harder to separate the candidates.
The community is by definition self-selecting and this reflects in the way its best games are chosen...
I'm getting older, my taste in games is changing, and everyone voting in the awards thinks radically differently than I do. :-)
 It's probably a combination of the three, but the bottom line is that I've decided to include as "Editor's Pick" along with the "Vote Winner" for each award. If anything, I hope this helps shine a spotlight onto more games that are worthy of attention. Anyway, without further ado... Best AI in a AAA Game Editor's Pick
THE SIMS 3 

 The third major version of EA's money-making franchise hit the streets in February 2009. Don't be fooled by the numerous expansion packs that preceeded it, this release was a radical departure from THE SIMS 2 in almost every way, not least in the character AI department. The Sims' new personality traits, their ability to interact socially and behave autonomously within living neighborhoods all combine to make this a very unique simulation game. A series of blog posts about Alice and Kev which was featured in mainstream media earlier this year is a perfect example of the kind of emergent storytelling made possible thanks to the game's new mechanics. This example alone classifies it as a significant milestone for AI characters in games. From the site, here's the description of the experiment: 'This is an experiment in playing a homeless family in The Sims 3. I created two Sims, moved them in to a place made to look like an abandoned park, removed all of their remaining money, and then attempted to help them survive without taking any of the game&#8217;s unrealistically easy cash routes.' Richard Evans, the man behind THE SIMS 3 and also the AI from BLACK &amp; WHITE at Lionhead, told me at the GDC last year that he managed to get "only" 80% of his ideas implemented in the game. I told him that any portion of his ideas was still probably better by 8x than anyone else would have done! His influence shows in the game, and only time will tell how the ideas behind this game will affect the industry as a whole or whether this is a series unique to Electronic Arts and the high production values it put into the game. Vote Winner
KILLZONE 2 

 The combat AI that Guerrilla Games built over the past 7-8 years since Shellshock: Nam '67, including Killzone 1 for the PS2 and Killzone: Liberation for the PSP has arguably become the best in industry with this latest iteration. The enemy behaviors are dynamic and adaptive, showing off both linear sections and large open areas of the game thanks to its tactical reasoning. The AI in KILLZONE 2 in particular shines in the Skirmish mode where you can play with computer-controlled bots in large open maps designed for multiplayer, and free of scripts and trigger boxes. The bots were intended for offline play where you have 7 bots on your side against 8 enemies, but you can also compete online with your friends against various combinations of bots. Not only were the bots fun to play against, according many reviewers including to Ryan O'Donnell of Area5.TV, but they even passed an informal Turing test with journalists from the CO-OP show (season 2, episode 1) and others: 'The bot thing is pretty amazing. I was telling you earlier that I was playing it and it was behaving in such a particularly clever way in this one area that I had to check that I wasn't play online.'- John Davison, WhatTheyPlay.com Some reviewers even speculated that Skirmish and multiplayer bots were included simply to emphasize the strength of the combat AI. You can watch some High Quality videos of matches against the bots in the Salmun Market or the Radec Academy. Cooperative buddy AI that accompany you through the game (while actually fighting alongside you) is generally a hard problem that nobody has got entirely right to-date, and there's still room for improvement in Killzone 2's buddies. However, it's one of the best attempts yet and given the underlying engine there's even more potential. In particular, there's a balance to be found between the aggressiveness that can save you in tricky situations vs. buddies playing safe so you don't need to revive them too often. Best Non-Player Character Vote Winner
Morrigan in DRAGON AGE 

 Because many different characters are required to set the scene in DRAGON AGE, individually the characters may not seem as polished as other games. However, as Kevin Dill points out, overall the characters make for a very compelling role-playing experience. Kevin continues: The overall production values are outstanding. There is a wealth of high quality animation and voice acting that really brings the characters to life, as well as solid assets and rendering.
Reasonably good facial animation, including expressions, gestures, and so forth. Nothing groundbreaking here, but a state-of-the-art execution of a very challenging set of problems.
The level of detail in the social interactions. Responses vary on all sorts of features, so that if you replay the game with a different character, and do things in different ways or in a different order you will get very different interactions with the various NPCs. This does a lot for believability.
 All this goes a long way towards explaining how games last 60 to 80 hours! Editor's Pick
Chloe in UNCHARTED 2: AMONG THIEVES 

 In terms of quality and sheer polish, the characters in UNCHARTED 2 are unmatched. From the animation and motion capture to the voice acting and in-game dialog lines, including the AI behaviors. Everything fits together to create an entirely compelling character that not accompanies Drake around the world as he engages in combat, but also provides gameplay moments on cue. Naughty Dog have done an impressive job with all the characters in the game, but Chloe in particular seems to have captured the attention of many gamers - and without the use of excess nudity! Best AI in an Independent Game Vote Winner
AI WAR 

 AI War was the clear winner of the Best AI in an Independent Game Award. The game has become famous for its huge battles and over 30,000 active ships in the universe, but innovates on the RTS design front as well with its procedural population. 
Decentralized, Emergent and Fuzzy Intelligence: 30,000 Units in AI WAR (Premium)
 Editor's Pick
GALACTIC ARMS RACE 

 Ken Stanley's team are not only leading academic research in game AI, but they're setting an example by also building games around their ideas. In particular, they chose to tackle the problem of content generation using neural networks and evolutionary algorithms. Galactic Arms Race is a space combat and exploration game, as well as an application of NEAT technology to generate diverse weapon behaviors. The game is free to play and you can download it from the homepage. 
Applying Evolutionary Algorithms to the Galactic Arms Race (Blog)
 Design Innovation in Game AI Vote Winner
Procedural Geometry in LEFT 4 DEAD 2 

 The original LEFT 4 DEAD won the Best AI Award last year, and the community voting felt the next iteration should win the design innovation award thanks to version 2.0 of its AI Director controlling changes in levels. 
Procedural Level Geometry from LEFT 4 DEAD 2: Spying on the AI Director 2.0 (Blog)
 Editor's Pick
The Animals in WORLD OF ZOO 

 This game was suggested by Kevin Dill. Here's how he described the game: 'Although this isn't a game that most of us would play (it's target market is much younger), the characters are extremely well realized and, frankly, lovable. The team responsible for creating them was headed by Bruce Blumberg, who did some of the foremost research on believable agents while he was at MIT, and the quality of the result reflects his influence.' Kevin continues with what makes this an important milestone for AI design: 'Their integration of tools made it possible for much of the AI development for their characters to be done directly by the animators and designers. In addition, a large part of their success in crafting so much compelling behavior for so many different types of animals in such a short time resulted directly from the tight integration between animation, engineering, and design, and their flexibility in working together to solve problems. Often a problem that was hard to solve with AI (for example) was easy for animators - or vice versa.' AI Technology in a Supporting Role Editor's Pick
The City in ASSASSIN'S CREED 2 

 Two years ago, the original ASSASSIN'S CREED won the award for Technical Innovation in game AI thanks to its crowds, and with the sequel Ubisoft has managed to raise the bar even further. The various cities in the game have come to life thanks to the various different pedestrians: their behaviors, their animations and their interactions. Each of these features add to the overall feeling of the game's environment. Most significantly, the development team did an amazing job integrating the various elements of the city into the gameplay. The concept of social stealth remains, but you can now also leverage the thieves and courtesans to help with your missions - for instance to sneak past the guards. With the new pocket picking mechanic, walking through a crowd becomes more fun in the process as well! Vote Winner
The AI Director in LEFT 4 DEAD 2 

 This year's edition of LEFT 4 DEAD brought a few key innovations, including the ability for the AI Director to control the path that survivors have to take by blocking doors and alleyways, but also support for changing the weather patterns. The final scores in the voting suggests that both Valve's design is on the pulse of its gamers, but also that the marketing strategy is still working wonders! 
11 Secrets about Left 4 Dead's AI Director and its Procedural Zombie Population (Premium)
 Technical Innovation in Game AI Vote Winner
Combat AI in KILLZONE 2 

 If you take a look at the extensive list of articles on this site about KILLZONE 2's AI technology, there's little doubt that Guerrilla Games is not only a very open studio about what it does, but it's also very focused on pushing the technology that goes into its games. In particular, this is the first documented application of an HTN planner in a real-time action combat game, as well as a use of AI strategy that's essentially bridged the gap between RTS and FPS technology. Knowing how the team, and it's Lead AI Programmer Remco Straatman, is keen to reuse and improve upon its existing technology, this makes for a very fascinating prospect for upcoming games from Guerrilla Games! 
Waypoint Cover Maps and Efficient Raycasts on PS3 in KILLZONE 2 (Insiders)
Not in My Line of Fire! Sensible Combat Behaviors using SPU Jobs (Insiders)
Where Did That Enemy Go? Threat Prediction and Reasoning in KILLZONE 2 (Insiders)
The AI in KILLZONE 2's Bots: Architecture and HTN Planning with Remco Straatman (Premium)
From Squad Tactics to Real-time Strategy: High-Level Multiplayer Bot AI in KILLZONE 2 (Premium)
 Editor's Pick
Hero Planner in DEMIGOD 

 DEMIGOD was the most controversial nomination of them all. It generated instant love or hate responses on our official IRC channel and even on Twitter when I brought it up. However, the game is among those I played the most this year, and I only competed against the AI in its offline Skirmish mode. It turns out over 70% of players only experienced the game offline, possibly due to the networking issues the game faced at launch. Either way, the AI opponents are nothing short of an incredible achievement. The game is a complex strategy game where the hero Demigod's persist over the duration of the game and make RPG-style decisions, and in other moments require RTS-style strategy to decide how to achieve gameplay objectives. Given the scope of the problem, and the way the team at Gas Powered Games solved it using a hybrid planning/optimization algorithm, I think this is quite an achievement! 
DEMIGOD's AI from Role-Playing to Real-Time Strategy with Dru Staltman (Premium)
Goal-Based Action Optimization and the Hybrid Hero AI in DEMIGOD (Premium)
 Most Influential Published Research Vote Winner
Multi-Agent Control in Adversarial Games Over the past few years, animation research has become more and more relevant for character AI as it's been moving into the domain of control systems - for example how to create an optimal policy to traverse a motion graph using reinforcement learning. Such techniques are not only fascinating since they blur the gap between the low-level motion capture and the high-level goals, but they address a real-world need of being able to make trade-offs between these two opposing sides. This particular paper builds on previous work in the field by tying in the traversal policy of motion clips together with gameplay dynamics of two player games. Sometimes there simply is no optimal policy and playing randomly withing known distributions is the safest bet. See the paper and its accompanying video for more details! 
Multi-Agent Control in Adversarial Games Download PDF Editor's Pick
An Architecture for Game Behavior AI: Behavior Multi-Queues This paper elegantly avoids the common pitfalls of game AI research by tackling a problem that's relevant to developers, by respectfully citing recent work from the games industry, and building on commonly used techniques. That's quite a noteworthy achievement in itself, which few other papers from 2009 manage to equal. On top of that, the solution is elegant and not very far from what developers are using in industry. Behavior trees are a great architecture to build at the base of any game AI architecture to help connect different components together, and being able to support coordination (one increasingly important problem) is an added bonus. 
An Architecture for Game Behavior AI: Behavior Multi-Queues Download PDF Also check the following articles on the topic of behavior trees and coordination: 
Behavior Trees for Next-Gen Game AI (Insider)
Coordinating Agents using Behavior Trees with Ricardo Pillosu (Premium)
 Summary Both objectively from my coverage of the games and their technology this year, and subjectively via my involvement with KILLZONE 2*, I feel this has been a great year for game AI as a whole - even compared to last year. It makes for a very promising decade ahead! On a more personal note, I've now been working full time (and more) on AiGameDev.com for over a year now. From the many links and references scattered around this article, I hope it's obvious to what extent we've tracked down and documented the great applications of game AI this year. This is a huge part of why we exist, so thank you for your support and best wishes for 2010! *: Yes, that means all the votes were rigged. Not. :) If you have any thoughts or comments, don't hesitate to post them in the forum thread...</div></summary>
  </entry>

  <entry>
    <title>The Isla Principle, New AI Engineer Mist</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/JAj4ws7O_vs/"/>
    <id>http://yoursite/article/?i=d0a796374d045661ff81a15f172f32d9</id>
    <updated>2009-12-20T14:30:51-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/JAj4ws7</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. What common mistakes do new AI engineers make when they first move into game development? How long does it take for them to realize that designers will find edge cases in the code no matter what? And why do all public discussions about game AI end up with programmers complaining about designers? We have the answers, and they are below... A few weeks ago, the Boston Postmortem held a panel about artificial intelligence in games. It featured Damian Isla, John Abercrombie, Jeff Orkin, and finally Christian Baekkelund as moderator. As you'd expect from the star cast, the discussion was highly stimulating and provided a fresh take on the most commonly addressed topics in our field. Below in this post you'll find the full transcript of that part of the panel discussion, as well as a festive Thank You from our sponsors! 





  The Isla Principle of AI Presentations In the segment of the panel transcribed further below, Damian Isla outlines his theory about all AI talks given publicly. He postulates that each talk has a minimum estimated time until the discussion drifts towards speaking about designers - not in the most positive way. I'm calling this The Isla Principle of AI Presentations or the "Isla Principle" for short! Of course, making great artificial intelligence in games requires both a balance of design and code, and this part of the daily workflow is arguably the most important thing you can do. But, well, it's always a source of passionate disagreements, bugs and funny stories too - which explains this principle. Big Mistakes of New AI Engineers Christian Baekkelund: What do guys think are some of the biggest mistakes that a new AI engineer makes? Damian Isla: I feel like AI programmers in general are torn between two opposing goals, one of which is AI as a game mechanic: the AI as a means to support very basic gameplay (what are you doing from second to second), and on the other hand AI as life simulation, AI for compelling characters and window dressing essentially to sell the world and sell entities in the world. In general, I think a lot of new AI programmers don't necessarily don't think of AI as a mechanic. And I think the mistake both for the programmer and organizationally, is that the AI programmer is not brought into the design fold quite enough, and is not made to understand the high-level design goals quite enough. What is the player meant to experience, now let's craft the AI to support that. That is really the most important job for the AI programmer, much more than life-like flocking or something like that. John Abercrombie: The key is to make an experience for the player, and as an AI programmer that's what you're doing, and even as an organization as a whole. The systems and features you build have to support that, otherwise... Just building new systems to try out new things is a good thing, but in the end you're developing a product for some player to come and have fun with. You have to keep your mind on that, it's your end goal and all your work has to support that end goal. Another mistake that AI engineers make is that they don't try to keep things simple. Certainly, getting really complicated... as a coder sometimes you want to go out and build this awesome complicated system, but really if you try to keep things simple. The way things are direct, it's a more beautiful thing for building AI than anything else. You're going to hit all these edge cases that your really complex construction isn't going to handle well, and trust me, once designers get involved, you're going to get those edge cases a lot. By keeping things simple it keeps you agile, as design chances, as content changes, you're able to stay very agile in the face of a design [scope] that can change from RPG-style first-person shooter to a more Action first-person shooter. That's a huge change right there, and that happened on Bioshock. If you're not able to keep things simple you can't stay agile and you can't adjust to those changes. Jeff Orkin: The only thing I would add is understanding who the design team is, what their strengths are. The mistake I've made myself and I believe I've seen other development teams make is trying to force the designers to be programmers by providing them some kind of scripting access to your AI, thinking you can offload all of the development behavior to the design team. With some studios that does work well, but my own personal opinion is that it's better to have autonomous behaviors where designers create worlds that can showcase the behaviors, and the AI developers can take care of the details. John Abercrombie: I like to say, give the designers a lot of rope, but not enough to hang themselves. Build the tools that they need, and build an autonomous AI, and the tools that you need to control that autonomy, rather than total simulation or total scripting. Damian Isla: Every single AI talk that you'll ever see done publicly, there's an estimated time to start complaining about designers. It's going to be a common theme here... John Abercrombie: It's like "time to crate" or something like that. Christian: I've just realized my role as moderator is now going to be the defense of designers too. Best Wishes from Our Sponsors!  SpirOps is a middleware development team focused on AI. Their ultimate goal is to allow video games and simulations development teams to enter what we call &#8220;the Living Game era&#8221;. To design more realistic behaviors with a never reached complexity, the SpirOps developed an artificial intelligence design paradigm called &#8220;Drive Oriented&#8221; which allows designing AI with graphical tools and keeping a linear complexity during the brain creation process.  PathEngine provides a sophisticated toolkit for agent movement, built around an advanced points-of-visibility pathfinding core. This gives you powerful paired path planning and collision against a sophisticated, continuous space, pathfinding movement model, with robust integrated dynamic obstacle functionality and exact representation of agent shape, for seamless movement over overlapping ground geometry.  Havok is the premier provider of interactive software and services for digital media creators in the games and movie industries. With world leading expertise in physics, animation and tools, Havok&#8217;s business is to turn customers&#8217; creative aspirations into technical realities. Havok&#8217;s modular suite of tools gives power to the creator, making sure that clients can reach new standards of realism and interactivity, while mitigating the overall cost and risks associated with creating today&#8217;s leading video games and movies.  We bring bytes alive! This is the vision and motivation that drives Artificial Technology GmbH. Graphically, many computer games already emulate the real world quite faithfully. The behavior of the characters, on the other hand, is often less authentic. EKI One Middleware (emotional &amp; artificial intelligence) is a new solution by Artificial Technology GmbH which allows game developers to bestow on their characters with emotional behavior.</div></summary>
  </entry>

  <entry>
    <title>Vote Now! 2009 AiGameDev.com Awards for </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/zH_u7M9_bm8/"/>
    <id>http://yoursite/article/?i=baf871ecc4662d8f0a7743a3e846fb14</id>
    <updated>2009-12-20T14:30:51-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/zH_u7M9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Welcome to the 3rd Annual AiGameDev.com Awards for Game AI, where the best games of the year are nominated and voted by professionals, enthusiasts, and researchers in artificial intelligence for games. Last week you submitted your nominations, and here are the finalists. You have exactly one week to pick the best candidates by visiting this page. Vote now! The entries below were chosen thanks to emails, comments, and discussion in our official IRC channel at irc.freenode.net in #gameai. Each nominee had at least two people behind it. Special thanks to Phil Carlisle, Kevin Dill, and Ricardo J. Mendez for their suggestions and descriptions.[...]</div></summary>
  </entry>

  <entry>
    <title>The 2009 AiGameDev.com Awards for Game A</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/j1KA0jW9-Q4/"/>
    <id>http://yoursite/article/?i=935c23050b46a1adb5dc271dcf36a2f9</id>
    <updated>2009-12-15T08:01:34-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/j1KA0jW</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  In December for the past couple years, AiGameDev.com has hosted The Game AI Awards to celebrate the games that came out over the previous twelve months - and particularly those with great artificial intelligence. This time it's a bit different, however... This year, the awards have been extended to encompass innovative applications of artificial intelligence, and creative uses of Game AI in general. This means you have a much more important role to play by submitting in your nominations, to help reward current games that broke the mold and help shape future developments in the field! The Golden Marvins Welcome to the 3rd Annual AiGameDev.com Awards for Game AI, where the best games of the year are nominated and voted for by professionals, enthusiasts, and researchers in artificial intelligence for games. Here's the plan for the new few weeks: 
THIS WEEK - Post your nominations for the games you think are worthy of an award. Either write a comment below, on the forums, or email in your suggestions to alexjc at AiGameDev.com.
NEXT WEEK - The most popular nominations are selected, and voting begins in The Game AI Forums. You'll need to sign-up before you can participate!
 The winners will be announced on December 28th. 

Screenshot 1: Marvin needs your nominations!
 Change of Focus Past editions of the AiGameDev.com awards have focused more on the "event" behind the nomination process and the voting. It brings the community together and it's a nice way to reflect over the games that came out this year. Last year I introduced an award for the Best Research in Game AI, which turned out to be both interesting and refreshingly different! The new award helped emphasize which research the community finds the most useful. Based on this positive impact, I've expanded the scope of the awards even further this year, by picking categories to help drive the development of artificial intelligence in the games industry as a whole... In particular, a big space where there's huge room for improvement is Design &amp; AI, as well as Better Characters. These new award categories require more input from you over the next week, during the nominations, so be sure to add your comment below! Categories There are now seven categories in this year&#8217;s nominations.

Best AI in a AAA Game
What was the best artificial intelligence in game with a big budget and high production values, published via the traditional distribution channels?
Best Non-Player Character
AI technology doesn't exist in a vacuum; it requires character design, art, animation, writing and voice acting. Which game character combined these together best?
Best AI in an Independent Game
Which game written by a small team of developers, either web based or available on PC/Mac/Digital Distribution, had the best AI?
Design Innovation in Game AI
AI requires some solid ideas and a good game design to really shine. Which game showed off the best AI design?

AI Technology in a Supporting Role
Non-character AI (and non-actor AI) is becoming increasingly important as games become more complex. Which game used artificial intelligence best in unusual places?
Technical Innovation in Game AI
Who had the best ideas and technology for 2009, including middleware vendors or games listed above?
Most Influential Published Research
Which white paper, book or in-depth article about game AI has &amp; will influence the field most?
 All the items you nominate of course must have been released after the 1st January 2009 and before 31st December 2009. Criteria
Remember, you&#8217;re giving an award for the best artificial intelligence in a game. This means it must be a balance of two things:

Entertainment - The AI in a game isn&#8217;t supposed to behave perfectly; in fact it&#8217;s often supposed to make mistakes in a convincing way. So, are the non-player characters (NPC) or non-character AIs fun to play with or against?
Intelligence &amp; Believability - Do the in-game actors fit in with the design and story? It&#8217;s not purely about smarts, but it helps!
 Of course, the two are not mutually exclusive, on the contrary! The best games each year successfully use intelligent behaviors to create a fun experience for the players. Click here to let us know about your nominees. The voting will begin next week, so stay tuned for this year&#8217;s best game AI.</div></summary>
  </entry>

  <entry>
    <title>Winning the 2K Bot Prize with a Long-Ter</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/vc246ZJTDkk/"/>
    <id>http://yoursite/article/?i=eb1e31d9ac3b4cc01ae1339317a45a11</id>
    <updated>2009-12-08T04:30:47-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/vc246ZJ</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. Note: This article was written by Jeremy Cothran and Alex Champandard (editor) about Jeremy's winning entry to the 2009 edition of the 2K Bot Prize.  Most AI systems in the games industry focus on short-term reactive memory and combat behaviors applying techniques such as behavior trees.  However, there seems to be little support for long-term memory, for example remembering locations in space that mark events that occurred.  In our daily lives, we internally map, model and remember our surroundings and experiences.  This begs the question, how can we similarly organize and leverage longer-term memory within modern AI? This article looks into the concepts and implementation that went into creating the winning Bot Prize entry this year.  In particular, it shows how a SQL database was used for long term memories of hotspots which were analyzed to improve the AI.  It also discusses the performance and benefits of such an approach and possible future improvements.   Screenshot 1: The BotPrize winning entry in Unreal Tournament 2004.
 Long-Term Memory using SQLite One experimental approach towards providing long-term memory for AI is to use a relational database (RDB).  The database would be responsible for managing lists of information recently acquired within a set of tables.  In particular, an ideal candidate implementation is SQLite: a lightweight, portable, file-based relational database which can help in this regard. SQLite provides persistent file-based records in an easily query-able format which can be accessed via a Structured Query Language (SQL).  One important benefit of this approach is that it provides a shared data model for either the game representation (e.g. map, waypoints, etc.) or arbitrary events (consisting of type, location of combat, outcomes).  Maintaining such data enables both in-game or offline analysis using a variety of techniques/tools such as R - an increasingly popular statistical language. (Note: Such techniques are already gaining popularity for gameplay analysis and data-mining, for example Valve's so-called Death Maps in Team Fortress 2.) Runtime Database Usage &amp; the Bot Prize For the 2009 Bot Prize contest, the winning entry was my sqlitebot (see video, powerpoint, code) which utilized a sqlite database.  The RDB was used for two things:  Tracking the locations of kill/death events, also called map hotspots. Storing the cross-visibility of waypoints for use in evasive behavior.
 The bot started from the example 'advanced' bot from the Pogamut website with a circle-strafing function added from the previous year's winning AMIS bot (both documented and credited within the code).  Pogamut is a collection of Java based projects primarily providing a Java NetBeans developer/debug interface and Java object API to control Unreal Tournament 2004 bots.  Pogamut uses the Gamebot message API as an intermediary between itself and the game.  Screenshot 2 shows the IDE with sample bot state/log messages in the lower right corner and controls for sending game commands such as gameplay speed, changing maps or adding bots in the upper left. During development of the bot, I noticed that the previous years winners had some memory processes in regards to weapon selection and effectiveness, but not in regards to map events.  The example bot included a 'pursue' function, but this only tracked the last known enemy location.  An easy initial long-term behavior to add would be knowledge of the map level hotspots: areas where the bot had scored a kill or been killed.   Screenshot 2: Pogamut IDE. (Click to enlarge.)
 Hotspot Behavior To enable a long-term memory of recently active locations, whenever the bot kills another player or is killed by another player, a row is inserted to the observations table with the location of the event, a timestamp, and a weight set to 1.0.  When the bot is respawned or looking for a destination, it randomly picks from the most recent n recentRow locations that have been created in the past t recentTime seconds.  In practice, n is set to 3 recent rows which are queried from within the past 45 seconds. In terms of performance, reading and writing to the database are currently millisecond operations - and these insertions and selections should scale to table sizes in the millions of records.  This is acceptable for performance since the decision is used for strategic/tactical pathfinding decisions, and any lag in the write or read would not effect more immediately noticeable combat reactive decisions. Database tables and search indexes are created once initially before the game begins.  The database can be file saved and copied for reuse among other games in its initial unpopulated state or a later populated state.  In this experiment, while the database is only accessed by a single agent, the database could be concurrently accessed by several agents across multiple games. The rows added to the tables are timestamped with real-world time and game time for reference.  Here's how the table is specified: 
CREATE TABLE observations ( row_id integer PRIMARY KEY, row_entry_date TEXT, map_level TEXT, navpoint_id INT, unreal_id TEXT, event_location TEXT, event_time REAL, event_weight REAL);
 When the bot is later looking for a target destination the following table query is issued: String statement = "SELECT * FROM observations WHERE row_entry_date &gt; strftime('%Y-%m-%d %H:%M:%S','now','-2 minute') AND event_time &gt; "+gameTime-recentTime+" AND event_weight = 1 AND map_level = '"+map_level+"' ORDER BY row_entry_date DESC LIMIT "+recentRows+";";
 Here's the query's result representing the most recent 3 locations of a map kill/death: 
1333|2009-08-15 15:54:41|DM-Test1|1|DM-Test1.PathNode16|5663.6,-1403.66,-86.15|290.35|1.0
1332|2009-08-15 15:54:29|DM-Test1|0|DM-Test1.InventorySpot5|6739.6,-344.48,-86.15|277.33|1.0
1331|2009-08-15 15:54:16|DM-Test1|1|DM-Test1.PathNode16|6503.56,-1667.54,-86.15|262.97|1.0
 One of these rows is randomly chosen as the hotspot, and the bot heads towards that location.   Screenshot 3: Areas around weapons and items quickly become hotspots for the bot.
 Evasive Behavior Another human-like behavioral feature that's noticeably absent in most bots is retreating or evading an enemy after combat initially begins. In the case of sqlitebot, this happens when the health reaches a minimum target threshold (less than half). Diagram 3 demonstrates how an evasive behavior works; the bot's target destination navpoint is selected outside of the enemy's current visibility set.  The from/to navpoint visibility table was populated in an initial pre-game bot map survey step that logs all this information and stores it for runtime use.   Diagram 4: Green locations are navpoints not in player to_navpoint_id visible set, and red locations are from_navpoint_id closest to player.
 The table that stores this visibility lookup table is the following: CREATE TABLE navpoint ( row_id integer PRIMARY KEY, row_entry_date text, map_level text, from_navpoint_id int, to_navpoint_id int, visibility int);
 A unique index is also added to prevent possible duplication of the same rows during the initial map survey process: CREATE UNIQUE INDEX i_navpoint on navpoint (map_level,from_navpoint_id,to_navpoint_id); When the bot has low health and is looking to evade, the AI selects visible navpoints from this table based on the nearest enemy navpoint, which should obviously not be pathed to: String statement = "SELECT to_navpoint_id FROM navpoint WHERE map_level = '"+map_level+"' AND from_navpoint_id = "+memory.getKnownNavPoints().get(hideFromNav).ID+";"; ResultSet rs = stat.executeQuery(statement);
ArrayList&lt;Integer&gt; ArrayToGet = new ArrayList&lt;Integer&gt; ();
while (rs.next()) { ArrayToGet.add(rs.getInt(1));
}
 The code then selects a random hidden navigation point as the destination, assuming it's not in the player visible arrayset that was determined using the previous query. 
boolean hideNavFound = false;
int thisNavpoint = 0; if (!ArrayToGet.isEmpty()) { while (!hideNavFound) { int myRandHide = random.nextInt(memory.getKnownNavPoints().size()); thisNavpoint = memory.getKnownNavPoints().get(myRandHide).ID; if (ArrayToGet.contains(thisNavpoint)) { log.info("Navpoint is visible:"+memory.getKnownNavPoints().get(myRandHide).UnrealID.toString()); } else { log.info("navpoint not visible:"+memory.getKnownNavPoints().get(myRandHide).UnrealID.toString()); hideNavFound = true; } }
}
   Screenshot 5: Unreal 2004 is still used by academia as the primary research platform for FPS AI.
 Other Additions In addition to the hotspot and evasive behaviors, further tweaks were made to the original bot's AI based on the following observations.  The two most obvious giveaways that an agent is a bot are:  Futile behaviors, such as running in an endless loop without progress towards the goal, or Predictable behaviors, for example repeatedly jumping, dodging or employing the same move or tactic.
 I added a simple associative array which instructed the bot to ignore a goal (e.g. weapon, health, pickup) for a period of time if it was unable to currently path to or complete that goal.  To achieve this, I used a hash reference between a goal and a failed attempt time.  The goal associative array allowed the bot to temporarily dismiss goals which might produce futile behaviors. Furthermore, to avoid predictable behaviors, some random fuzziness was added to the bots most common combat reactive decisions, for instance using simple random choices between acceptable alternatives such as ignore, dodge or jump direction on an incoming projectile. Finally, the bots reaction times to incoming projectiles and weapon switching was also slowed by around 200 milliseconds (implemented as simple delay loop) to give a more human reaction time appearance.   Screenshot 6: UT 2004 features a collection of both indoor and outdoor levels, though vehicles were not part of the Bot Prize.
 Further Work It would be useful to have a common database schema abstraction of such game data for analysis by multiple tools or agents.  For instance for a map representations, the following waypoint attributes and associations would be useful to have for many 3D environments: 
Waypoint positions and their connectivity with each other,
The initial association between waypoints with tactical attributes such as cover or open area, and
The changing association over time with gameplay events and shifting tactics in the game.
 As for performance, a faster intermediate caching layer for the data could avoid the slower latencies handling database connection via a socket, or supporting disk I/O.  If multiple parallel agents are using the same database resource, then there can be concurrency latencies related to read state or write access.  Performance for reading and writing from the database also depends on the number of rows in the table, so effective search indexes are important for scaling up to millions of records or larger. SQLite also has the option of running the database in-memory and not to disk, which would most likely offer performance benefits.  Spatialite is a 'spatially enabled' sqlite database including common geometry datatypes and related indexes/functions which may offer some further ease of implementation and performance gains. Finally, it would be interesting to explore how multiple agents might synthesize and share their combined knowledge via such database information, over the course of several games.  Further, these ideas could be applied to squads to help with strategic reasoning also. Conclusions Many human-like behaviors such as evasion or a "volley"-type dynamic between players in combat are particularly suited to competitive multiplayer games.  The ability to model, cache, analyze and recall individual events strategies across multiple games opens up opportunities opportunities for stronger and richer AI to develop in a more open-ended competitive environment.</div></summary>
  </entry>

  <entry>
    <title>HCSM: A Framework for Behavior and Scena</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/pxTXOIZgh_o/"/>
    <id>http://yoursite/article/?i=73bbb10fb1c741c5c315de163c5cd364</id>
    <updated>2009-12-08T04:30:47-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/pxTXOIZ</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Finite-state machines have been getting a lot of bad press over the past couple years, and justifiably so! When applied to AI for building purposeful goal-directed behaviors, traditional FSMs just don't scale very well. This is the main reason developers in the games industry have been primarily moving towards systems like behavior trees instead... However, hierarchical concurrent state machines (aka. HCSM) were bumped up to the top of our list of topics since the bots in Left 4 Dead are apparently based on HCSM. Indeed, as Mike Booth (Project Lead at Valve on the game) confirmed for this article, the implementation of the bots is based on ideas in the paper discussed here. Read on to find out more! The rest of this white paper review is written by Luke Dicken, researcher at the University of Strathclyde and our resident academic here at AiGameDev.com. He's also known as @LukeD on Twitter. 

Screenshot 1: The bots in Left 4 Dead 1 are controlled using HCSM.
 Motivation Designing and organizing sophisticated AI systems is very hard, particularly when building them as one large monolithic control system. Working out the processes by which you can make a system do what you want it to in a complex and changing environment can be a lengthy process, and invariably some set of circumstances that the system needs to cope with end up being overlooked. In this article, you'll learn about the Hierarchical Concurrent State Machine (HCSM) which gives a framework in which AI systems can be described in a modular manner, whilst still capturing the interactions between aspects of the world and the system, or between different components of the system itself. Contribution HCSMs were introduced in 1995 in a paper entitled HCSM: A Framework for Behavior and Scenario Control in Virtual Environments, written by Cremer, Kearney and Papelis. The concept of the HCSM has been influenced heavily by the Statechart extension to State Automata. Designed primarily for embedded and real-time systems, statecharts allow for a group of states to be gathered into a single superstate. Superstates can then be linked with transitions and treated more or less as states themselves. (This is a very very brief synopsis of statecharts, see the paper linked from this page for details). HCSM takes this notion a stage further, by abolishing the concept of state altogether; the basic building block in an HCSM is an HCSM. However, unlike in statecharts, HCSMs are not made transparent to their parent HCSM. Another difference is that each HCSM has an "activity function" associated with it which is used to generate an output based on, but independent of, the active state within the HCSM. The HCSM specification defines input wires used to supply a continuous stream of data to the machine, as well as controls and dials which are used to set parameters within the machine. It is important to note that time within the machine is discretely modeled, and although changes to the input are visible immediately inside the machine, changes made to the controls are not reflected until the next tick. An HCSM is "Sequential" if the HCSMs it contains are linked by transitions, and "Concurrent" if the HCSMs are not linked by transitions. In sequential HCSMs, a single HCSM child can be active at a given tick, whilst concurrent HCSMs allow for all the children to be active at each tick. 

Figure 2: Diagram from the paper showing the structure of an HCSM. (Click to enlarge.)
 HCSMs provide a very robust modular formalism in which you can define the behaviors of an AI system, and easily capture intricate interactions between these behavior. This avoids a lot of the confusion that designing these complex systems might otherwise lead to, and makes for a much more understandable representation of what you are trying to achieve. Abstract &amp; Download Here's the official abstract of the white paper, published in 1995: 'This paper presents a framework for behavior modeling and scenario control based on hierarchical, concurrent state machines (HCSM). We present the structure and informal operational semantics of hierarchical, concurrent state machines. We describe the use of HCSM for scenario control in the Iowa Driving Simulator (IDS), a virtual environment for real-time driving simulation. The paper concludes with an outline of a forthcoming HCSM-based scenario authoring system that will permit non-specialists to graphically program behaviors and design experiments for IDS.' Here's the reference for the paper and the link for downloading the PDF: 
HCSM: A Framework for Behavior and Scenario Control in Virtual Environments
J. Cremer, J. Kearney &amp; Y. Papelis
Download PDF Discussion It isn't a massive leap to see how this approach can be used to design control systems for agents, for example the bots in Left 4 Dead. After all, at their core they are still State Automata. HCSMs can be arranged such that behaviors that need to execute simultaneously are contained within a concurrent HCSM, while more traditional mode-switching can be captured using a sequential HCSM, and these can be nested within each other, and feed into each other in order to generate a complex system using a set of very basic building blocks. However, one of the main proposed uses for the HCSM technique is not for agent control, but for scenario control. HCSMs being used in this manner are termed "Directors" and can be used to orchestrate specific conditions within a noisy environment. In the paper introducing the technique, the authors talk specifically about creating specific circumstances within the "Iowa Driving Simulator" (a precursor to the more modern "National Advanced Driving Simulator"), a virtual environment with a physical simulator component based around an actual vehicle shell, making for a very advanced simulation experience - comparable for example to airline training simulators. The problem with this simulated environment at the time was that there was not a good technique to allow situations to be created that a user of the simulator would need to react to. For example, consider another driver in traffic who cuts the user off. It is difficult to orchestrate this as a general case whilst making the simulation seem fluid, since it depends to a large extent on the behavior of the user - not just from a timing point of view but also from an aggression point of view. A naive technique might have the other vehicle execute its maneuver when the user's vehicle hits a specific trigger point in the road, but in a fully dynamic world, a vehicle sat waiting to be triggered would be very noticeable and jar the user out of the suspension of disbelief that the simulation encourages. 

Screenshot 3: Bots moving through a warehouse in Left 4 Dead 1.
 An initial solution used a complex one-layer state machine to model speed matching and slowing behavior to put the "enemy" vehicle in the right position at the right time to perform the required action that the user would need to react to, but as you can imagine, a typical state diagram that could capture this level of complexity was of unmanageable complexity, leading to significant issues in terms of code reuse and debugging. HCSMs model these interactions in a much more elegant way, making the whole process easier by virtue of their modular hierarchical nature - the states for speed control to make sure an incident occurs at the correct location relevant to the user's vehicle for example are much more portable under this architecture and can be lifted with much less trauma and put into another structure to replicate the functionality in a different scenario, essentially providing a behavior-centric view of a state machine. Implementation Conceptually this seems a robust approach, but how does this work in practice? After all, what really matters is how you can implement this in our own applications. The original paper on HCSM kindly provides some pseudo-code algorithms that define exactly how an HCSM is put together. The original pseudo-code is as follows: 
ExecuteHCSM(hcsm)
{ ExecutePreActivity(hcsm.pre_activity_function); transition_to_fire := SelectTransitionToFire(hcsm); if (transition_to_fire) then hcsm.active := transition_to_fire.to_state; ActivateState(hcsm.active); for each active child m of hcsm do ExecuteHCSM(m); return(ExecuteActivity(hcsm.activity_function));
}
 So you can see from this that each HCSM is made up of essentially four functions - at the top level you see the overall ExecuteHCSM function. There is a pre-activity function which allows controlling the flow of information into the child HCSMs to be executed this iteration. You then select which transition to fire using the SelectTransitionToFire function, and then activate the relevant state for that transition within the HCSM. Remember that transitions are only relevant for sequential HCSMs, concurrent ones will have all the children active at all times. Then, you iterate across the list of active child HCSMs and execute each one. Note importantly that this is a recursive process, and the algorithm descends the hierarchy of the HCSM structure executing the pre-activity functions of each one in a descending manner, but the activity functions themselves are activated as you bubble back up the execution stack. This is a very important aspect of the temporal order of each iteration as it allows the children of an HCSM to directly affect the activity function of their parent HCSM. 

Figure 4: A hierarchical graph-like structure representing a HCSM. (Click to enlarge.)
 Evaluation 
Applicability to Games: 9/10
Not all games are going to benefit from this technology, but any developer that wants to retain a degree of directorial control over the play whilst at the same not constricting the choices offered to the players will find it beneficial.
Usefulness for Character AI: 6/10
HCSMs don't really bring much new to the table in terms of controlling NPCs. They would be appropriate for use, but they aren't necessarily the best approach.
Simplicity to Implement: 6/10
HCSMs are more of a paradigm than something precisely implementable. As such they can be as simple or complicated as you need them to be. At their most basic, an HCSM object is 4 functions, making implementation relatively straightforward, but this overlooks the interplay of multiple HCSMs and parents with children.
 HCSMs provide a useful way for reworking traditional state automata into an architecture better suited to the kind of work AI developers do. Their power lies in the simplistic way they represent complex interactions, with an almost emergent component in the way that they can be put together to create interesting behaviors. Their use as a stage manager is particularly significant for game developers since it provides a lightweight reusable technique to create game worlds that are both interesting and believable, and support altering the world and NPCs within it so that things you want to happen in the world happen in a way that is appropriate given the player's activity. This brief introduction to HCSMs has been based off the original paper by Cremer, Kearney and Papelis, and for a much more detailed overview of the technique I recommend reading this.</div></summary>
  </entry>

  <entry>
    <title>Where Did That Enemy Go? Threat Predicti</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/jjk2XCPlt_A/"/>
    <id>http://yoursite/article/?i=c931206c88209eb97f50dd914d18142b</id>
    <updated>2009-12-08T04:30:47-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/jjk2XCP</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

With increased processing power and better techniques for processing information from the environment, there's an opportunity to go beyond using raw sensory data and starting to reason about the world. In particular for combat games, simply tracking players then reasoning about their possible hiding location can add a great variety to the behavior. In his presentation earlier this year, Michiel van der Leeuw talked about 'The PlayStation&#174;3's SPUs in the Real World' in which he detailed how the AI for KILLZONE 2 works in practice. Building on the previous article about waypoint cover maps, one of the most interesting uses is tracking threats and predicting their movement - for instance when the player hides from the enemy. The rest of this article includes a demo video from the game, as well as the slides and a transcript of presentation... Thanks again to Michiel of Guerrilla Games for sharing his slides with us. Michiel mentioned that the AI department isn't currently looking for programmers, but the company is always on the look out for talented AI, (humanoid) animation and game code enthusiasts.[...]</div></summary>
  </entry>

  <entry>
    <title>There's a Hole in Your NavMesh, Dear Zom</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/HuQGPdhNJfY/"/>
    <id>http://yoursite/article/?i=b8a7da63357b32323285e276edcac22f</id>
    <updated>2009-11-06T15:00:57-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/HuQGPdh</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. INVITATION: What are the next big challenges for Zombie AI? Join resident expert Phil Carlisle and your regular host Alex Champandard in a Halloween Special this weekend. The online presentation is open for anyone signed-up (free) to AiGameDev.com and will take place live on Sunday, November 1st. Details here.  Of all the game modes in Left 4 Dead, Survival has some of the most interesting dynamics from an AI perspective. From the initial concept, to survive as long as you can with help of your four buddies, the game mode quickly turns into a process of finding optimal locations in the map to defend... Obviously, when there's a medal or achievement involved, this optimization process becomes particularly creative! What makes this interesting for the Zombie AI, is that the best locations are those that the infected horde has a hard time reaching... Cue unexpected results. This article starts by explaining how the navigation system in L4D works. Then, you'll find out the kinds of problems that occur when players are challenged with finding loopholes in the zombie's ability to move around the world! Finally, the last part discusses the variety of solutions that would be available to resolve such issues. With What Shall I Build It? 

Screenshot 1: Navigation Mesh chunk in the forest. A single polygon is highlighted in yellow, with its neigbours drawn in red.
 Left 4 Dead uses navigation meshes as the basis for the zombie's movement around the world. These are based on the technology from Counter Strike: Source that includes the official bot. (See Mike Booth's GDC 2004 presentation.) 
The navigation meshes are built partly automatically, but there are many commands in the game's console for manual editing.
Each polygon is an axis-aligned quad, so the orientation is constrained - though the size seems to be very flexible.
The polygons are connected through a variety of links, which can be traversed by walking, jumping, etc.
 This solution, in particular the axis aligned quads, is not very common. Most often, polygons can be placed arbitrarily in space - either manually or using automated analysis. 

Screenshot 2: Navigation mesh chunk inside an apartment building, littered with debris. (Click to enlarge.)
 How Shall I Exploit It? Zombies are supposed to reach you, the player, anywhere you can stand to keep the pressure on. The Survival levels are in fact customized with barricades and invisible polygons to keep players within the playing area. However, there are bits of the level without (adequate) navigation meshes, so they become inaccessible by the AI zombies. The following scenario is a typical illustration of the process of exploiting the game's Survival mechanics: 'If you manage to jump onto a tricky location such as the cargo plane in Dead Air, or the chimney in the Lighthouse, the bulk of the horde will not manage to reach you. In fact, they'll simply rush to the location in a polygon on the level beneath you.
Since nobody is killing the zombies, the game ends up with too many entities on the server, and the networking seems to slow the game to a crawl. As long as you can dispatch the occasional Smoker without falling out of position, you can effectively defeat the game.' Another particularly creative exploit in the Sewers is to jump through the ventilation tunnel and rush back to the Safe Room to deal with (smaller) waves of infected there. 

Screenshot 3: Navigation mesh chunk outside in the street, including jump links and drop-down connections.
 How Shall I Fix It? It seems there are three solutions to resolve this problem: 
Manually update the navigation meshes in the Survival maps as loopholes are found. Valve has extensive statistics about the game, and can easily find locations in the level that are easy to exploit.
Develop more robust automatic navigation mesh extraction tools and a more flexible (non axis-aligned) representation that reduces the chances of there being discrepancies between the collision mesh and the AI's navigation representation.
Address the problems using game design changes, encouraging the players to move more rather than remain in a fixed position. This is a problem generally with the design of Left 4 Dead as a whole, though, not just survival mode.
 Most likely the reason these issues have not been fixed by Valve is that it's not cost effective to implement either of these solutions. And arguably, experienced players take pride in finding loopholes and exploits anyway, so why punish them? For reference, Left 4 Dead 2 seems to address these issues using a redesign. 

Screenshot 4: Quad polygons outside near the farmhouse. (Click to enlarge.)
 Summary Replayable games are a good thing for both the developers and the players. However, highly replayable games put a heavy burden on the underlying technology - and AI is no different. Navigation is one of the first things to break in a game, and with highly replayable experiences this becomes more obvious. Modern technology can be used to resolve such issues and avoid holes in navigation meshes, for example using BSP-based analysis or voxelization techniques. However, by the time you notice the problem it's most likely too late to do anything about it! In that case, redesigning the core mechanics and shipping a sequel the year after is a sensible option. REMINDER: Join resident expert Phil Carlisle and your regular host Alex Champandard in a Halloween Special titled 'Zombie AI That's Not Brain Dead.' Discussion will focus on the big challenges of zombie behaviors, and what's next for infected AI. The session is open to attend for anyone signed-up (free) to AiGameDev.com and will take place live online on Sunday, November 1st at 16:00 Eastern / 13:00 Pacific / 22:00 Central Europe / 21:00 U.K. time.</div></summary>
  </entry>

  <entry>
    <title>Squad Patrol in Halo 3 ODST: Populating </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/L3jGLR4F6oU/"/>
    <id>http://yoursite/article/?i=aad6344895c5382148f65291993bce81</id>
    <updated>2009-11-06T15:00:57-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/L3jGLR4</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Halo 3: ODST made numerous bold design changes compared to its predecessors, in particular its open hub-world that's populated with enemy NPCs. During the promotion of the game, Bungie released a video documentary with insights from behind the scenes. For approximately 30 seconds during the video, you can see footage of the AI technology applied to this large city. And, yes, some of the debug rendering for the waypoints seems to be pink! In particular, during that short section, Bungie designer Alex Pfeiffer talks about the squad patrol behaviors that are used to bring life to the city. Since Halo 3: ODST is a partly open-world game, new technology was needed to make sure there's always enemy presence within the hub - which could be adjusted up and down by the designers. You can watch the AI patrolling in the highlight below...
[...]</div></summary>
  </entry>

  <entry>
    <title>Procedural Level Geometry from Left 4 De</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/B0s4U_hjGLk/"/>
    <id>http://yoursite/article/?i=a1a0f1bc0c31eda60b1011c65678257a</id>
    <updated>2009-11-06T15:00:57-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/B0s4U_h</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Since Valve announced Left 4 Dead 2, the feature of the AI Director 2.0 that grabbed the most attention has to be the dynamically changing level geometry. Apparently the game can not only control the weather patterns, but it can also change the route the survivors take while moving through the world. In this article, you'll find out exactly how the AI Director 2.0 adapts the geometry procedurally. There's also proof in the form of exclusive screenshots from the demo of L4D2, which was released to the general public a few days ago. (The screenshots are exclusive in the sense that I took them myself, and nobody else has these!) (Special thanks to @RevFry on Twitter for helping isolate all these variations.) How It Works Last week we held a Zombie AI Halloween Special, in which Phil Carlisle and I (Alex Champandard) speculated how L4D2 would handle the procedural geometry. Based on our combined experience, and the in-depth Premium feature I wrote about the original AI Director in Left 4 Dead 1, it turns out we came really close. Here's how it works: 
There are individual variations in the geometry that are manually edited by level designers.
These are grouped into sets of possibilities for the geometry around a particular location in the level.
The AI Director uses it's pseudo-random selection among these sets to determine what happens in each game.
 This approach is very similar to the way the AI Director handled the placement of scavenge items and weapons in the original game, allowing control by the designers yet sufficient unpredictability to keep things interesting. The Demo The only part that wasn't easy to guess was the scale at which the levels would be varied. Phil assumed there would be small rooms or segments in the world that would change, and I figured doors and fences would be the easiest way to introduce variation into the levels. Based on the demo so far, the AI Director 20 is indeed using boarded doors, riot fences, and walls to block off alleys. In this part of the first level, there are three different paths the survivors can take. From experimental evidence, 1-2 of these paths are left open and the other 1-2 are closed off procedurally. This seems to happen only in Advanced and Expert modes. (See the screenshots below. Click to enlarge.) The Stairs 

 

 The Alley 

 

 The Door 

 

 Discuss! Anyway, based on this we can start speculating about the rest of Left 4 Dead 2! 
Do you expect there to be larger segments of geometry that change in the full version?
Will such local path changes (barely 10-20 meters difference) affects the gameplay enough?
How do you think this kind of technology can be applied to other games or genres?
 Let everyone know what you think and post your reply by commenting in the forums.</div></summary>
  </entry>

  <entry>
    <title>There's a Hole in Your NavMesh, Dear Zom</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/HuQGPdhNJfY/"/>
    <id>http://yoursite/article/?i=4acbca7554a0d8b9698b9ab2c2743a04</id>
    <updated>2009-10-26T16:01:40-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/HuQGPdh</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. INVITATION: What are the next big challenges for Zombie AI? Join resident expert Phil Carlisle and your regular host Alex Champandard in a Halloween Special this weekend. The online presentation is open for anyone signed-up (free) to AiGameDev.com and will take place live on Sunday, November 1st. Details here.  Of all the game modes in Left 4 Dead, Survival has some of the most interesting dynamics from an AI perspective. From the initial concept, to survive as long as you can with help of your four buddies, the game mode quickly turns into a process of finding optimal locations in the map to defend... Obviously, when there's a medal or achievement involved, this optimization process becomes particularly creative! What makes this interesting for the Zombie AI, is that the best locations are those that zombies have a hard time reaching... Cue unexpected results. This article starts by explaining how the navigation system in L4D works. Then, you'll find out the kinds of problems that occur when players are challenged with finding loopholes in the zombie's ability to move around the world! Finally, the last part discusses the variety of solutions that would be available to resolve such issues. With What Shall I Build It? 

Screenshot 1: Navigation Mesh chunk in the forest. A single polygon is highlighted in yellow, with its neigbours drawn in red.
 Left 4 Dead uses navigation meshes as the basis for the zombie's movement around the world. These are based on the technology from Counter Strike: Source that includes the official bot. (See Mike Booth's GDC 2004 presentation.) 
The navigation meshes are built partly automatically, but there are many commands in the game's console for manual editing.
Each polygon is an axis-aligned quad, so the orientation is constrained - though the size seems to be very flexible.
The polygons are connected through a variety of links, which can be traversed by walking, jumping, etc.
 This solution, in particular the axis aligned quads, is not very common. Most often, polygons can be placed arbitrarily in space - either manually or using automated analysis. 

Screenshot 2: Navigation mesh chunk inside an apartment building, littered with debris. (Click to enlarge.)
 How Shall I Exploit It? Zombies are supposed to reach you, the player, everywhere to keep the pressure on. The Survival levels are in fact customized with barricades and invisible polygons to keep players within the playing area. However, there are bits of the level without (adequate) navigation meshes, so they become inaccessible by the AI zombies. The following scenario is a typical illustration of the process of exploiting the game's Survival mechanics: 'If you manage to jump onto a tricky location such as the cargo plane in Dead Air, or the chimney in the Lighthouse, the bulk of the horde will not manage to reach you. In fact, they'll simply rush to the location in a polygon on the level beneath you.
Since nobody is killing the zombies, the game ends up with too many entities on the server, and the networking seems to slow the game to a crawl. As long as you can dispatch the occasional Smoker without falling out of position, you can effectively defeat the game.' Another particularly creative exploit in the Sewers is to jump through the ventilation tunnel and rush back to the Safe Room to deal with (smaller) waves of infected there. 

Screenshot 3: Navigation mesh chunk outside in the street, including jump links and drop-down connections.
 How Shall I Fix It? It seems there are three solutions to resolve this problem: 
Manually update the navigation meshes in the Survival maps as loopholes are found. Valve has extensive statistics about the game, and can easily find locations in the level that are easy to exploit.
Develop more robust automatic navigation mesh extraction tools and a more flexible (non axis-aligned) representation that reduces the chances of there being discrepancies between the collision mesh and the AI's navigation representation.
Address the problems using game design changes, encouraging the players to move more rather than remain in a fixed position. This is a problem generally with the design of Left 4 Dead as a whole, though, not just survival mode.
 Most likely the reason these issues have not been fixed by Valve is that it's not cost effective to implement either of these solutions. And arguably, experienced games take some pride in finding loopholes and exploits anyway, so why punish them? In fact, Left 4 Dead 2 seems to address these issues using a redesign. 

Screenshot 4: Quad polygons outside near the farmhouse. (Click to enlarge.)
 Summary Replayable games are a good thing for both the developers and the players. However, highly replayable games put a heavy burden on the underlying technology - and AI is no different. Navigation is one of the first things to break in a game, and with highly replayable experiences this becomes more obvious. Modern technology can be used to resolve such issues and avoid holes in navigation meshes, for example using BSP-based analysis or voxelization techniques. However, by the time you notice the problem it's most likely too late to do anything about it! In that case, redesigning the core mechanics and shipping a sequel the year after is a sensible option. REMINDER: Join resident expert Phil Carlisle and your regular host Alex Champandard in a Halloween Special titled 'Zombie AI That's Not Brain Dead.' Discussion will focus on the big challenges of zombie behaviors, and what's next for infected AI. The session is open to attend for anyone signed-up (free) to AiGameDev.com and will take place live online on Sunday, November 1st at 16:00 Eastern / 13:00 Pacific / 22:00 Central Europe / 21:00 U.K. time.</div></summary>
  </entry>

  <entry>
    <title>Takeaway for Beginners in Game AI  Thank</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/NPxJ9iHPoFQ/"/>
    <id>http://yoursite/article/?i=613abd098d8ca0b7c076a85c621eb94c</id>
    <updated>2009-10-17T14:50:13-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/NPxJ9iH</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The Paris Game AI Conference 2009</div></summary>
  </entry>

  <entry>
    <title>Research Report from CIG 2009  The Dimin</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/Q0zpRwxzWfI/"/>
    <id>http://yoursite/article/?i=2efa710ccd5e94fad9bd4f009d101eae</id>
    <updated>2009-10-17T00:01:19-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/Q0zpRwx</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. Editor's Note: This coverage from IEEE Symposium on Computational Intelligence and Games 2009 was written by Luke Dicken. In particular, his article looks at some of the key research from the conference, and discusses the relationship between industry and academia as it came across at the conference.  CIG is a refreshing conference to my mind because you can put any three attendees in a room and get four different takes on what the conference is about. There are the Game Theorists, talking Nash Equilibria and mixed strategies (Hingston, 2009), the Serious Games people dealing with a more simulated what-if approach to the world - in scenarios such as Disaster Relief or Naval Strategy (Avery, Louis, &amp; Avery, 2009). There are researchers working on a whole range of more classical board and card games such as Poker, Diplomacy or Risk (Kemmerling et al., 2009). And of course, there are the Video Game researchers - but even within this group there are further classifications to be made between those using games as a controlled environment in which to develop better AI techniques (Thompson &amp; Levine, 2009), those using AI to push forward the use of technology in contemporary games (Galli, Loiacono, &amp; Lanzi, 2009), and those using the marriage of advanced AI methodology with video games for some other end, such as behavioural modelling of players (Drachen, Canossa, &amp; Yannakakis, 2009) or automated content creation (Tanimoto, Robison, &amp; Fan, 2009). Even within our own specific niche, our community remains very diverse. Not only diverse but also of a very high quality - it's hard to single out specific pieces of research to point to as being worth mentioning, because it almost certainly means excluding something else that deserves to be here. You can see the full proceedings here to make sure you don't miss anything. (Also see the bottom of this article for the full references from the previous paragraph!) Research Highlights By far the most interesting paper to me was describing an application of AI to creating an agent to play Magic: The Gathering (Ward &amp; Cowling, 2009). I'm sure that many of you will recall Magic fondly from your childhood or adolescence - many more of you might remember it more as a significant money-sink that consumed your entire life for a period. The paper presented an approach to a subset of the game, using only the "creature" spells (i.e. those that summon minions which you can use to attack the opponent or use to defend against such an attack) and was designed using a Monte Carlo based approach. This plays out a set of games from the current state using the UCT algorithm to simulate play in order to gather a sample of how the game is likely to turn out based on your choice of action at this point. So far the results of applying this to the slim-line version of Magic have proven pretty promising, and it will be very interesting to see this develop into more advanced versions of the game - not only to develop great automatic Magic players (a challenging goal in itself), but also to prove the power of the approach in an environment with extremely complex interacting effects - if it proves effective then it could reinforce even more the potential of Monte Carlo for game strategies in general. 
Monte Carlo Search Applied to Card Selection in Magic: The Gathering
Ward, C. D. &amp; Cowling, P. I., CIG 2009.
Download PDF Another great paper showcased an approach to extracting data from Starcraft replays in order to predict the strategy being used by the opponent (Weber &amp; Mateas, 2009). Broadly speaking the idea is to characterise a replay as a feature vector reflecting key points within the game such as when building are create and units trained. This allows for an analysis of the manner in which the tech tree is being expanded, which gives the option to predict what the aim of a player is - as a na&#239;ve example, they are unlikely to focus on unlocking high-end units unless they intend to use them for example, although the technique presented is much more powerful than just this level of observation. Generalising these into more broad strategies for classification can then identify trends within games that can be used, as well as invariants, particularly with an emphasis on the different game races being represented by the players. For example, in Terran vs Protoss games, a trend was identified where the vast majority of Terran players would create a Factory type building at around four minutes into the game. These trends can then be isolated and named to provide a broad description of a strategy being used, which can then be used to analyse the frequency with which it is employed in different. It was then shown that using this data, machine learning techniques could be used to predict strategies as early as five minutes into the game with a fair degree of accuracy (70%). 
A Data Mining Approach to Strategy Prediction
Weber, B. &amp; Mateas, M., CIG 2009
Download PDF Many of you will have seen the recent interview with Robin Baumgarten talking about his recent entry in the Infinite Mario competition, but one paper presented a complete inversion of the same basic toolkit. Instead of creating an agent capable of playing any level generated of Mario Bros, it sought to identify characteristics of a level that appealed to players in an effort to allow content designers to better understand what they are making (Pedersen, Togelius, &amp; Yannakakis, 2009). In order to do this, it generated a range of levels and humans were invited to play through them. By capturing the behaviour that these players exhibited, along with feedback on their opinions, a neural network was able to map the characteristic traits of the level to a range of metrics such as "challenge", "frustration" or "fun". Although by their own admission, the approach isn't quite there yet, its definitely one to watch as it gets enhanced. 
Modeling Player Experience in Super Mario Bros
Pedersen, C., Togelius, J. &amp; Yannakakis, G. N., CIG 2009.
Download PDF I also wanted to mention a paper that presented an approach to evolving multi-modal behaviours which was awarded Best Student Paper at the conference (Schrum, Miikkulainen, &amp; Member, 2009)&#8288;. The work presented an approach to evolving different behaviours within a neural net by introducing distinct operators that could be used to duplicate the network and introduce new connections between nodes. The example used was a small demonstration called "Fight or Flight" in which NPCs were evolved to either fight the player or run away from the player. The aim of the game is for the NPC team (four agents) to kill the player, however there are two distinct modes: 
Fight, in which the player agent is equipped with a weapon to fight back and damage the NPCs, and
Flight, in which the player agent has no weapon, making the NPC agents invulnerable.
 This gives rise to two competing behavioural techniques, one cautious and one aggressive, which both must be expressed. Using the new mutation operators they proposed, the authors were able to evolve agents capable of tackling either task with great success, meaning that this new approach to evolving neural networks for more complex domains is definitely looking promising. 
Evolving Multi-modal Behavior in NPCs
Schrum, J., Miikkulainen, R. &amp; Member, S., CIG 2009.
Download PDF The Diversification of AI 

Photo 1: The center of Milan, Italy where CIG '09 was held.
 The highlight of the conference for me was how seeing how powerful AI techniques are becoming as they begin to be applied in much more interesting and non-obvious ways. The award for Best Paper was presented to Hastings, Guha and Stanley of the University of Central Florida for their work on Galactic Arms Race (Hastings, Guha, &amp; Stanley, 2009), summarised in an excellent paper and presentation given by Stanley. Galactic Arms Race was previously covered on AiGameDev.com in this article, so I won't go into too much detail. However, the broad idea is that rather than focusing on using AI to build harder or more realistic opponents, the UCF team has instead created a game in which the weaponry evolves - the chromosomes define the mechanics of the weapon: spread, rate and even aesthetics and then fitness is evaluated based on the amount of use a particular weapon receives. Based on this a new group of weapons are made available for the players to collect (or ignore) at the next iteration, and the process repeats itself. GAR is played on centralised servers, so the research team has access to see the results of the evolutionary algorithms first hand, and rumour has it that the game will shortly be available through XBox Live. The game itself was developed inhouse by UCF, but despite this the visuals remain of quality fully comparable to industry - a far throw from what you might expect from an academic project, but proof positive that academia can create a high quality gaming experience around a specific research area (although this is somewhat less surprising given the team's track record; Stanley was the originator of the NERO project implementing the rtNEAT algorithm for trainable squad-based battles). The Keynotes... 

Screenshot 2: Forza Motorsport 1, with the original Drivatar technology.
 In contrast, the keynote by Microsoft Research's David Stern was something of a letdown for me; although a great presentation in its own right, it covered three main areas in which AI techniques have been applied to gaming. Firstly, the Drivatar system built into Forza Motorsport, in which gamers could "train" the console to drive the way they do, and then allow some races in the long career-mode to be played by simulation. This training is done using Neural Networks and attempts to replicate the way a player handles specific situations and types of track elements such as hairpin bends or chicanes. All well and good - interesting even - but Forza shipped in 2005. Secondly a Reinforcement Learning approach to fighting games was demonstrated, using Tao Feng: Fists of Lotus. This was a very interesting section of the presentation, being able to watch as reward tables were updated based on the AI's evaluation of what moves worked in given situations, along with video to highlight it in action at various stages in its learning, served as a great demonstration of the power of the approach. However, Tao Feng shipped in 2003, and regardless, this system did not end up being part of the shipped product. Finally there was discussion of the MS TrueSkill system for player matching and ranking - a nice application but again, something that has been built into all XBox Live titles since 2005. On a personal level I found these demonstrations interesting, and getting a look "under the hood" was quite informative, but there does seem to be something amiss when one of the biggest industry research labs is not able to show any work more recent than four year old research that has already been reasonably well disseminated. To some extent I believe (and certainly hope) that this lag is more due to commercial concerns of documenting ongoing projects than an entire research team resting on their laurels, but it was very noticeable for such a big name to be highlighting titles now a full generation behind that being discussed elsewhere at the conference. Mutual Engagement 

 These two examples demonstrate the extreme ends of a full spectrum of AI which is starting to come to the fore, and AI research being taken increasingly seriously. It was recently asserted at the IEEE AI/Games Networking Event held at Imperial College in June 2009 that 90% or more of AI in games comes down to A*. I think it would also be fair to say that a significant portion of the remaining 10% are recent games starting to take advantage of proven AI technologies. In general there is an increasing amount of interest and engagement between academia and industry. A few examples of this growing trend are the fact that Introversion's Defcon now includes an AI API to allow development of external bots, 2K Australia's healthy sponsorship of the annual "BotPrize" competition, and Eidos allowing data about XBox Live gamers playstyle to be recorded in Tombraider Underworld to enable player modelling. However it isn't just this industrial encouragement of AI as a side-project undertaken solely by academics and merely facilitated by contributions from industry that gives me hope for the future, it's something that seems pervasive right now, and its evident in all the articles you can read right here on AiGameDev.com. It's palpable how much more complex things are becoming as AAA titles start to implement more modern approaches to AI - perhaps finally this is the shift towards fulfilment of the Physics and AI Game Developers' often heard cries that surely this time, graphics have been pushed far enough and emphasis can be placed on other areas? Certainly, its true that the era of games having a single AI developer (if that) with a rudimentary understanding of a couple of algorithms from the 70's or 80's is over, and we are now all starting to talk the same language of architectures, models, evolution and a whole host of other modern techniques - and I for one welcome our new NPC overlords! References 
Player Modeling using Self-Organization in Tomb Raider: Underworld
Drachen, A., Canossa, A. &amp; Yannakakis, G. N., CIG 2009.
Download PDF

Learning a Context-Aware Weapon Selection Policy for Unreal Tournament III
Galli, L., Loiacono, D., &amp; Lanzi, P. L., CIG 2009.
Download PDF

Evolving Content in the Galactic Arms Race Video Gam
Hastings, E. J., Guha, R. K., &amp; Stanley, K. O., CIG 2009.
Download PDF

Iterated Prisoner&#8217;s Dilemma for Species
Hingston, P., CIG 2009.
Download PDF

A Game-Building Environment for Research in Collaborative Design
Tanimoto, S. L., Robison, T. &amp; Fan, S. B., CIG 2009.
Download PDF

Realtime Execution of Automated Plans using Evolutionary Robotics
Thompson, T. &amp; Levine, J. CIG 2009.
Download PDF</div></summary>
  </entry>

  <entry>
    <title>Not in My Line of Fire! Sensible Combat </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/-maSINurLcg/"/>
    <id>http://yoursite/article/?i=d5bd0c27b02c02615e1d5506875fe8c4</id>
    <updated>2009-10-01T18:01:55-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/-maSINu</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Don't you hate it when your AI buddy runs straight into your line of fire? Doesn't it look even more stupid when enemies run through each other's line of fire while trying to approach you? These are the kinds of bugs that we've been able to solve using the current generation of console hardware, and particularly using multi-threading on the PS3. This is the second article in the series about parallelism in KILLZONE 2's AI technology from the SPU perspective. The first article, about the use of cover maps to speed up combat calculations, can be found here. Both articles are based based on a talk that Technical Director Michiel van der Leeuw gave at the Game Developers Conference '09. Here's how he framed this problem during his presentation: 'It's really annoying if everything's so scripted that people are constantly standing in your line of fire, or AIs standing in their own line of fire. It's a lot of work also to script the AI to avoid that; it makes for static situations. It doesn't work well with our realism we were after.' In practice, Michiel points out that it can be quite a challenge to make the AI believable in dynamic situations. Such line of fire issues break all immersion. In the following article, you'll find out how Guerrilla Games fixed these problems using Jobs on the PS3's SPU.[...]</div></summary>
  </entry>

  <entry>
    <title>Semi-Robotic Swans, New Writers And Care</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/B7vHCDn_4d0/"/>
    <id>http://yoursite/article/?i=98eeb9311ef975db75c942bdf2edf92b</id>
    <updated>2009-10-01T18:01:55-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/B7vHCDn</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  I used to think of this site as a swan. What you see on the surface, including those many in-depth features and attentively formated articles, have that apparent elegance of a swan gliding over a lake. Under the water, what you don't see is little duck feet paddling like crazy. It used to be just me working full time on the blog, then my wife Petra joined and we launched small startup - and after that I took on a second shift ;-) These days, however, the best analogy is some kind of amphibian multiped with 10 or more limbs each pushing in the same direction. So if a swan is still an appropriate metaphor for our work on the site, it's more a half-mutant semi-robotic multi-legged swan that's gone much further than the pond we originally intended it to swim in! What I'm trying to say is two fold: firstly, thanks for being a duck leg. This site wouldn't work without the passion that's palpable in this community, and frankly without it I probably wouldn't want to do this either. Secondly, things are changing fast and we're doing our best to cope! So bear with us. The Premium area means we'll be around as a small business as long as we don't do anything stupid, so you can understand why a lot of our efforts are focused on over-delivering every month; it helps make sure we can keep doing this full time. However, I realize that the blog right now isn't quite up to the high standards we set ourselves over the last few years, but we've been working on that... A few weeks ago, I wrote an email asking for contributing authors for the blog, and I picked the two people that best fit the profile. In an incredible coincidence, one was a judge in this year's 2K Bot Prize (Luke Dicken) and the other person was the 2K Bot Prize winner (Jeremy Cothran)! They're both working on their respective debut articles: one is an editorialized report from CIG '09 and the other is about using sqlite for AI in Unreal Tournament. NOTE: If you'd also like to write for the blog, send me an email at &lt;alexjc at AiGameDev.com&gt;. What follows below is a quick update about what's new and what to expect from the blog &amp; site. Career Opportunities With the hope of the economy improving (or in the interest of stimulating it), there's now a new sub-forum for Career Opportunities in Game AI, which is intended for studios that have positions open, as well as independent developers looking for contracts. Here's how it works currently: 
Anyone can read the forum, even if they're not signed-up to the site.
To post an announcement, you just need to be a premium member.
  I posted the first job opportunity yesterday. It's a position as a AI programmer on the Game Brains project, a consortium based in Dublin made of one company (Neat Sciences Ltd) and two research institutes (University College Dublin and the National Digital Research Centre). The job is "to build a library of reusable AI components." Experience with game development is required and knowledge of modern AI techniques such as evolutionary algorithms is suggested. You can read the full post to find out more about the position. New Staff Writers Jeremy Cothran won the 2K Bot Prize this year with his SQL-based bot. He's currently writing about the bot's design and architecture, so stay tuned... After that, he'll be writing a more regular feature about independent, open source and amateur projects or mods that feature AI. If you think you have a game that's interesting, feel free to send it in to &lt;editors at AiGameDev.com&gt;. Luke Dicken is an AI Researcher based in Glasgow, who specialized in Automated Planning for Autonomous Systems. He's @LukeD on Twitter, and his homepage is here. After his report from CIG '09, he'll be writing a regular column about white papers that are relevant to game AI, similar to the reviews I occasionally write about recent research. Interesting Articles... Someone mentioned in the IRC channel (#gameai on irc.freenode.net) that all the interesting articles are Premium now. I told him that wasn't entirely true, but certainly all the Premium articles were interesting! As evidence, here are a couple of articles you may have missed - which will keep you busy until the new columns get up and running: 
Memento, Temporal Coherence and Debugging Planners
Game AI: Beauty and the Beast
Strategies for Implementing Cover Behaviors
How to Calculate Paths to Multiple Destinations
9 Tips for Creating Rich Behaviors on a Low Animation Budget
RTS to FPS: Using Strategy AI in Action Games
The Crysis of Integrating Next-Gen Animation and AI
 We're also lining up some great highlights for the Autumn, so be sure to stay tuned! Comments and suggestions are also very welcome - as usual.</div></summary>
  </entry>

  <entry>
    <title>Helping Sam Fisher Look Cool with AI-Ass</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/kjdo9YDEGEE/"/>
    <id>http://yoursite/article/?i=935a10e5e15e1f09306248b9c94adf95</id>
    <updated>2009-09-09T17:30:51-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/kjdo9YD</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

One trend I've been predicting and encouraging for a few years now is the increasing use of AI technology in other aspects of game development - particularly for player control. Game AI has already solved some particularly difficult challenges for making context-sensitive decisions then making sure they happen correctly during execution, and it's obvious why such concepts can benefit many places in a game engine. I talked about this in my keynote at the AI Games Network Workshop on Players &amp; Avatars... Let's just say the subject of applying AI to player control was debated passionately then, so I figured this should make for another heated developer discussion! At the time I gave my talk, the only examples of AI assistance were things like local navigational aids via smart objects. However, with in the upcoming iteration of the stealth shooter franchise, Ubisoft is set to provide another perfect example of how AI techniques can be used to assist the player locally, without it feeling frustrating. In this the rest of this post, you'll see a video of this 'Mark &amp; Execute' gameplay that's new to Splinter Cell Conviction. Similarly to the previous discussion, I'll also provide some arguments on either side why it can be a risky choice, but what the rewards can be. (You should also read the many interesting and thoughtful comments posted last time around about the Last Known Position visualization.)[...]</div></summary>
  </entry>

  <entry>
    <title>Infinite Mario AI using A* Search: The D</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/qKAyC5E4u_g/"/>
    <id>http://yoursite/article/?i=9f30647eb82c77f28517dc2506e7307f</id>
    <updated>2009-09-09T17:30:51-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/qKAyC5E</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Unless you're on some kind of social media and entertainment news diet, you've no doubt heard about the Infinite Mario AI competition, and Robin Baumgarten's A*-based solution. His videos became overnight hits on Reddit and gaming news sites, and his work was even featured in the mainstream press in various countries around the world! Since Robin is a long time reader and active participant in the forums here at AiGameDev.com, I felt responsible to pick his brain about the subject and go into more details about his prototype! This article is the definitive interview about his Infinite Mario AI, from its background and implementation to the upcoming contest and possible competitors... NOTE: Some of the questions below were asked my active IRC members of the #gameai channel on irc.freenode.net. It's our official channel, and for artificial intelligence in games generally. Don't hesitate to join us! 
 
 Alex Champandard: Hi Robin! Now you're a famous Ph.D. reasearching rockstar, I guess your schedule is very busy. Thanks for taking the time to answer these questions. :) Robin Baumgarten: Hi Alex! Thanks for giving me an opportunity to present my take on this Mario AI! Also, I'd say one Mario AI doesn't make a rockstar, it is just a lucky combination of AI applied to a really famous video game plus some Reddit/YouTube updraft that made it so well known. A lot of the interest comes from people who are unfamiliar with AI techniques and are easily enthused. In this respect, I'm quite happy to be able to show them what AI in games can do these days. The Contest AC: The first time I read the Mario AI contest page, I got the impression that Julian Togelius was particularly keen on promoting techniques based on computational intelligence and machine learning. Based on the way the contest was defined, my instinct told me that someone being pragmatic using classical artificial intelligence (even game AI *gasp*) could probably do better at this! Then I saw your video and thought, "Aha! He must be someone from industry; it shows with the practical down-to-earth approach." So it quite surprised me to find out it was you - someone I knew doing research in academia :-) RB: My train of thought was quite similar to yours, actually. However, I think these relatively simple problems are well suited to be tackled by computational intelligence and machine learning. They provide a simple enough interface, but a complicated enough game mechanic to be not immediately obviously solvable. Machine learning techniques are really difficult to handle for complicated (or even real-life) problems, and that's why games can be an ideal step between academic toy example and real-life application. AC: Do you think this contest leaves enough room for less proven or techniques that aren't as pragmatic as yours? Have you won this already? RB: By allowing all kinds of entries for the competition, the organiser Julian Togelius wanted to compare how different techniques can be applied to a problem, and I think he succeeded in showing that, but maybe not in a way he intended. The pragmatic use of a down-to-earth pathfinding algorithm works here, because the game is entirely deterministic and the physics engine is not a black box. That is a terrain where planners are very strong, and machine learning algorithms (and similar non-optimal and evolutionary techniques) are bound to perform worse. I doubt any entry that does not predict the game state and plan ahead can win this, however there are now entries popping up that seem to copy my solution exactly. That's probably the price for publishing video of my solution early :-) Editor's Note: Since the interview, a prequel to the contest has already taken place, see this PDF file for the full report. Robin's algorithm did indeed win, but it was only by a narrow margin, just in front of multiple other similar implementations! The final contest is next week; Robin must be confident since he's currently hiking in the swiss alps. ;) AC: To be a bit more controversial, would you have to redefine the rules to justify the use of computational intelligence? RB: I definitely think the rules of the competition have to be altered to allow a fairer competition. As soon as the typical elements of success for a planner are taken away - say determinism and known physics - computational intelligent entries are the way to go, I think. The two don't exclude each other though; I could think of a learning algorithm that learns to predict the future state, which is then fed into a traditional planner. The Implementation 

Figure 1: Slides explaining the idea and the algorithm. (Click to enlarge.)
 Let's dig into your implementation a little more. #gameai: Are you planning against the entire level, or just the rightmost edge of the screen? RB: The interface for the competition only provides information that is also visible onscreen, i.e. enemies and level details outside the right are unavailable. So the algorithm only plans a second or so ahead at every search iteration. AC: When do you replan and how do you integrate the new plans with the current plan? RB: To extend the amount of CPU time I can spend on planning (without getting slower than real-time), I spread out the search over several frames of the game. In the current version, that is 4 frames. In these 160ms, Mario can move a considerable amount, about a fourth of the entire screen. To have more time to react when a new enemy or a gap appears on the right side of the screen, I trigger immediate replanning events whenever a new obstacle is perceived. I have found that an acceptable plan is found quick enough to entirely replace the previous plan, there is no plan-repair required. AC: Did you reuse any code, e.g. for the A* or representation of the problem? RB: The A* algorithm has been written from scratch, as it is a simple enough algorithm to not require too much work. However, for the simulation I completely reused the game engine, which was made available by the competition organisers. I stripped the rendering code and almost immediately had a working simulation. Given that Mario physics are really simple (only about 200 lines of simple arithmetic), performance was not an issue here. I can imagine that this would fail with larger games such as 3D shooters. One of the biggest hassles during this project was actually the Java serialisation code to store states while I was exploring the search space. This wouldn't have been easier in C++ though I think, it is just an artifact trying to beat the existing physics engine into a planning algorithm. 

Figure 2: Slides explaining the heuristic. (Click to enlarge.)
 #gameai: How does your heuristic work? are you taking the benefit of powerups or anything else into account? RB: The main part of the heuristic is a simple time-constraint: try to get to the right of the screen as fast as possible. Therefore, the path-cost function is the spent time since the start of planning, and the heuristic is "given maximum acceleration, how long does it take to reach the goal". As the distance to the goal isn't known, an arbitrary (large) constant is used. In that sense, I'd say that the heuristic is not quite admissible (i.e. does not overestimate the cost to reach the goal), but because the overestimation is the same for the entire search space, this isn't a problem. To avoid running into enemies or falling into gaps, a high penalty is added to the heuristic so that it does not get chosen as the next node by the search algorithm. #gameai: Can you envisage applying your solution to generate a behavior that maximizes points? Would there be any challenges there? RB: This competition only rewards passing a level and does ignore any other metrics such as score and enemies killed, therefore I completely ignore these (except if I'm forced to notice them to not get Mario hurt). As a pure pathfinding problem, trying to get as many points as possible will be much more difficult to solve though, as it is not clear what the heuristic and immediate goals should be. However, I could imagine adding a planner on top of the pathfinding which guides Mario to each of the coins, boxes and enemies successively and lets him kill them. This would not be optimal at all, but because there is no time-penalty for taking longer (within the 180 seconds allocated for each level) it should work. It would be interesting to see if it's possible to optimise it such that Mario keeps jumping on Bullet Bills to get more points until the time almost runs out and then rushes towards the goal. AC: While working on the motion planner (free registration required) in our AI Sandbox, we quickly discovered that A* sucks at search problems in continuous space. Basically you just end up with a tree to search (there are rarely ever reused states, so there are no junctions to make it a graph). So A* doesn't shine in these cases... How does this problem space compare? RB: This is true for this problem as well. While time is nicely discretized by the framerate, space is also (virtually) continuous in Mario. This creates a search space which, as you mentioned, is too large to allow a visited-states list, and even if there was one, minute changes in Mario's position (for example by walking forward and then backward, but because of friction and momentum, Mario does not end up at the same spot) would create a new state. I tried to tackle this with a discretised visited-states list, but that didn't prove to be a promising approach. Luckily, with the current level design created by Infinite Mario (the competition software), replanning and backtracking is rarely required. This would be more difficult with a complex level design that involves dead ends. AC: Do you think A* is a good approach for this problem? Would you consider a different search algorithm that's better suited to continuous domains? RB: I think we would either have to change the algorithm or transform the domain to reach a good approach. For the latter, there exist lots of techniques that abstract the space into linked local clusters and apply a hierarchical search on them. A continuous search space is often too big to search through exhaustively or optimally, especially if there are also moving obstacles, so that rougher heuristics and more reactive methods (such as anti-gravity movement, for example) are called for here, I think. I haven't really looked into these a lot, though. 

Figure 3: Figures illustrating the A* search of the move tree. (Click to enlarge.)
 AC: Are there situations where stopping and waiting would be a good choice? RB: In Mario, this occurs only rarely, for example when a path is temporarily blocked by an enemy such as a Piranha Plant or a Bullet Bill. Because all other movement would lead to a very high cost (the heuristic penalizes getting hurt), the solution might be to just wait, even though it does not decrease the distance to the goal. In my implementation, this behaviour emerges once in a while, but is not required often. The Impact 
 
 AC: Your prototype has been hugely popular; how do you interpret that? Is there more interest in AI &amp; games these days? RB: In part I think this popularity comes from observing something very well known and loved, such as a video game classic, and transforming it into something new. In this case, almost everyone can relate to playing Mario and knows how difficult (or not) it is to play it. For many people, it then is very astounding and surprising to see a computer playing through it with no visible effort and in break-neck speed, even though the algorithm behind it is much simpler than any AI that is programmed into most modern games, which calculate probability models whether opponents can see a player and so on. I have gotten a lot of comments of students that say they'd love to program similar AIs (or regret not taking the AI course in second year), so I think there's definitely a higher interest in AI for games these days. Of course this also creates a higher expectation of quality AI in future games, so I don't think we can rest on our laurels, but have to keep up with the cutting-edge of AI to not disappoint our players. I think there's also one or two blogs about that on the Internet, but I can't think of their names right now... AC: In a way, the press preceeding this event has already made it impactful! However, from a technical perspective, what do you think about the impact of the competition? What do you expect we'll learn from this? RB: I don't think the competition itself will lead to new techniques for solving (game) AI, however it will definitely be a good opportunity to look beyond one's own nose/favorite algorithm and see what other fields of research can bring to the table. Many conferences have competitions like this, and usually they are barely noticed outside academia (which might be our own fault) so I am not sure if this one will be any different. However, as the academic field gets more mature, we will see more elaborate games used as competitions, and fancier algorithms used as their solutions. If not already, I think these competitions might soon prove to be a treasure trove, also and especially for game developers. Many thanks to Robin for taking the time to answer these questions. If there's anything else you'd like to ask him, don't hesitate to post in the forums!</div></summary>
  </entry>

  <entry>
    <title>GDC Europe '09 Report: Procedural Conten</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/FEHDoIAir2I/"/>
    <id>http://yoursite/article/?i=de79509c2a943746183f633a0dc21d15</id>
    <updated>2009-08-24T07:00:56-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/FEHDoIA</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  Earlier this week, GDC Europe took place in Cologne, Germany. I wasn't planning on going, but in the end I went there for two reasons: first to discuss options for our Game AI Conference next year, and second to find a large list of interesting projects for the mentoring program! Having these specific goals in mind for the whole time made the trip very succesful. That said, from a pure content perspective, I felt this year's GDCE was not up to the standards of the GDC Lyon in 2007 which had many tracks from research and related industries that were very useful [1, 2, 3], or GDC Paris in 2008 with more value-packed talks which we complemented the day after with our inaugural Game AI Workshop [1, 2]. This year's GDCE in Cologne was lacking a bit of direction; as a small business owner in the industry and independent developer, there's typically a wide range of talks that interest me. However, many talks were simply soapbox rants or thinly veiled PR sessions - more abstract than the typical project-specific talks. There were some noteworthy sessions though! In this article I'll cover the talks I found the most useful, and of course add my interpretations and thoughts on the subject. 

Photo 1: The Rhein and the K&#246;ln city center.
 Technical Sessions Procedural Content Generation Dierk Ohlerich talked about the process of generating geometry, textures and sound procedurally. In the past, he and his demogroup worked on .kkrieger, a FPS in 96kb and .debris, a graphical demo in 177kb. This kind of compression, according to Dierk will help most games reach high-quality graphics in the 10-100 Mb range. The approach that Dierk describes is a set of operators connected in a graph that process information and incrementally build up objects in a more and more complex fashion. These operations for example can be the typical Photoshop filters applied onto pixel maps, or creation and manipulation of 3D geometry. Dierk claims that artists become comfortable with this technique, as it only involves tweaking parameters for the operations and the skills are similar to those used in traditional graphics programs. I asked Dierk about the animations in .kkrieger, and apparently these are built using a simple physical simulation driven by some procedural controllers. He says, however, that this approach can only apply to robotic creatures and would never be as realistic as traditional animation. Likewise, speech won't be able to work procedurally at the quality levels of voice capture. It's safe to assume the future of AI in games will be more example-based! 


Photo 2: Dierk Ohlerich talking about content generation graphs.
 Off Road Physics This was a presentation by Jim Buck about the physics in PS1 cult-classic Rally Cross. This session was a breath of fresh air compared to most of the other talks; the problem was introduced nicely, and the solution was well motivated, there was a demo, good slides with graphics. It's the kind of stuff you expect from presentations, but few developers have the ability to do it in practice. I picked Jim's brains about the AI in the Q&amp;A after the talk, and briefly outside. The racing AI does not cheat, it also controls the same "jelly" box made of 8 point masses attached by springs. This is done by a manual local controller that can steer towards points in the world, and these points were apparently placed by designers playing the game. This seems like a very innovative workflow, especially considering this was over a decade ago! That said, Jim did admit that the AI regularly needed to be tweaked and fixed as the physics model changed - although there's rarely a good solution to this in physics-based games. Cars in front would pick worse racing lines, while cars at the back would make better choices. Since there was no cheating, this was in effect a step towards what Black Rock is doing with Pure today. Natural Motion's Morpheme 


Photo 3: Simon Mack presenting morpheme.
 I'm generally skeptical about Natural Motion's most famous product, euphoria. It's a noble goal, but I'm not sure the implementation lives up to the hype - as I described in much more detail in this editorial. However, with many more iterations I'm sure Natural Motion will get this right eventually! I went to this session to find out where they stand generally... This sponsored presentation by Simon Mack was about their other runtime product, morpheme. I didn't know anything about the tool before, but it's basically a state-based blend tree. This is pretty much the standard industry implementation for a low-level animation system these days. I was impressed to say it doesn't seem to be aiming up in the clouds like euphoria and what it does it seems to do well. It'd be interesting to take a look at the SDK. One part I found interesting and very familiar is that they're using morpheme as a platform for optionally including more advanced animation features, such as picking a transition from rag-doll based on the nearest posture, or lining up the feet using their feature-based footplant detector. AAA Automated Testing for AAA Games I was very much looking forward to this talk since a lot of our own AI Sandbox code is automatically tested. Unfortunately, Francesco Carucci's talk was more about production than actual development with automated tests, and focusing exclusively on unit tests. He spent more time convincing the audience and helping producers convince their developers that testing is a good thing. A talk explaining exactly how they actually do unit testing at Crytek would have been much more valuable for people getting started with tests. Luckily, the audience questions were much more practical: 
Francesco's project is one game team that's being used as a test at Crytek for automated testing.
Currently, there are over 1000 unit tests that run in about one second after compilation.
Francesco thinks it's better to throw away legacy code and rewrite it test-driven rather than trying to incrementally test it.
Concerning functional testing, his approach was to write a custom framework within the game and different from the unit test framework.
 Personally, having been using unit tests for over 4 years now, I disagree with Francesco's last two answers. First, like any huge rework of the codebase, it's dangerous to just throw out code; I'd bring it under test incrementaly by refactoring and adding functional tests to make sure no in-game result is broken in the process. Second, at AiGameDev.com we use a functional test framework that's exactly the same as the unit test framework; the only difference is that functional tests run longer and can load data from disk, use non-interactive graphics, etc. If automated functional tests require a different framework, then it's probably the engine that isn't built for automated testing. Design Sessions Advanced Racing AI in Pure Eduardo Jimenez gave this exact talk at our Game AI Conference in Paris a few months ago, but I too busy with organizational stuff to really appreciate it and question time was limited. As it turns out, there was a speaker change also which gave me the opportunity to meet Iain Gilfeather briefly - as well as ask tricky questions! Some of the additional topics that came up during Q&amp;A that weren't in Eduardo's talk: 
Someone claimed the idea of adjusting skills to a race script was just like rubber banding, and asked if Iain had thought about profiling player skills and adapting the AI based on that? Iain answered no, and I'd question whether it would be anywhere near as good in practice. That question seemed rather academic more than anything, there's lots of research to be done in player profiling, but there are only poor results so far.
I asked Iain how they approached the play testing process, and if there were any programmer-type players who tried to break the AI. Iain mentioned they used mostly players of beginner- and intermediate-level, and nobody had managed to expose the AI like this.
Someone in the back asked about the skills that were adjusted by the race management. Ian explained these included four skills in total: the ability to follow the racing lines, jumping skills, tactical selection of paths and one more skill that wasn't the throttle.
I asked if they avoided using the throttle as a skill on purpose, since it'd be much closer to what traditional rubber band AI does. And indeed Iain confirmed this; it's particularly obvious if you overtake someone in a straight line that's going slower than you! Iain did mention that there was some threshold set though, presumably the ability to accelerate.
 Generally speaking, I think the Black Rock team are right about the applicability of these ideas to other genres and experience management in general. 

Photo 4: Iain Gilfeather showing a video demo of Pure.
 Building a Level in 45 Minutes Sascha Gundlach did a sponsored session about creating a level in the CryEngine 3's latest Sandbox editor. He chose to make a simple island that would be the first tutorial level for a FPS, basically teaching the player how to master the game's controls. The bulk of the presentation showed off the variety of terrain editing features they have in place, for example height maps, road tools using splines and the magic Far Cry jungle brush that creates a lush forrest in a couple clicks. From the game logic side, you can basically drop AI NPCs into the game and have them behave correctly by default without any scripting. All that's required is a simple navmesh pre-process that only takes a few seconds, and is accessible from the Sandbox's menu. For level scripting, the Sandbox uses a node graph system that allows trigger shapes (e.g. a polygon on the floor in this case) to send events to other nodes. Sascha wired up a physics trap using such a trigger that would then send a physics impulse to a set of physics objects that would then go rolling down the hill towards the player. The biggest take-away from this session, apart from the fact it's easy to create Far Cry and Crysis levels in CryEngine, is the power of WYSIWYG for gameplay. Sascha could create a section of the level and play it instantly without having to wait for anything to load. This kind of workflow is probably one of the biggest things we can do to improve AI design and development. 

Screenshot 5: This scene could be built with the CryEngine magical Jungle Brush!
 Keynotes and Other Talks These high-profile sessions left many attendees with mixed feelings... EVE Online and DUST The EVE Online keynote stole the show, partly because the game and topics discussed were interesting, but also because it was a very professional presentation with some exclusive gossip. The slides looked great and did not have pages full of cut 'n paste text like most other keynotes. On the technical side, I've always been impressed with CCP's approach of using Stackless Python on top of a cutting edge graphics engine. Thanks to this, they are making MMO innovation seem like a simple process! It'll be interesting to see how the company ties together their console FPS along with the PC game, and how the simulations evolve. Interactive Narrative for Mature Audiences 


Photo 6: David Kage pointing out the obvious narrative of most games.
 In this presentation, David Kage from Quantic Dream made the mistake of taking almost double the time slot than he had available to him. Many attendees found this a little rude and unprofessional (especially for a keynote speaker), which didn't leave a very good impression. The cause of this was too much content: the presentation was a melting pot of topics, most of which have been discussed to death before online in blogs or game development forums. While insights into Heavy Rain would have been very welcome, David could also have talked about his design decisions on Farenheit in more depth - which would have been more useful for developers. This talk left me with two big impressions: 
Many of the topics David brought up I didn't feel were anywhere near as controversial as he thought they were. Most developers in the room agreed with him! Maybe 5 years ago he had to fight to get his point across, but now most topics he brought up are increasingly common (e.g. use social emotions in games).
I don't believe the way forward is making more roller-coaster type games, as David suggested in contrast to open sandbox games which he thinks are not fun. While my own motto is that "Emergence is not good enough," there are many ways to direct gameplay in a fun way within a sandbox; that's the whole point of good AI.
 All in all, I can't wait to see what he and his team have done with Heavy Rain! The Past and Future of Crytek Cevat Yerli's talk was also long and packed with summaries of topics that have been also discussed online on blogs and news sites over the past few years, but unfortunately presented in a bit of a chaotic fashion. However, there were some interesting example photos and their corresponding rendered version in CryEngine 3. Like the Quantic Dream keynote, had this talk focused a bit more and used more real-world examples from Crysis, it would have worked much better. Most importantly for game AI developers, Yerli suggests focusing on AI for the next few years as we're pretty much reached the video card's bottleneck for this generation of graphics. Even the CryEngine 3 may have extended a bit too far for this console generation with certain features combined with MSAA - at least if 30 FPS is the goal! Conclusion For the talks I didn't mention, there are some slides available online. You can find them on this page in the GDC Europe 2009 section. Only some of the sessions have PDF or PPT files available unfortunately. The whole experience in Cologne was interesting for me, including the parties for meeting friends, talking business, and even getting to know other developers! What goes on outside the sessions is often the most important part of such events. It'll be very interesting to see what happens next year for GDC Europe. The focus did seem to be on the business side of the industry, but it's unclear whether it was by choice or if there simply weren't enough developer submissions. Either way, this event felt a little disjointed because of the move from Leipzig, but ultimately the content wasn't quite there. 

Photo 7: Long exposure photograph of bats around the K&#246;ln Dom.
</div></summary>
  </entry>

  <entry>
    <title>Waypoint Cover Maps and Efficient Raycas</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/Eu-xGZKHwGs/"/>
    <id>http://yoursite/article/?i=8bc819be994a0b4a54859a04146c7bde</id>
    <updated>2009-08-24T07:00:56-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/Eu-xGZK</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Earlier this year at the GDC 2009, the Technical Director at Guerrilla Games Michiel van der Leeuw presented a case study of Killzone 2 entitled 'The PlayStation&#174;3's SPUs in the Real World'. A section of Michiel's talk focused on AI and three topics in particular: cover maps, threat prediction and line of sights. This is the first of three articles that digs into the AI technology he discussed. This part of the coverage looks into cover maps, in particular how they can be used to optimize raycasts - which are often the most expensive AI operation. Below you'll find in-game screenshots, example cover maps, and a transcript of the relevant part of the presentation. The juicy bits include the representation of the cover maps, compression, and how they are used in parallel in the PS3's multi-core environment. Thanks to Michiel for sharing the slides! The AI department at Guerrilla Games is currently staffed up, but the Michiel mentioned they're always looking for talented AI, (humanoid) animation and game code enthusiasts.[...]</div></summary>
  </entry>

  <entry>
    <title>Inside Xaitment: Workflow Video, New SDK</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/7FdoRpE1S2M/"/>
    <id>http://yoursite/article/?i=cef94d296bd955cea002ea9c277c6e79</id>
    <updated>2009-08-14T01:26:36-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/7FdoRpE</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The current economic climate doesn't seem to be distracting the middleware industry too much, in fact now seems like the time to be making new partnerships! Xaitment, an AI middleware company based in Germany, recently announced they've integrated the [...]</div></summary>
  </entry>

  <entry>
    <title>Level Up and Get into Industry: A Semest</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/qcuswKiefuc/"/>
    <id>http://yoursite/article/?i=49a2e827a4503f7f958d9aa0e67d51f2</id>
    <updated>2009-08-13T06:00:55-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/qcuswKi</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  You can debate modern education, compare games degrees and plot career moves all you want... In the end there's almost nothing more valuable for getting into the games industry than making a solid contribution to a known project, while at the same time working with experienced developers. This goes way beyond what any recruiter could do, and it helps the games companies rationalize their hiring risks better. After almost a year of work on The AI Sandbox involving multiple core contributors, and months of preparation for this next phase, I'm pleased to say we're in a position of being able to provide opportunities for working on such a project - specifically focusing on game AI. I'm launching a new program for a limited number of people to help co-develop parts of the codebase. Think of this as a hybrid between a Summer of Code and a mentoring program, though it will be more intense, hands on and results oriented. NOTE: We've already got 3 developers signed-up for this program, so if you're interested let me know as soon as possible. Email &lt;alexjc at AiGameDev.com&gt; for details. Background Jad Nohra is currently the main sandbox contributor (excluding myself). So far he's worked on the A* implementation and the templatized search library [1], hierarchical pathfinding, improvements to the terrain analysis and area generation [2], and most recently motion planning [3] - among many other things. After all this hard work, I set him up with some of my contacts and well-deserved recommendations. If all goes according to plan, he will be in an amazing AAA AI Programming job by mid-September. (Details and a short interview will follow soon hopefully!) In parallel, I'm realizing the importance of coaching as a skill for both teaching and improving the game development process. Since this model has worked well so far and it seems there's something in it for everyone, I'm keen to take on new "padawans" - a term that was chosen above all the other options by the first few candidates! DISCLAIMER: This is not a miracle recipe, as you'll get as much out of it as you put into it... Jad put the most into it and got the most out of it. As a reference, it took over 6 months of working together to get to this point. 

 The Offer I'm looking for volunteer contributors who are passionate about game AI to work with me directly on the AiGameDev.com Sandbox. It'll be a mix of programming, design and software development focusing on AI, animation and general game development. Like game programming in general, there will be a lot of hard work - but we'll balance that with interesting tasks as well! In particular, I'm interested in hearing from you if: 
You're a dedicated developer and your top priority is to get into the games industry.
You expect to set aside at least 20h a week over the next 6-8 months to work on this.
You have 4 or more years C++ experience as a primary language, capable of working with other's code.
You can read, write and speak English fluently.
 This list isn't a fixed requirement, but we're looking for roughly this type of commitment. Anything less won't be really worth it for either side. Also, you don't have to have professional experience in the games industry already (that's the whole point of this mentoring), but I'm looking for people who'd describe themselves as comfortable with the C++ language and tools we use. Your responsibilities will be the following: 
Help build, refine and improve the AI Sandbox's codebase.
Develop these systems to reflect industry practices.
Work with other volunteers to design systems and review the code.
Make sure the documentation and tests are in place.
Implement the features into demos and samples.
 In exchange, you'll get the following: 
Advice and feedback about your programming work.
Small group and 1:1 mentoring about technology and implementation.
Career advice and support to help you get into the industry.
Extended access to the Premium Member content.
Credit in the sandbox distribution and articles about your work.
...
 I can't really quantify exactly what you'll get in return; I've gone beyond what's on this list for some previous contributors on the Sandbox. But I can guarantee you'll get as much out of this as you put into it. If you have questions don't hesitate to email me at &lt;alexjc at AiGameDev.com&gt;. 

 Vision The big plan is to push towards a version 1.0 (keeping the current semi-open development model), then prepare an SDK for release (which will include some of the code as libraries only) and possibly a public demo. The goal of this version 1.0 is the following: 
To simplify the process of creating mini-games with animated characters.
To make it easy to experiment with AI designs and prototype techniques.
To demonstrate simple and commonly used solutions from industry.
 The exact features will depend on progress, the number of padawans, and how many animation assets we can get our hands on. Overall, we'll be aiming towards a simple paintball-like combat environment where individuals can complete simple objectives like capture the flag or hold an area. Initially, we'll focus on individual behaviors over the next semester, such as animation and the blend tree, the locomotion system, dynamic pathfinding and navigation, the sensory system, and general decision-making and control. Many of these systems are in place already, but there are lots of details to dig into and improve! Interested? Post a reply below if you're interested and feel free to email me via the following address: &lt;alexjc at AiGameDev.com&gt;. Either way, these are exciting times; stay tuned!</div></summary>
  </entry>

  <entry>
    <title>Behavior Capture and Learning Sports Gam</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/SlScRVn9ZKw/"/>
    <id>http://yoursite/article/?i=6aa1d9854018c094a23fd0e8996ce8e4</id>
    <updated>2009-08-06T07:00:43-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/SlScRVn</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

Machine learning in games has always been a controversial subject. While academics and enthusiasts simply love the idea of applying ML to games, currently it's rarely used in industry. The reasons for this is partly a question of technology, and partly methodology - both of which can require different skills compared no classical game AI. However, the temptations of unlocking the door to designers creating behaviors are hard to deny! For these reasons, hearing experiences and case studies from developers who've built such technology is particularly interesting. I recently republished an interview and analysis of Artificial Contender. The Technical Director of this product, Iskander Umarov, also recently gave a presentation on the subject where he answered all questions about the technology. This is a presentation about behavior capture in general and how TruSoft approaches the problem. In this session, you'll be introduced to the concept of learning by example, then discover the different technologies that can be applied to this domain. In the second half, you'll see how this kind of technology can be applied to commercial sports game, showing learning by imitation used in practice.[...]</div></summary>
  </entry>

  <entry>
    <title>Level Up and Get into Industry: A Semest</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/PuZuO2hTMjo/"/>
    <id>http://yoursite/article/?i=1a32170278e589cfc6f7f903b94082dd</id>
    <updated>2009-08-06T07:00:43-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/PuZuO2h</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  You can debate modern education, compare games degrees and plot career moves all you want... In the end there's almost nothing more valuable for getting into the games industry than making a solid contribution to a known project, while at the same time working with experienced developers. This goes way beyond what any recruiter could do, and it helps the games companies rationalize their hiring risks better. After almost a year of work on The AI Sandbox involving multiple core contributors, and months of preparation for this next phase, I'm pleased to say we're in a position of being able to provide opportunities for working on such a project - specifically focusing on game AI. I'm launching a new program for a limited number of people to help co-develop parts of the codebase. Think of this as a hybrid between a Summer of Code and a mentoring program, though it will be more intense, hands on and results oriented. NOTE: We've already got 3 developers signed-up for this program, so if you're interested let me know as soon as possible. Email &lt;alexjc at AiGameDev.com&gt; for details. Background Jad Nohra is currently the main sandbox contributor (excluding myself). So far he's worked on the A* implementation and the templatized search library [1], hierarchical pathfinding, improvements to the terrain analysis and area generation [2], and most recently motion planning [3] - among many other things. After all this hard work, I set him up with some of my contacts and well-deserved recommendations. If all goes according to plan, he will be in an amazing AAA AI Programming job by mid-September. (Details and a short interview will follow soon hopefully!) In parallel, I'm realizing the importance of coaching as a skill for both teaching and improving the game development process. Since this model has worked well so far and it seems there's something in it for everyone, I'm keen to take on new "padawans" - a term that was chosen above all the other options by the first few candidates! DISCLAIMER: This is not a miracle recipe, as you'll get as much out of it as you put into it... Jad put the most into it and got the most out of it. As a reference, it took over 6 months of working together to get to this point. 

 The Offer I'm looking for volunteer contributors who are passionate about game AI to work with me directly on the AiGameDev.com Sandbox. It'll be a mix of programming, design and software development focusing on AI, animation and general game development. Like game programming in general, there will be a lot of hard work - but we'll balance that with interesting tasks as well! In particular, I'm interested in hearing from you if: 
You're a dedicated developer and your top priority is to get into the games industry.
You expect to set aside at least 20h a week over the next 6-8 months to work on this.
You have 4 or more years C++ experience as a primary language, capable of working with other's code.
You can read, write and speak English fluently.
 This list isn't a fixed requirement, but we're looking for roughly this type of commitment. Anything less won't be really worth it for either side. Also, you don't have to have professional experience in the games industry already (that's the whole point of this mentoring), but I'm looking for people who'd describe themselves as comfortable with the C++ language and tools we use. Your responsibilities will be the following: 
Help build, refine and improve the AI Sandbox's codebase.
Develop these systems to reflect industry practices.
Work with other volunteers to design systems and review the code.
Make sure the documentation and tests are in place.
Implement the features into demos and samples.
 In exchange, you'll get the following: 
Advice and feedback about your programming work.
Small group and 1:1 mentoring about technology and implementation.
Career advice and support to help you get into the industry.
Extended access to the Premium Member content.
Credit in the sandbox distribution and articles about your work.
...
 I can't really quantify exactly what you'll get in return; I've gone beyond what's on this list for some previous contributors on the Sandbox. But I can guarantee you'll get as much out of this as you put into it. If you have questions don't hesitate to email me at &lt;alexjc at AiGameDev.com&gt;. 

 Vision The big plan is to push towards a version 1.0 (keeping the current semi-open development model), then prepare an SDK for release (which will include some of the code as libraries only) and possibly a public demo. The goal of this version 1.0 is the following: 
To simplify the process of creating mini-games with animated characters.
To make it easy to experiment with AI designs and prototype techniques.
To demonstrate simple and commonly used solutions from industry.
 The exact features will depend on progress, the number of padawans, and how many animation assets we can get our hands on. Overall, we'll be aiming towards a simple paintball-like combat environment where individuals can complete simple objectives like capture the flag or hold an area. Initially, we'll focus on individual behaviors over the next semester, such as animation and the blend tree, the locomotion system, dynamic pathfinding and navigation, the sensory system, and general decision-making and control. Many of these systems are in place already, but there are lots of details to dig into and improve! Interested? Post a reply below if you're interested and feel free to email me via the following address: &lt;alexjc at AiGameDev.com&gt;. Either way, these are exciting times; stay tuned!</div></summary>
  </entry>

  <entry>
    <title>Inside Xaitment: Workflow Video, New SDK</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/h0X7cIAtYBY/"/>
    <id>http://yoursite/article/?i=ea21ef5a047250cae7337d3fa2dfd241</id>
    <updated>2009-07-30T07:30:43-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/h0X7cIA</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  The current economic climate doesn't seem to be distracting the middleware industry too much, in fact now seems like the time to be making new partnerships! Xaitment, an AI middleware company based in Germany, recently announced they've integrated their solution within Trinigy's Vision Engine, and developed an interface between xaitControl 2.5 and Gamebryo&#174; LightSpeed&#8482;. (Update: To clarify the press release since it caused a little confusion, these products are still licensed separately.) Earlier this year at the GDC, we met with the Xaitment team. We not only recorded our discussion as part of our AI Booth Crawl, which you can find right here, but we also got permission to repost the in-depth video they showed on the expo floor. You can find that below in this post.  xaitment, an AI company that provides middleware for realistic and rational behaviors, is a sponsor of AiGameDev.com. Thanks to the development team for providing the exclusive screenshots below. xaitMap 2.5 

Screenshot 1: 3D view of the navigation mesh from the free camera.
 

Screenshot 2: Top down view of the navigation polygons.
 Since the GDC, xaitment has been developing their navigation solution called xaitmap, and just released version 2.5. Here's the blurb from the website itself: 'xaitMap 2.5 consists of the graphical interface, xaitMap Creator, and the xaitMap Library. Together, these solutions use a unique spatial subdivision technique for creating navigation meshes. The navigation meshes are created automatically by simply entering specifications about the environment and the non-player characters (NPCs) into a NavMesh Generator. The NavMesh is generated in a matter of seconds, enabling developers to easily make changes to the game map and to experiment with many different designs in order to improve the gameplay.' For details, you cand find the full press release announcing the new version right here. The other screenshots sent from Xaitment's development headquarters in Germary are available here: 1, 2. Workflow Demonstration Click here to view this embedded content. Evaluation SDK The SDK is available for download as part of xaitment's BrainPack. You can either enter your details on this page, or head over to the wiki and download the files directly. The BrainPack gives you access to xaitMap, xaitMove2 and xaitControl which covers everything from terrain representation to navigation and behavior logic using state machines. Some code is available as well as the executable demos and compiled library files. 

Screenshot 3: Full screenshot of the XaitMap 2.5 tool.
</div></summary>
  </entry>

  <entry>
    <title>Visualizing the Player's Last Known Posi</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/oi6XEjfMkxM/"/>
    <id>http://yoursite/article/?i=a6dccb09265f973d62ef50af22bfd361</id>
    <updated>2009-07-30T07:30:43-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/oi6XEjf</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

These days, the AI in most games includes the concept of a last known player position - even recent action games which aren't defined by their complex NPC behaviors. This concept initially originated from stealth games like Thief, but since most modern shooters include stealth elements, modeling the last known position has become a requirement for AI in games. Recently, Ubisoft released a promotional behind the scenes preview of Splinter Cell: Conviction, the latest iteration in their stealth franchise. The developers have been trying to reinvent the series by revisiting the basic concepts, among which is the Last Known Position. In particular, the game will render this position as a ghost outline of the player's avatar which remains visible at the same location in 3D space while the AI hasn't reacquired the target. Since it seems to be a controversial subject (like many topics in game design), and for the sake of turning this into a discussion: what do you think about this reinvention of this AI concept as a more obvious gameplay mechanism? Feel free to post a comment here after you've watch the relevant extract in the HD video just below...[...]</div></summary>
  </entry>

  <entry>
    <title>Paris Game AI Conference '09: Highlights</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/a5ljx2MaS30/"/>
    <id>http://yoursite/article/?i=e597511903708c5e3b73ce340698907e</id>
    <updated>2009-07-02T02:30:54-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/a5ljx2M</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  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 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! The whole event was made possible thanks to Stephane Natkin, director of the CEDRIC research lab, and Axel Buendia, CEO of the middleware company Spir.Ops. The rest of the organisational committee was pretty much only myself (Alex Champandard) and Petra (Mrs AiGameDev.com) - which explains the last few quiet weeks as we recover from the hectic months of organisation... 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 AiGameDev.com Premium area. (Sign-up here if you'd like to see this again next year!)  The coffee breaks on Wednesday were sponsored by Havok. We'd like to thank Havok for their continuing support of AiGameDev.com. Their company has offices in Dublin and San Francisco, and recently released their Havok AI solution to complement the existing packages like Havok Behavior. For details, don't hesitate to contact them! 

Photo 1: View from the audience in the amphi-theater during the HTN and Planning panel.
 Table of Content On this page, you'll find the coverage of the following sessions: 
State of the Industry
Emotions in Game Characters
Coordinating Agents with Behavior Trees
Squad Behaviors Discussion
The AI for Killzone 2's Multiplayer Bots
Multithreading AI
The Art of Multithreading
 That was day one, and day two follows: 
Advice and Tales from the Trenches
Coordinating Unit Maneuvers Using HTN and A*
HTN and Planning in Games Discussion
Interactive Narrative Generation and Story Telling
Discussion about Emergent Stories in Games
The Racing AI in Pure
 Game Characters from Animation to AI
Building Navigation Meshes by Voxelization
 Other Coverage There were many active bloggers and game development enthusiasts in the crowd who took notes during the event. You can find them here: 
Stefan Maton's Feature on GameDev.net,
Andrew Armstrong's Coverage on his own site,
Gon&#231;alo Lopes' Notes in our forums.
 Also, special thanks to everyone who helped during the day, and Phil Carlisle for his invaluable support and contribution to the event. State of the Industry 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 - and many attendees appreciated that compared to other conferences. 

Photo 2: Alex Champandard.
 The basic takeaway from this session was a theme that was left open at the end of the AI Summit. At the end, a veteran programmer called Brian (who worked on Starcraft's pathfinding system at Blizzard) asked a question along these lines: 'If you had to sum up the last ten years in game AI in one sentence, what would you say?' Obviously, it's a hard question and the answers that were given at the time weren't particularly conclusive. Brian mentioned this at our AiGameDev.com Launch Party that evening, and I gave him the following answer - which he seemed much happier with: 'We've mastered the technology to the point where the major problems we have now are primarily in production and design.' 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. Emotions in Game Characters People: Phil Carlisle Description 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&#8217;ll also discussed this from a practical perspective using his work as the basis, outlining the techniques that are ready to be applied. 

Photo 3: Phil Carlisle during Q&amp;A.
 Takeaway 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! 
There are various emotional models, but they all boil down to a set of floats!
The usual sense / think / act routine needs to be rethought for including emotions.
There's a big architectural diagram that most researchers use to implement their emotional systems.
Phil's behavior tree approach uses a blackboard, very similarly to the Killzone 2 AI presented later.
 Slides 
Emotions in Game Characters
Phil Carlisle
Download PDF or PPT References Coordinating Agents with Behavior Trees People: Ricardo Pillosu Description 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. 

Photo 4: Ricardo Pillosu interacting with the audience.
 Slides 
Coordinating Agents with Behavior Trees
Ricardo Pillosu
Download PDF or PPT Takeaway 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. As for key points I took away from this:

Ricardo's approach deals mainly with coordination via timing, enabling and disabling branches on demand.
Building more complex squad maneuvers with this approach would require distributing additional information to behaviors using a similar centralized manager.
 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 - even though that's not what I'd always expose to designers. References 
Behavior Trees for Next-Gen AI
Alex J. Champandard
GDC Lyon 2007
Watch Online (free registration required)
 Squad Behaviors Discussion People: Florent Dotto, Mieszko Zielinski, Mikko Mononen, Ricard Pillosu Description This Q&amp;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? 

Photo 5: Florent Dotto, Mieszko Zielinski, Mikko Mononen
 

Photo 6: (Mikko Mononen), Ricard Pillosu
 Takeaway 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: 
Intuitive Control - 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!
Cheating - 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.
Top-Down - 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.
Obvious Behaviors - 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!
 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. The AI for Killzone 2's Multiplayer Bots People: Alex J. Champandard, (Tim Verveij), Remco Straatman Description This talk will discuss the implementation of bots in Killzone 2&#8217;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. 

Photo 7: Remco Straatman, Alex Champandard
 Slides 
Killzone 2 Multiplayer Bots
Remco Straatman, Tim Verveij, Alex Champandard
Download PDF or PPT Takeaway 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: 
HTN Planning - This conference will mark the advent of Hierarchical Task Networks. It's becoming increasingly hard to make a case for non-hierarchical STRIPS-like goal-oriented planners.
FPS &amp; RTS AI - The question 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!
Incremental Evolution - 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.
 References 
HTN Planning: Complexity and Expressivity
K. Erol, J. Hendler, and Dana S. Nau.
Download PS
 
SHOP: Simple Hierarchical Ordered Planner
D. Nau, Y. Cao, A. Lotem, and H. Mu&#241;oz-Avila.
View Online
 Multithreading AI People: Bjoern Knafla Description 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. 

Photo 8: Bjoern Knafla
 Takeaway I'll combine these notes with the following panel too. Here were my notes: 
Design for Memory - When paralellizing code, if you don't think about your memory accesses your game may end up being even slower!
Rethinking OO - Object oriented design doesn't map directly to nice multi-threaded code. You'll almost be better off thinking at the plain C level!
Clean Code - There are many patterns that will help you parallelize code, but having a nice codebase that doesn't involve a large Entity.h file is a good thing!
Incremental - Don't try to do everything upfront, take your current code and move it to separate threads one piece at a time.
 Slides 
Parallelization of Game AI
Bjoern Knafla
Download PDF The Art of Multithreading People: Julien Hamaide, Markus Mohr, Bjoern Knafla Description 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! 

Photo 9: (Alex Champandard), Markus Mohr, Bjoern Knafla, Julien Hamaide
 

Photo 10: Bjoern Knafla, Julien Hamaide
 Advice and Tales from the Trenches People: Eduardo Jimenez, Phil Carlisle, Mieszko Zielinski Description 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. 

Photo 11: Phil Carlisle, Eduardo Jimenez, Mieszko Zielinski
 Takeaway 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: 
Generalize - 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.
Go Indie! - 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.
Be Lucky? - 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!
 Multi-Unit Planning with HTN and A* People: William van der Sterren Description 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&#8217;ll show how a planner can be used offline to create stimulating new scenarios for current games without the need for manual scripting. 

Photo 12: William van der Sterren
 Takeaway This session was enlightening, for multiple reasons: 
Mission Design - 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.
Web Services - 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!
A* Heuristic Magic - 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.
 Slides 
Multi-Unit Planning with HTN and A*
William van der Sterren
Download PDF HTN and Planning in Games Discussion People: Remco Straatman, William van der Sterren Description The Q&amp;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. 

Photo 13: (Alex Champandard), Remco Straatman, William van der Sterren
 Takeaway 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. 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. Interactive Narrative Generation and Story Telling People: Daniel Kudenko Description 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. 

Photo 14: Daniel Kudenko
 Slides 
Approaches to Interactive Drama
Daniel Kudenko
Download PDF Discussion about Emergent Stories in Games People: Axel Buendia, Vincent Corruble, Daniel Kudenko Description 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. 

Photo 15: Daniel Kudenko, Vincent Corruble
 Takeaway 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. The Racing AI in Pure People: Eduardo Jimenez Description Eduardo will explain how the AI for riders is designed to prevent the feeling of rubber band AI that&#8217;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 &#8220;experience management&#8221; for games. 

Photo 16: Eduardo Jimenez
 Slides 
Race Script: An Alternative to Rubber Band AI
Eduardo Jimenez
Download PDF or PPT Takeaway 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 the area to be involved in at the moment! Some notes: 
Groups - 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.
Skills - 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.
Player-Driven Design - The idea of combining a player-centric approach with mostly autonomous AI is something that every game developer needs to address.
 Game Characters from Animation to AI Description 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? 

Photo 16: (Christiaan Moleman), Xavier Dolci, Phil Carlisle, Julien Hamaide
 

Photo 17: Christiaan Moleman
 Slides 
AI Characters from Animation to Behaviour
Christiaan Moleman
Download PDF or PPT Takeaway 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: 
Gaze &amp; Head Tracking - 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...
Animation Timing - 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.
Design above Technology - 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.
Multi-Disciplinary Teams - 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.
 Building Navigation Meshes by Voxelization People: Mikko Mononen Description Mikko will talk about an open source R&amp;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&#8217;ll present his approach step by step and discuss the benefits of this approach compared to other techniques. 


Photo 18: Mikko Mononen
 Takeaway I've seen Mikko's work and masterclasses in the past already, so my takeaways were mostly not technical, instead: 
Bouncy Lines - In the latest version of Mikko's library, he uses arcs as connections between nodes to better visualize the links between areas.
Visualization - It struck me during the presentation how important debug visualizations are, and how useful they can be for explaining concepts.
 Conclusion 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 Havok and of course Spir.Ops - with only one notable absence from Germany. 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. To be honest, this event was a lot of work to prepare and organize - more so than Petra &amp; 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! If you found any of this interesting, you can get the full edited recordings over the next few months as part of AiGameDev.com Premium. Of course, you get all the other benefits of our members-only content too! Sign-up here. 

Photo 19: View of the audience in the CNAM amphi-theater.
 Comments and Feedback '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.'- Remco Straatman, Lead AI Programmer, Guerrilla Games. 'What a great event. Focused, consistently high quality material, inspiring presentations. Well done to everyone involved!'-  Thomas Young, Founder, PathEngine. 'This conference was a real deal - 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!'- Mieszko Zielinski, AI Programmer, People Can Fly. '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!'- Joakim Wahlstr&#246;m, Gamplay-Programmer, Fatshark, Sweden. 'Awesome conferences, where professionals are sharing their knowledge, and their passion. It's quickly going to be the reference in the AI community.'- Xavier Dolci, Lead AI Programmer, Ubisoft Montpellier. '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...'- David Steinberg, Senior AI/Gameplay Engineer, Darkworks. 'Great talks, real experts and real solutions for real issues in game AI. Very very interesting.'- Guillaume Chatelet, Lead Programmer, Mikros Image. '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.'- Gon&#231;alo Lopes, Software Engineer, YDreams. '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.'- Daniel Kollmann, AI Programmer, YAGER Development. '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!'- David Partouche, AI Programmer, Eden Games 'A very interesting and inspiring event. I've learn a lot and met great people i'm eager to work with in the future!'- Clod&#233;ric Mars, R&amp;D Software Engineer, Golaem '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!'-  Denis Schluchter, AI Programmer, YAGER Development </div></summary>
  </entry>

  <entry>
    <title>Inside PathEngine's Collapsible Formatio</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/K0bd6S-loOs/"/>
    <id>http://yoursite/article/?i=47e1a1dee2a61f5931669cb5b29db595</id>
    <updated>2009-05-30T06:00:57-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/K0bd6S-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  The game AI &amp; navigation middleware industry is moving very fast these days! PathEngine recently released its new SDK, and here at AiGameDev.com we've been sinking our teeth into it. In this article, you'll find a behind the scenes description of what's inside the release and how the features are implemented. Keep in mind, you can find the demo binary and part of the source code within the "testbed" release available from the download page. The key features of this release, 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. 
NOTE: 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 AiGameDev.com. Collapsible Formations 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 always 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. A recording of the demo is available as a video just below. (Click here to view it.) You can also find the majority of the source code for this sample (excluding the library code) in the testbed release available on the PathEngine site. Audio &amp; Video Screencast  NOTE: The video above is in 720p High Definition. Click on maximize to watch it full screen. Technical Details 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: 
A path is planned according to the size of the maximum size of an individual unit in the formation, rather than the formation size.
The corridor around the path is used to calculate the ideal formation width, and positions available.
Sub-formations are created based on the distance between entities, so occasionally groups split up to move around obstacles.
Only one long distance pathfinding request is used per sub-formation, which reduces the cost of searching for paths.
While following the path, there's a piece of code responsible for organising movement orders within sub-formations using local queries only.
 Thomas Young points out another few interesting details about this demo: '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. 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! ' Voxel &amp; BSP Processing Voxel-based approaches to processing polygon soup have been gaining traction 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. In the followings images, you'll see the following from left to right: 
Blue - The original input geometry with polygon outlines.
Grey - Walkable surface extracted with voxel processing.
Green - Same walkable area extracted using BSP processing.
 Here are the screenshots. (Click to enlarge.) 

Screenshot 1: A fence example, showing the aliasing introduced by voxel solutions compared to perfect geometric processing.  

Screenshot 2: Example scene with few differences. The voxel floor on the bridge is not as accurate.
 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: '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 - 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! 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. (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.) 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.' If you have a commercial project, you can request an evaluation for the content processing system on their site by filling in a simple form. Runtime Off-Mesh Connections 

 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. PathEngine already supports these kinds of free form connections, but they were extended for this release: '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.' In practice, this was achieved with three new API functions in the iCollisionContext. For more information see these following articles: 
Feature Overview: Off-Mesh Connections
Working with Off-Mesh Connections in the SDK
 Summary 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 PathEngine download page. This also gives you access to most of the collapsible formations source, as well as a binary for you to experiment with. Congratulations to the PathEngine team on this latest release! 

</div></summary>
  </entry>

  <entry>
    <title>Behavior Capture and Learning Football b</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/-Mi4uR7hiRY/"/>
    <id>http://yoursite/article/?i=62d996b5c0fbc7d5f9cfe7b7797acf22</id>
    <updated>2009-05-21T11:30:32-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/-Mi4uR7</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  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 said that the "Holy Grail is crowd-sourcing the algorithms, AI, and procedures in the game" and Jeff Orkin retired from the comfort of his AI job at Monolith to research data-mining gameplay sessions. 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. Going beyond academic prototypes, there aren't many developers applying these ideas into commercial games - with the notable exception of TruSoft, makers of behavior capture middleware (and sponsors of AiGameDev.com). What follows in the article below are video highlights from their Artificial Contender solution (see this page for more), and two blog posts that I previously wrote about the system, along with my most recent thoughts. NOTE: This weekend we'll be running an public session 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.

The online presentation 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! Artificial Contender and Behavior Capture 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). 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 Artificial Contender, developed by TruSoft. This middleware allows game developers to add behaviour capture into their games, and has been applied successfully in the making of Sony's This Is Football 2005. 

Screenshot 1: This Is Football 2005.
 There are a few demos on the site, including videos of gameplay, tools, and a promotional white paper - 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. At the base, there's a training mode that allows the designer to record a series of situation - 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 motion-graph, built by combining similar animation poses into a single node. 

Screenshot 2: Situation Graph structure used by Artificial Contender. View Original (TruSoft.com)
 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 R-Trees 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). 
Screenshot 3 The AC Viewer, View Original (TruSoft.com)
 In practice, it seems the following steps are involved to integrate Artificial Contender into a game:

Model all possible sensors (inputs) and actuators (output) of the AI by using an API provided by the SDK.
Manually create a hierarchical model of the possible game situations, which allows the algorithm to create zoom levels for the data using generalisation trees.
Integrate the AC library into the game engine, and make its functionality accessible to the designers from within the game.
Get the designers to play the game in a particular style, and then train the AC on the sampled data.
Last but not least, work out a sensible QA plan for testing the resulting behaviours, and apply it until the results are satisfactory!
 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. NOTE: I was originally skeptical of the reinforcement learning when I wrote this, here's a sentence I removed: "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." 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. From a production point of view, from the features mentioned on the Artificial Contender 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 - notably integrating, prototyping with- and testing Artificial Contender. 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 harder problems. Interview with Iskander Umanov 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.
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. Alex J. Champandard: 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? Iskander Umarov: The number of training samples depends on:

The game genre and the game
Complexity of a desired playing style for an NPC

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:

Fighting games: 15-30 minutes.
Sports games: 30-40 minutes. Real-time strategy games: 40-90 minutes.

Notes:

Some simple playing styles can become playable within 3-10 minutes of training.
The actual number of minutes depends on the complexity of the game, type of a playing style being trained, and on the speed.
Depending on a game and depending on a situation within a game, one minute of training can generate about 10 &#8211; 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.

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&#8217;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&#8217;s acting, as soon as a designer sees a decrease in AC&#8217;s agent&#8217;s acting quality, a designer can switch to AC agent&#8217;s training. This functionality provides an easy way to train &#8220;substitutes&#8221; even for end-users: at any moment an end-user can switch between AC agent&#8217;s training and acting. For end-users, this functionality can be transparent &#8211; during &#8220;normal play.&#8221; The AC agent is learning, and there is a button providing control to a substitute: trained AC agent. 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. AJC: 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? IU: RL isn&#8217;t necessary by any means. All of our behavior-capture AI agents (i.e. agents with a purpose to copy a teacher&#8217;s behavior) were created without the use of RL. To clarify, the answer to the question &#8220;Is this necessary because a hierarchical pattern matching approach is not necessarily always purposeful?&#8221; is no. We used RL for the following purposes:

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.
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.)
 AJC: 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? IU: 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&#8217;s game situation classification and generalization subsystems provide help with reducing the number of potential game situations and with the speed of search respectively. 

Screenshot 4: Artificial Contender was applied to multiple sports and simulation games.
 AJC: How well do you think your solution will &#8220;scale up&#8221; to games that are not so confined like sports games? IU: We are positive that Artificial Contender can be efficiently used in most game genres. Currently, we have experimented with the following:

Fighting
Sports
Real-time strategy
Adventure

I&#8217;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:

Constantly changing positions of many players on the field Danger of losing the ball during a pass
Danger of being tackled Moving players on the field creates dynamic labyrinths and obstacles.
 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 &#8220;taking cover&#8221; in FPS can be compared to an issue of the possibility of a pass being intercepted. AJC: What is going to be the major focus for TruSoft on the product in the near future? IU: 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:

Enhanced multi-agent cooperative behavior support.
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.
 AJC: That sounds like a very interesting problem. I look forward to future developments from TruSoft... Thanks for your time Iskander! Live Online Session, Sunday 24th 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? :-) Click here for more details about the event. It's a public session, open for all to attend... See you then!</div></summary>
  </entry>

  <entry>
    <title>Building and Traversing Navigation Meshe</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/w97Jd7OOYjc/"/>
    <id>http://yoursite/article/?i=9760a2813795d885bec713c58766b03b</id>
    <updated>2009-05-13T04:30:33-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/w97Jd7O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

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. 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.) In the following 11:30 minute HD video, you'll get a guided tour of the navigation generation (known as Recast) as well as a demo of the runtime pathfinding and navigation queries (called Detour). 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.[...]</div></summary>
  </entry>

  <entry>
    <title>Hard-Earned Insights from The AI Sandbox</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/nebuLewnIQs/"/>
    <id>http://yoursite/article/?i=bf1f3fb79766c4628a155e35dc8b3a8a</id>
    <updated>2009-05-08T18:00:46-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/nebuLew</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. 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. animation system, test framework). 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: 
Test Framework - How do you manage and run your unit and functional tests, and your feature samples?
Footplant Detection - What approach do you use for automatically extracting footfalls?
Animation Mirroring - Which options are available for mirroring, and what are the tradeoffs?
Motion Capture - Where can you find good motion capture online and what's the quality of it? 
Hierarchical Search - What's the catch for hierarchical search in terms of performance and quality?
Area Generation - How do you create areas given a lown-level grid or point graph?
 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. 
 

 Note: Everything you see here is available as part of AiGameDev.com Premium. You can sign-up right here, and there are bonuses for signing up this week - whether you're an individual or a studio.</div></summary>
  </entry>

  <entry>
    <title>We Interrupt This Broadcast... AiGameDev</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/yVmEObZkEEQ/"/>
    <id>http://yoursite/article/?i=54a8cb7a850144bef2e571b2cb9bc384</id>
    <updated>2009-05-05T23:00:43-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/yVmEObZ</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  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 go into launch week... 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 - possibly even wondering who put those red crowns everywhere, and what's hidden behind those pages. Here's the answer, watch the video below and find out everything now. It's the smartest move! AiGameDev.com Premium Membership is... 
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).
A multimedia experience combining video &amp; audio, illustrated reports, interactive sessions with whiteboards plus high-quality recordings, as well as source code samples.
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.
 Sneak Peak Behind the Scenes! 
 
 Make sure you watch this in High Quality over on YouTube! Going Live on May 6th, 2009 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 launch page. When the countdown hits zero, refresh the page and you'll see two buttons for signing up: one for Individuals (non-commercial) and the other for Studios (companies only). 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: 
Previous Sessions - Over the last 8 months of running AiGameDev.com 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.
Next Three Months - On Sunday May 10th, there's a public masterclass about Behavior Trees for Action &amp; Combat AI (subscribe to the thread to be notified in advance). In June, we'll be running the Paris Game AI Conference '09 and releasing the videos online in the Premium Area incrementally.
The AI Sandbox - This is the codebase we use to write samples and demos illustrating key points. For example, see our demo of HPA* pathfinding on a Counter Strike map, and our animation planning on a Motion Graph prototype.
 Note: Watch the video above for full details about the prices. Bonuses &amp; Fast Movers For the whole week of the relaunch, if you sign-up to AiGameDev.com Premium you'll receive the following bonuses: 
Recast Navigation Library by Mikko Mononen - 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.
Future City Model from Procedural.com - 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!
 For the Individual (Non-Commercial) packages, you can earn the following FAST MOVER BONUSES if you join quickly: 
First 50 People - If you sign-up for the Premium Membership within the first fifty people when we go live, you'll get 20 minutes consulting time with Alex J. Champandard, contractor on Killzone 2's Bots and previously Senior AI Programmer at Rockstar Games.
First 24 Hours - Anyone that registers within the first day of going live will receive a PDF report with 150+ tips collected from Indie and AAA games, both in the design and programming departments.
 If you apply for the Studio (Commercial) packages, these fast mover bonuses are available for the whole 7 days after the launch. Frequently Asked Questions Question: What's the difference between "Members" and "Insiders"?
Answer: 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 Insider. 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! Question: Do you support alternative forms of payment than Visa and Mastercard? Answer: 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 &lt;members at AiGameDev.com&gt;, for instance for payment via Bank Transfers. Question: I'd like to subscribe for a whole year; is there a yearly payment option? Answer: 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.) Question: Will the monthly price go up if I don't sign up now? Answer: The bonuses will no longer be available after this week is over. 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. 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. 
So, what are you waiting for, go and check it out now!</div></summary>
  </entry>

  <entry>
    <title>Clearance-based Pathfinding and Hierarch</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/QgZkgyXr4hM/"/>
    <id>http://yoursite/article/?i=bc625d05a3e1dc8e844dac98b05f4324</id>
    <updated>2009-05-04T19:31:00-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/QgZkgyX</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009. 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 him by email at &lt;daniel.harabor at nicta.com.au&gt;  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 Red Alert, 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? This was the topic of a recent paper [1] I co-wrote with Adi Botea and which I presented at CIG&#8217;08. In the talk 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.


Figure 1: 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.

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.
Clearance Values and the Brushfire Algorithm
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 [2] 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:
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).


Figure 2: A small toy map annotated with values computed by the Brushfire algorithm. Black tiles are not traversable.



Figure 3: A 1&#215;1 agent finds a path to the goal. All traversable tiles are included in the search space.




Figure 4: A 2&#215;2 agent finds a path to the goal. Only tiles with clearance &gt; 1 are considered.



Figure 5: 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.


Brushfire makes use of a minimum obstacle distance 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 [3] 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.). 
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: true clearance.
The True Clearance Metric
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.


Figure 6: After selecting a tile (a) the square is expanded twice (b, c) before intersecting an obstacle (d).



Figure 7: The toymap from Figure 2, annotated with true clearance values.


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 [1] for details).
Dealing With Multiple Terrain Types
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 n 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 {Ground, Water} the corresponding list of all possible capabilities is given by a set of sets; in this case {{Ground}, {Water}, {Ground, Water}}. Note that, for simplicity, I assume the traveling speed across all terrains is constant (but this constraint is easily lifted).
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).


Figure 8: True clearance annotations for the {Ground} capability (only white tiles are traversable).



Figure 9: True clearance annotations for the {Water} capability (only blue tiles are traversable).

 


Figure 10: True clearance annotations for the {Ground, Water} capability (both white and blue tiles are traversable).


Theoretically this means that, at most, each tile will store 2n-1 clearance value annotations (here n corresponds to the number of terrains; see [1] 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.
Annotated A*
In order to actually find a path for an agent with arbitrary size and capability we can use the venerable A* algorithm [4] 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*:
Function: getPath
Parameters: start, goal, size, capability push start onto open list.
for each node on the open list if current node is the goal, return path. else, for each neighbour of the newly opened node if neighbour is on the closed list, skip it else, if neighbour is already on the open list, update weights else, if clearance(neighbour, capability) &gt; size, push neighbour on the open list else, skip neighbour push current node on closed list if openlist is null, return failure

 
If you&#8217;re interested in playing with a working implementation of Annotated A* you can check out the source code I wrote to evaluate it. It&#8217;s written in C++ and based on the University of Alberta&#8217;s freely available pathfinding library, Hierarchical Open Graph (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 AnnotatedMapAbstraction, which deals with computing true clearance values for a map, and AnnotatedAStar which is the reference implementation of the search algorithm described here.
Hierarchical Abstraction
Having described a simple clearance-based pathfinding system we can now turn our attention to speeding it up through the use of hierarchical abstraction. 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 representationally complete 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:


First, we divide our annotated map into a set of adjacent Clusters connected by Entrances. We will show that the resultant graph produced by this process is infact representationally complete but contains redundant and duplicated information.


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.


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*.


Clusters and Entrances
In order to create an an abstract representation of an annotated map we follow Botea et al [5] 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.


Figure 11. The map is divided into four 5&#215;5 clusters.



Figure 12. (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.

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 inter-edge 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.


Figure 13. A complete initial abstraction.

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 intra-edge 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 initial abstraction) 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).
Compacting the abstract graph
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 [1]) and instead focus on the intuition behind each one.
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 high-quality abstraction because we discard only duplicate information fromt the graph.


Figure 14: (a) Part of the initial abstraction for cluster C1. (b) Strong dominance removes edges E5 (dominated by E3) and E6 (dominated by E4).



Figure 15. (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.


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).


Figure 16: The abstract graph after weak dominance is applied. Note that the graph is almost half the size compared to Figure 13.

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 [1]). 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.
Hierarchical Annotated A*
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 [5]:


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.


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.


 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).
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 Baldur&#8217;s Gate. 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).
If you&#8217;d like to play with a working implementation of HAA*, you can download the source code I wrote to evaluate the algorithm. The classes most relevant to the preceeding few sections are probably AnnotatedCluster and AnnotatedClusterAbstraction which together are responsible for generating the abstract graph. Meanwhile, AnnotatedHierarchicalAStar provides a reference implementation of the HAA* algorithm.
Concluding Remarks
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 [1] and associated presentation slides, both of which contain more indepth discussion of the ideas presented here.
Alternatively, if you have specific questions or comments regarding anything described in this article, please feel free to contact me. References 
Hierarchical Path Planning for Multi-size Agents in Heterogeneous Environments
D. Harabor and A. Botea
IEEE Symposium on Computational Intelligence and Games (2008)
[1] Download (PDF) (Presentation)


Principles of Robot Motion, pp. 86-88
MIT Press (2004)
(google books entry)
[2] H. Choset, K. M. Lynch, S. Hutchinson, G. Kantor, W. Burgard, L. E. Kavraki and S. Thrun


Dealing with Destruction: AI From the Trenches of Company of Heroes
Game Developers Conference (2007)
(slides and videos) (audio purchase)
[3] C. Jurney and S. Hubick
 $$$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$$$ $$$http://www.cs.ualberta.ca/~mmueller/ps/hpastar.pdf$$$Near Optimal Hierarchical Path-Finding$$$A. Botea, M. M&#252;ller, J. Schaeffer Journal of Game Development (2004) Volume 1, Issue 1, 7-28$$$</div></summary>
  </entry>

  <entry>
    <title>Motion Planning for Fun and Profit!</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/o4nncz9cN2k/"/>
    <id>http://yoursite/article/?i=7c86bd32b34b60f63d75bd79fc21b894</id>
    <updated>2009-05-04T19:31:00-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/o4nncz9</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was published for AiGameDev.com Insiders, free by registration.

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 - 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.  In my animation lecture at the AI Summit, 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. As a teaser, here's an example we've been working on as part of the AiGameDev.com 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.
[...]</div></summary>
  </entry>

  <entry>
    <title>18 Embarrassing Game AI Bugs Caught On T</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/g6ncXirTjUk/"/>
    <id>http://yoursite/article/?i=590e1db169ba0d87610a6b772d2ab35c</id>
    <updated>2009-04-29T07:31:33-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/g6ncXir</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Copyright &#0169; AiGameDev.com, 2009.  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 problems when/if you see them in your own game. 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 - and many of them read this blog (RSS). I'm hoping the controversial aspect of this article is overshadowed by the useful analysis and the importance of the topic. 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! #1AI Can't See Until Seen 
 

 Game: Half-Life 2, 2004. Symptom 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! Cause Explaining this bug requires a little context. As documented 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. 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! Cure 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: 
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.
Remove the "ignore player" statement with a time out mechanism that kicks in after a few seconds. This can provide realistic AI reaction &amp; decision times while at the same time giving the player some leeway.
 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. 
Building an AI Sensory System: Examining The Design of Thief: The Dark Project
Tom Leonard, GDC 2003.
View Online
 #2Your Last Known Position Is... 
 

 Game: Hitman: Blood Money, 2006. Symptom 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 "Run for your life." Extra: Guards do not react to the player's escape until notified by the hospital staff. Cause 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. Extra: 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. Cure 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: 
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 - regardless of his clothes. For example, reacting to the player running or nearby.
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.
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.
 #3NO SWIMMING 
 

 Game: Grand Theft Auto San Andreas, 2004. Symptom NPC cops follow the player into the water, but they can't swim and immediately drown. Cause 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. Cure This was fixed in subsequent releases, presumably by: 
Adding more information into the navigation graph about the type of environment, in this case annotating volumes as water.
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.
 #4When Priorities Go Wrong! 
 

 Game: Crysis, 2007. Symptom 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. Cause 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. Cure There are two possible fixes, in order of preference: 
Have the FreeFromDanger behavior work for burning barrels, and make sure its activation is checked periodically. (Subsumption)
Add a special-case precondition to the investigate behavior that checks if the source object type is not dangerous. (Inhibition)
 #5What Sound Does a Knife Make? 
 

 Game: S.T.A.L.K.E.R., 2007. Symptom 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. Cause There are two things that cause this bug: 
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.
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).
 Cure 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. 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. #6Standing Still *Is* A Strategy 
 

 Game: FIFA 08, 2007. Symptom 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. Cause 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: 
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.
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.
 Cure 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. #7The Shortest Path is a Straight Line 
 

 Game: Armed Assault, 2007. Symptom 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. Cause This bug may be caused by two things: 
The navigation representation does not model the water. This is possible if the world is assumed to be a 2D terrain with sparse obstacles.
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.
 Cure 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. #8I'm Invisible: Go Around Me 
 

 Game: Company of Heroes, 2006. Symptom 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. Cause 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. Cure There are two ways to fix this, one involved less design and the other more technology: 
Remove the sniper cloaking feature! The tanks would attack the sniper rather than try to pathfind around it.
When the sniper cloaks, remove it as an obstacle for enemy units in the pathfinder.
 #9Moonwalking Is Fun 
 

 Game: Prince of Persia: Rival Swords (PSP), 2006. Symptom NPC guards are seen on two instances walking into posts and closed doors repeatedly, while the animation keeps on walking. Extra: Enemy is passive until attacked the first time. Cause There are two bugs that cause the behaviors to look like this in the end: 
The navigation representation isn't accurate enough, either taking into account the characters width near pillars or not updating dynamically when doors close.
The path following isn't capable of noticing lack of progress, and simply keeps on going despite collision problems.
 Cure 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. #10Who's Your Enemy? 
 

 Game: Oblivion, 2006. Symptom 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. Extra: NPC moonwalking into a wall as in the previous issue. Cause 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. Cure 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: 
Have NPCs ignore other attacks if the player is the current target.
Maintain a queue of multiple active targets, and make sure to engage the player before moving on.
 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. #11Where's the Pitch Control on this Mounted Gun? 
 

 Game: Crysis, 2007. Symptom 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. Cause 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. Cure This is another special case that is amplified by YouTube and the fact that this is a sandbox game. The multiple fixes are relatively simple: 
Use a simple line-of-sight (LOS) or cone-of-fire (COF) check to determine if the player can be targeted.
Add a minimum radius to the mounted gun behavior such that the NPC dismounts if the player comes too close.
Tell the NPC to dismount if he hasn't done any damage to the player for a certain period of time.
 #12Drowning on Land 
 

 Game: Halo, 2001. Symptom A grunt is stuck "swimming" on the floor. The grunt does not respond to player shots, but only to explosions. Cause 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. Cure 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. 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. #13Are You Receiving My Bullets? 
 

 Game: Call of Duty 4, 2007. Symptom 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. Extra: Both AI soldiers are also unresponsive to player movement. Cause Four little factors (that wouldn't be too much of a problem elsewhere) combine to cause this particular issue: 
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.
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.)
There's not enough variation in the shooting behavior to break the deadlock.
No feedback is provided to the NPC when his bullets hit a tree rather than the intended target.
 Cure Fixing any of the following problems would resolve the issue: 
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.
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.
Have the NPC monitor the health of the enemy and inflicted damage to check that the current behavior is actually achieving its intended purpose.
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.
 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. #14What Just Happened There? 
 

 Game: Oblivion, 2006. Symptom The player fires an arrow in an NPC's living room. The NPC then accuses the player of stealing from him. Cause The typical causes for an inappropriate behavior in response to an event / stimulus are either: 
An error in the conditional logic to activate a behavior.
There is no behavior for this event, and a default is used.
 Cure In this case, it's doubtful that the reaction "You're stealing from me!" 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 "Player picked up an object that doesn't belong to him." would help activate the stealing response. Also, you could remedy this situation by having the AI check the reaction "What exactly are you doing?" when specific situations like these are found. #15Do the Oscillation Dance 
 

 Game: Gears of War, 2006. Symptom 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. Cause 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. 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. Cure 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. 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. #16Driver, Where Are You Talking Me? 
 

 Game: Halo 3, 2007. Symptom 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. Cause 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. Cure There are two ways this could be fixed: 
Have the pathfinder take into account force fields dynamically when doing searches for vehicles.
Detect that path-following fails (using progress measurements) and temporarily disable links in the navigation representation, to prevent problems of unexpected dynamic objects.
 #17I Speak with Dead People 
 

 Game: Crysis, 2007. Symptom 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. Cause 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 - very much like bug #5. Cure 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 - especially if you're working on an open game. #18Do Not Open that Box! 
 

 Game: Bioshock, 2007. Symptom 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. Cause 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. 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! Cure There's a scripting fix and a technical fix that can alleviate this problem: 
Add a counter to the script trigger to prevent it from firing more than once.
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.
 Summary &amp; Take Away Generally speaking, there are a few things you should know about game AI bugs: 
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.
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.
AI bugs are rarely ever show stoppers, and the reason they are not fixed is due to scheduling and production reasons.
 As an AI developer, this can be a little frustrating at times - 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! In the meantime, if you're making your own game, this list of bugs also has its lessons to teach: 
Spend time playtesting so that you can find out your player's expectations, and cater to those. This is a numbers game.
Consider spending some time tuning your AI for NPC watchers that try to find loopholes in the behaviors and post bugs on YouTube!
 So, how do you 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!</div></summary>
  </entry>

  <entry>
    <title>The Future of Collaboration in Player Re</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/rCwmvXOcycU/collaboration-player-engagement"/>
    <id>http://yoursite/article/?i=2b13300929fa5be10bf493a901490314</id>
    <updated>2009-04-28T09:01:25-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/rCwmvXO</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This panel discussion.comanized as part of the AI Games Network focuses on AI and Avatars, 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. Participants: Peter Cowling, Joanna Bryson, Alex Champandard, Simon Colton, Daniel Kudenko, Simon Lucas, Mark Morris</div></summary>
  </entry>

  <entry>
    <title>The Race for Better Game Avatars and Pla</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/Z9D7zf7uiMY/race-avatars-immersion"/>
    <id>http://yoursite/article/?i=d8db1ff85b3f47b3eebbe880c5ea016f</id>
    <updated>2009-04-28T09:01:24-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/Z9D7zf7</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A month ago, the AI / Games Research Network 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.</div></summary>
  </entry>

  <entry>
    <title>New Site Launched! Noteworthy Features a</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/rMS-MbHOw_M/"/>
    <id>http://yoursite/article/?i=3976060cbe95cfe550d2f9aa1e9ac147</id>
    <updated>2009-04-28T09:01:23-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/rMS-MbH</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">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 also of course your bug reports and suggestions. Rest assured we're working on them. Over the last two years, AiGameDev.com 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 - and this time we got professional help. New and Noteworthy 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! In particular, we made it much easier to browse around on the site and see what's going on at a glance: 
Front Page - 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.
Media Section - 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.
Integrated Search - You can also access all the content on the site via the search button, so everything is at your finger tips.
Site Accessibility - 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.
Access Levels - 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.
 

 Coming Shortly 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 - but will come online shortly: 
Topics - 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!
Events - 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.
Papers &amp; Code - 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 &amp; libraries available on the site.
News - 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!
RSS Feed - 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!
 Known Issues Also, there are a few things that don't behave quite fully as designed yet. These will be fixed shortly: 
Categories - 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.
Redirects - 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!
Login - 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...
 Lessons Learned... 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 - which took longer than expected. The site was under maintenance for about 36h. 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: 
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!
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!
We setup the official AiGameDev.com #gameai IRC channel on irc.freenode.net, and that has been fascinating so far! We've hit 10 people already, and it's a friendly atmosphere.
 Anyway, the new site marks a new phase for AiGameDev.com. 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 sign up right here.</div></summary>
  </entry>

  <entry>
    <title>Expo Floor AI Booth Crawl: 5 Middleware </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/qrIc4aoiP18/gdc09-booth-crawl"/>
    <id>http://yoursite/article/?i=985d35cbcae4e160051e0ff0cba5e3bc</id>
    <updated>2009-04-28T09:01:23-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/qrIc4ao</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">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!</div></summary>
  </entry>

  <entry>
    <title>GDC ‘09 Roundtable #3 Q&amp;A Coverage</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/f4yX1jJrT1E/gdc09-roundtable3"/>
    <id>http://yoursite/article/?i=39ada955aa6ec2b72bec84411674825e</id>
    <updated>2009-04-28T09:01:23-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/f4yX1jJ</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The third AI roundtable of GDC 2009 took place on Friday 27th, and AiGameDev.com 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!</div></summary>
  </entry>

  <entry>
    <title>GDC ‘09 AI Roundtable #2 Coverage</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/1aNCVsapQ1g/gdc09-roundtable2"/>
    <id>http://yoursite/article/?i=eb96dcd6fbe6641faf2f7948da7790c8</id>
    <updated>2009-04-28T09:01:23-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/1aNCVsa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The second AI roundtable of GDC 2009 took place on Thursday 26th, and AiGameDev.com was there to cover the event - 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.</div></summary>
  </entry>

  <entry>
    <title>Invitation to the Paris Game AI Conferen</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/-D8U_kEFnh8/paris-game-ai-09"/>
    <id>http://yoursite/article/?i=c71f9ce0819fe469e2c3476be990aa8c</id>
    <updated>2009-04-28T09:01:23-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/-D8U_kE</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Building on the success of last year's workshop, AiGameDev.com is co.comanizing the second annual Game AI Conference in Paris with the CNAM and LIP6 University. The event is free and will take place on June 10th and 11th 2009, with a schedule that blends invited sessions from top AI developers from industry as well as tutorials / reviews and R&amp;D oriented sessions. Click to read details on how to register!</div></summary>
  </entry>

  <entry>
    <title>Key Trends in Game AI – Are You Ready </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/N7Q46aXxI2A/key-trends"/>
    <id>http://yoursite/article/?i=4f3e3c8243876fd5a32a8a1b5e3f36f9</id>
    <updated>2009-04-17T10:01:03-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/N7Q46aX</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

The field of game AI is actually moving very fast these days!  This is a very exciting time for developers, particularly those of us who&#8217;ve been working towards this tipping point for a long time.  But it&#8217;s also a little overwhelming; are you prepared for what&#8217;s going to happen next?  Luckily, here&#8217;s some advance warning&#8230;
Last Saturday, Phil Carlisle (industry veteran and resident expert here at AiGameDev.com) &#038; I (Alex Champandard) ran a GDC debriefing session online.  This was a bit of a different feel than usual; it seemed more like a breakfast chat show!  Apart from the fact it was early Saturday on Easter weekend, the format worked very well and we ended up analyzing all the key trends in our field that came out of San Francisco.
Note: If you&#8217;d like to have early access to the video recording of our debriefing, we&#8217;ll be releasing it as part of our relaunch of the new site and the premium area.  You can sign-up here for details.

Industry
Specialization of Game AI
During the panel discussion of game AI in education at the AI Summit, Brett Laming mentioned that developers who&#8217;ve been in the industry for a few years are very lucky since they&#8217;ve been able to learn all the key principles by actually implementing AI incrementally into games.  These days, as a junior programmer, you&#8217;re expected to specialize and learn specific details of a part of AI - without necessarily having the big picture.
&#8220;The field of Game AI is growing quickly!&#8221;
In industry, this is also a problem as two professionals are becoming less likely to strike up an in-depth conversation about their work.  Richard Evans and I ran into this issue at the Speaker&#8217;s party, he&#8217;s into social interaction and logical reasoning while my experience is in animation and individual behavior.
Take Away: Try to keep an eye on all the different sub-fields of game AI at least, and if you have time read up on them and build some prototypes.
Programmers as Academics
Another important trend that Phil pointed out is how many AI Programmer have not only Bachelor-level degrees (that has become very common), but also Masters or even Ph.D. in related fields.  I have an M.Sc. by research, and Phil is working on his doctorate while teaching and building indie games!
This in itself is an important point; it highlights that developers are likely to pick specific techniques based on background research - contrary to popular belief. Most developers I know don&#8217;t hesitate to do a little research on Citeseer and Google Scholar before attempting to solve problems typical of academia.  However, you&#8217;ll typically find that game AI developers become much more pragmatic once they go into industry!
Take Away: As a student, a well chosen Masters research project can set you ahead of the curve, and most likely get you hired on the spot.  As companies, you should look out for these students!
Team Sizes
Another implicit trend is the growing size of teams, which caught Phil a little by surprise.  (I&#8217;ve come to find this normal from my consulting with big studios :-)  Now most companies have multiple AI programmers, and the big studios can have 10+ programmers just on the artificial intelligence side of things.  In contrast, about five years ago the average was around 0.5 &#8212; as Neil Kirby pointed out.
Take Away: Be prepared for working in big teams; work on your non-programming skills!
References:

Ubisoft&#8217;s AI Programming Team is Bigger than Yours!

AI as the New Battleground
Phil pointed out this trend too, that AI seems to be much more at the forefront of innovation.  A lot of discussion revolved around design this year, and veteran designer &#038; developer Dan Kline emphasized that design is changing so fast these days.
Games like Left 4 Dead and Far Cry 2 are putting AI in the limelight by making it a central piece of their design.  This ties in to the next theme&#8230;


Screenshot 1: Far Cry 2&#8217;s experiments with large living worlds.

Design
The Need for Pushing AI Design
There&#8217;s a growing sense this year that not so much has changed technically speaking.  What has changed is that the average developer is catching up with the cutting edge&#8230; Beyond that, many of the leading developers in the field believe that most of the big problems are solvable already - and it&#8217;s only a question of development time to successfully implement them in a game.
Based on that premise, there&#8217;s a consensus that the way forward for improving AI is to push design.  Of course, better AI in itself can improve design, so it&#8217;s a positive feedback loop too.  What was special about this year&#8217;s GDC was the number of talks and discussions about this among AI developers.
Take Away: Be sure to involve your most experienced AI Programmers during the design phase, and let them influence the direction of the game.  L4D has shown how rewarding it is when you do it right.
Emotions for Gameplay
Phil is a strong advocate of emotions in games, and gave a talk about this during the AI Summit.  What surprised me is to what extent developers are talking about this, discussing ways to make it happen, and thinking about prototypes that can use better emotional models.
The discussions at the AI Roundtables (see below for the recordings) featured a few discussions about emotions, in the context of various little games like playing hide and seek, or even a game of tag.  There&#8217;s a genuine interest in building emotions, not necessarily for improving the realism, but to see how this can impact gameplay in new and exciting ways.
Take Away: Start thinking about how simple emotions can affect your decisions (without requiring extra assets) to improve gameplay, then consider plugging in more animations!
References:


GDC &#8216;09 AI Roundtable #2 Coverage


GDC &#8216;09 Roundtable #3 Q&#038;A Coverage


Experience Management
While last year&#8217;s GDC emphasized crowds and the use of AI to improve the visuals of a game, or to improve the quality of the environment (e.g. Assassin&#8217;s Creed), this year it&#8217;s been all about AI at the top level and most importantly: gameplay.  In particular, the AI Director of Left 4 Dead has redefined the way many developers think about player experience and scripted missions.
Take Away: Get one of your AI programmers to develop the gameplay and scripting system for you, and give him full control for a prototype or two!
AI Feedback
All the design in the world means nothing if the player doesn&#8217;t notice.  So a lot of discussion necessarily revolved around how to portray the AI.


Animations: How do we get enough high-quality data that fits in memory to portray all the character emotions we need?


Sound &amp; Barks: Audio is a great way to communicate what&#8217;s going on, but 


Off-Screen: What are good ways to leverage player feedback while the AI is not visible to reduce asset costs.


Lighting &amp; Scene: The AI director in L4D actually sets the mood, and camera placement can also have a huge impact on portrayal of a scene.


Obviously, there&#8217;s a lot to be done in this department - but work has started!


Screenshot 2: Atmospheric lighting in Left 4 Dead as situational feedback.

Architecture
Knowledge Representation
Another big topic, sparked by Damian Isla&#8217;s talk during the AI Summit, was going beyond behavior with knowledge representation.  You need a better representation of the world to be able to express emotions for example; surprise is a confusion between what you thought and what actually is in the world.
In fact, similar ideas came up also in the AI Roundtables, in the context of emotions again.  Since it&#8217;s so easy to go overboard, they key question to ask is what (minimal) representation do you need to be able to model an emotion.
Layering of AI

Phil pointed out how useful he found Christian Gyrling&#8217;s ideas about having a separate character component, which handles all the complexity of dealing with navigation, animation, resources in the world, etc.  I&#8217;m a firm believer in these concepts, and apply them not only for characters but within multiple layers in as many places as possible; it&#8217;s a great way to reduce complexity generally, in our AI Summit lecture this was to build the locomotion component.
What surprised me is to what extent I think the point of having this separate character layer really hit a nerve.  Scaling up of single scripts, HFSMs or even behavior trees just isn&#8217;t sustainable when you consider it as one large monolithic block.  We&#8217;ll be seeing more developers split up there logic in the near future.
References:

The Design of Layered AI Architectures
Dealing with AI Orders (Video)
The Secret to Designing Behavior Logic in Layers

Animation Quality
One point I noticed is that the quality of animation is improving quickly, and the challenges of motion capture-based animation are disappearing quickly thanks to technology from the cutting edge of research.  However, this opens up a few more key issues:


Based on the &#8220;Momentum vs. Animation&#8221; lecture, there&#8217;s lots of progress in finding a compromize between physics-based and traditional animation.  The field is honing in on the what full body simulation desirable, while at the same time using the style from motion capture.

Another key problem, from talking to other animation developers on the subject, is memory.  We can just about fit animations into memory now, but there&#8217;s no chance of scaling this approach up as we require more data.  Procedural techniques need to be integrated here just for compression reasons!


The next year or so will see a fast pace of integration of all the innovative ideas available out there, and we should be seeing the result in a year or two.
Techniques
Navigation Meshes

Phil noticed this from the AiGameDev.com Booth Crawl we did.  Navigation meshes are now officially the standard representation for pathfinding.  Almost all middleware vendors use these, and the only hybrid solution is relatively close to navigation meshes.
Waypoint graphs are now mainly used by developers keen to roll their own solutions in-house without the overhead of building a robust mesh based pathfinding system.  (This makes sense for certain games of course.)
Note: This screenshot is from Mikko Mononen&#8217;s currently top-secret R&#038;D project called Recast.  We&#8217;ll be sending out some exclusive gossip about this as we relaunch the site and the Premium Members&#8217; Area over the next few weeks.
Behavior Trees
The positive vibe about behavior trees is still very strong at GDC.  Though BTs have been around in robotics for a while, then in Facade and Halo, Phil reckons my extensive propaganda over the past couple of years is paying off.  There&#8217;s still a bit of a misunderstanding about the key differences between a BT and a HFSM, but we&#8217;ll address these over the next few months on the site.
What amazed me is that people genuinely expressed surprise when developers admitted to using state machines, asking &#8220;Are there any plans to upgrade?&#8221; after the post-mortem for example.  (FSMs can of course be structured like behavior trees in a goal-driven way to get many of the benefits.)
First-Order Logic
One last technical trend to take away from the last few weeks is the return of first-order logic.  This was mentioned in a few contexts:


Peter Gorniack during the AI Summit talked about using predicate logic to help build logic for squads.  This approach can make it easier to find and select individuals in a context-sensitive way; the predicate logic means you can write short logical statements rather than for loops.


Richard Evans also brought this up briefly during his Sims 3 talk and in our discussions afterward.  Inserting aspects of logical reasoning becomes more and more necessary the more you want your AI to resemble human characters.


A couple middleware companies are also increasingly going in this direction.
What&#8217;s Next?
For me, these are fascinating times; there&#8217;s so much going on, so much to learn, so much to look into &#8212; and everything is changing. I sometimes find it a little frustrating even - and it&#8217;s my full time job to stay on top of things!  Having been involved in the industry directly as an AI programmer, I know how much spare time you get as a professional developer to keep up-to-date with technology trends and cutting edge design principles.
Luckily, there are solutions out there to help&#8230; Things like the AI Summit and our Paris Conference this coming June, AI Wisdom and other books of course, but the one than I&#8217;m the most excited about is the idea of dragging everything online!  Now obviously I&#8217;m a little biased we turned AiGameDev.com into a startup based on that premise, but these are particularly exciting times for us.  We&#8217;re going to be launching the new site shortly, and re-opening the Premium Members area too&#8230;
If you&#8217;d like to follow along with the launch of our new site, find out more about the things we have in mind, or just tag along for the bonuses, then just sign-up here.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #12-15 2009: 9 Stor</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/9oaN8DcjLwg/2009-week-12-15"/>
    <id>http://yoursite/article/?i=d5462e0780248e77ed61da74c9b9e47b</id>
    <updated>2009-04-13T19:00:47-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/9oaN8Dc</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 An Easter weekend update to catch up this week, containing coverage posts of GDC&#8217;s AI Summit and roundtables, middleware news, stories, and yes, one April Fool article I&#8217;m afraid. Also be sure to swing by The Game AI Forums for some stimulating discussion, and also don&#8217;t forget Alex&#8217;s Twitter account for his random thoughts on Game AI&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there&#8217;s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Mick West on Intelligent Mistakes



The most interesting article this week which fanned some flames of discussion was Mick West&#8217;s article on believability of AI opponents, which looks to do intelligent mistakes - ones which are done with full knowledge they are not the best choice.
&#8220;Neversoft co-founder Mick West presents a thought-provoking look at improving the believability of AI opponents in games by upping their use of &#8220;intelligent mistakes&#8221;, in a piece originally written for Game Developer magazine.&#8221;

Intelligent Mistakes: How to Incorporate Stupidity Into Your AI Code

Slashdot had a comment thread on the article is illuminating what some players think of cheating AI/easy AI/hard AI with a more technical slant than usual.  Reddit also has some comments on the article.

Believable Stupidity In Game AI
Reddit Comments

Looking at Darkfall PvE AI


An interesting gamers post on an unfortunately named blog called &#8220;Loobin&#8217; the Tubes&#8221; about his fights with enemies in Darkfall, which seems to have surprisingly complex AI for an MMO.
&#8220;How can I put this? Lets try: The PvE mob AI in Darkfall is the best I&#8217;ve ever seen in any MMO. It&#8217;s on a par with relatively good FPS bots, and is the most fun I&#8217;ve ever had fighting a computer-controlled enemy.&#8221;

Darkfall Thoughts - PvE Combat and AI

Middleware News
Apart from AiGameDev&#8217;s own exclusive article about Havok releasing their own AI middleware, there is other middleware news from Emergent, xaitment, Autodesk and NaturalMotion. What a lot of partnerships going on!
Emergent Game Technologies and and xaitment have entered into a partnership that will see the Gamebryo LightSpeed engine integrated with the xaitEngine AI solution.

Emergent partners with xaitment

Autodesk and NaturalMotion are integrating their respective game development platforms. Recognising the increasing crossover between animation and AI, the two studios are building advanced integration between the Autodesk Kynapse artificial intelligence middleware and morpheme animation middleware engine.

Autodesk and NaturalMotion to integrate middleware

Autodesk has used GDC 09 to announce new versions of two of its primary middleware technologies. HumanIK 4 updates the company&#8217;s animation middleware, while Kynapse 6 offers an improved edition of the Autodesk artificial intelligence solution.

Autodesk confirms two new runtime technologies

AI Programming Job
Xbox 360 AI Programming Job at Kaos Studios:
AI Programmer
**We are considering both Senior and Mid-level talent for this role**
Responsibilities:
Design and Develop AI and Game Play systems for the game engine within schedule
Participates in Design and Code reviews
Create systems that achieve the game design goals
Create technology that can be re-used and extended in the future
Work with other team members to identify, define and solve problems
Work with external technology as needed
Other duties as assigned

THQ, Kaos Studios - JobSeeker message

Conferences
CIG &#8216;08 Proceedings Now Available

Daniel Harabor has brought to our attention the recently released 2008 IEEE Symposium on Computational Intelligence and Games proceedings, and highlights some interesting ones.

CIG&#8217;08 Proceedings Available Online

GDC 2009 - AI Summit and AI Roundtables

In addition to AiGameDev.com&#8217;s coverage of the AI Summit and the video report, we have other people covering the event, including myself. If we are missing your pages of notes or analysis here, please email us at &lt;editors at AiGameDev.com&gt;!
Here we have Dan Kline&#8217;s notes from Monday and Tuesday, AI Roundtable audio recordings, and my own site&#8217;s notes collection including coverage of almost every AI session. (Editor&#8217;s Note: Dave Mark&#8217;s site still apparently brings up a malware warnings, proceed with caution!)

GDC &#8216;09: Roundtable #2 Audio (High Quality &#038; Post-Processed)
GDC &#8216;09: Roundtable #3 Audio
GDC 2009: Monday Notes AI Summit Live Blogging by Dan Kline
GDC 2009: Tuesday Notes AI Summit
Intrinsic Algorithm - GDC 2009 AI Roundtable Audio
Game Developers Conference 2009 Notes - Andrew&#8217;s Site

AI Life in Touch Pet Dogs
On the topic of AI Life, Dogz and Catz were early ways to interact with virtual pets - another one comes along which has a reasonably good writeup on the AI front.
Touch Pet Dogs, created by Andrew Stern, the man behind Virtual Babyz, Dogz and Catz, is a virtual pet simulation that delivers perhaps the most &#8220;realistic&#8221; and involving experiences of any such title we&#8217;ve seen to date.
&#8230;What impressed us most about Touch Pets Dogs is the artificial intelligence driving the virtual pets.  The learning process is convincing and the dogs really do seem to have their own personality.  Anyone relating to the genre will have little trouble forming an emotional bond with the onscreen canine.

Hands On with Andrew Stern&#8217;s Touch Pet Dogs

Interview with Operation Flashpoint 2 Lead AI Designer


The Guardian has an interview with Clive Lindop, who covers the role of AI in Operation Flashpoint 2 - with comparisons to other contemporary modern warfare games (hoho!), citing the more open world nature of Operation Flashpoint.
But now that Call of Duty: Modern Warfare has changed the landscape of simulated war, what can Codemasters&#8217; sequel do to complete? And how close can a game ever really get to replicating battle? I put these and many other questions to lead AI designer, Clive Lindop&#8230;

Operation Flashpoint 2 Interview

Darwinia+ AI Information


Introvision has information up on how the AI for Darwinia works (along with lots of development information on the process of getting Darwinia+ on Xbox Live), with some sample code to boot.
Despite the fact that, in the storyline, Darwinians are all independant free thinking individuals, behind the scenes CPU teams are driven by a single AI entity. As well as allowing for easier coordination between the vast armies of Darwinians, it also saves on processing time; one entity doing all the work is much better than a thousand Darwinians each trying to do the same calculations on their own.
The AI entity decides where to send it&#8217;s Darwinians based on a priority system generated by buildings called AITargets placed strategically around the map. Below, you can see the code that determines the priority for each of these targets in King of the Hill and Domination, as well as the single-player Darwinia Campaign.

Darwinian AI - The Puppetmaster

Penny Arcade on AI Again


Wanted: Weapons of Fate, not the greatest stellar barrel-cover-finding AI it seems&#8230;until they stop making comics, I don&#8217;t think our work is done :)

Penny Arcade! - One Plausible Scenario

CADIE: Cognitive Autoheuristic Distributed-Intelligence Entity
Finally, we have  Google&#8217;s AI April Fools, the only AI one I could find. Well, the first AI certainly has it&#8217;s priorities straight - Pandas!

CADIE: Cognitive Autoheuristic Distributed-Intelligence Entity

Unbalancing Scrabble
Dave Mark has now got a Gamasutra blog; there are a few new posts he&#8217;s put up, which are also on his normal blog.  We&#8217;ll keep an eye on both. The most interesting one looks into AI lessons learnt from the un-balancing of scrabble.

AI Lessons from Un-Balancing Scrabble

</div></summary>
  </entry>

  <entry>
    <title>11+ Reasons for Coming to Paris in June:</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/KIZMD3QS_Ao/2009-paris-registration"/>
    <id>http://yoursite/article/?i=f8a8f48d65a8924b1218d9cc7486c340</id>
    <updated>2009-04-10T13:31:27-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/KIZMD3Q</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

Building on the success of last year&#8217;s workshop, AiGameDev.com is co-organizing the second annual Game AI Conference in Paris with the CNAM. The event will take place on June 10th and 11th 2009, with a schedule that blends invited sessions from top AI developers from industry as well as tutorials / reviews and R&#038;D oriented sessions.
If you&#8217;re interested in co-sponsoring the event, don&#8217;t hesitate to contact us at &lt;events at aigamedev.com&gt; for more information.  The organizing committee includes Stephane Natkin of the CNAM and its CEDRIC lab, also Axel Buendia from the Paris-based middleware company Spir.Ops.
Note: There are frequently asked questions at the bottom of the post.

Date &#038; Location

Duration: 2 days.
Dates: Wednesday 10th and Thursday 11th, June 2009.
Time: 9:00 to 17:00, exact schedule to be announced shortly.
Location: CNAM, Amphi C &#8220;Abb&#233; Gr&#233;goire&#8221; - Paris 3&#232;me (map)
Price: Free by registration, see below for registration.

'Completely free, but ultimately, priceless!'
Confirmed Speakers
Remco Straatman: Killzone 2&#8217;s AI Bots

Remco Straatman, Lead AI Programmer at Guerrilla Games, and I (Alex Champandard) contractor on Killzone 2&#8217;s bots, will present the AI architecture and how it was applied to creating the bots for the game:
&#8220;This talk will discuss the implementation of bots in Killzone 2&#8217;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.&#8221;
Killzone 2 is not only the first AAA action game to use a hierarchical task network (HTN) planner, but the bots&#8217; strategic AI also extends the boundaries traditional FPS AI to include many elements of RTS games.
Eduardo Jimenez: The Racing AI in Pure

Eduardo Jimenez is a Senior Programmer at Black Rock Studio in Brighton U.K., who wrote the AI for Disney Interactive&#8217;s critically acclaimed dirt bike racer Pure.  Eduardo will talk about how the AI for the other riders is designed to prevent the feeling of rubber band AI that&#8217;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 &#8220;experience management&#8221; for games.
Mikko Mononen: Voxelization of Polygon Soups

Mikko Mononen is the Lead AI Programmer at Recoil Games in Finland, and formerly Lead AI on Crysis.  Mikko will talk about an R&#038;D project of his, based on the idea of converting polygon soups into navigation meshes that can be used for pathfinding in space.  He&#8217;ll present his approach step by step and discuss the benefits of this approach compared to other techniques.
Ricard Pillosu: Behavior Trees for Agent Coordination

Ricard Pillosu is a Lead Programmer at Crytek GmbH in Frankfurt who recently worked on the Crysis franchise.  Ricard&#8217;s talk focuses on his experience applying the behavior tree paradigm on top of the CryEngine 2&#8217;s existing AI system, and in particular how the behavior trees were applied to the problem of coordinating multiple AI agents simulate group tactics.
Bjoern Knafla: AI Multi-threading &#038; Parallelization

Bjoern Knafla is a Research Associate at the University of Kassel in Germany, and one of the consultants in the world focusing specifically on AI and Parallelism.  He&#8217;ll provide an overview of the techniques that are the most commonly used in the games industry, and present some of his own results applying multi-threading to a large crowd simulation.
William van der Sterren: Planning Multi-unit Maneuvers

William van der Sterren, consultant and independent developer at CGF-AI and former contractor for Killzone 1, 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&#8217;ll show how a planner can be used offline to create stimulating new scenarios for current games without the need for manual scripting.
Daniel Kudenko: Procedural Narrative and Story Telling

Daniel Kudenko is an Associate Professor at the University of York, and will providing a complete review of the field of Story Telling.  Games like Far Cry 2 and Fallout 3 have been pushing the boundaries of in game narratives, and opened up new opportunities for game developers.  Daniel will highlight and summarize the state of academic research &#038; industry collaboration on the subject to help you figure out where to start looking.
Phil Carlisle: Emotions in Game Characters

Phil Carlisle, games industry veteran, independent developer and researcher will talk about emotions in games.  Phil will present an overview of the field and a review of recent research for developers who are curious about emotional reactions for game characters.  He&#8217;ll also discuss this from a practical perspective, outlining the techniques that are ready to be applied and how.
Agenda for the two Days
The focus for the conference is on design and technology that improve the quality of non-player characters in commercial games, as well as applying AI technology to game development to improve the whole process.  The event will bring together developers from industry, middleware vendors and leading academics in the field.
There are a few more interactive sessions also planned, to be announced shortly with the full schedule:

Animation: Believable AI Feedback on a Budget (Panel)
Game AI Industry: Post Next-Gen Observations (Panel)
Opening Q&#038;A with all Speakers (Roundtable)

Of course, there&#8217;ll be a networking lunch and enough coffee breaks to make sure you get the chance to talk to everyone!


Photo 1: Lunch at the Paris Game AI Workshop &#8216;08 - sponsored by Spir.Ops.

Attendee Registration
If you already have a (free) account on the site, you can put your name down as an attendee by clicking the following lick:
SIGN-UP FOR THE PARIS GAME AI CONFERENCE &#8216;09 HERE
If you&#8217;re not already registered, you can sign-up here first at no cost.
Other things to note:


Book your hotel as soon as possible.  Paris is very busy with both tourism and conferences at this time of year, so things are filling up fast.

If you&#8217;re an AiGameDev.com Premium member, plan to be around on the evening of the first night for a VIP-only event.


If you have any questions or comments, feel free to post them below or email &lt;events at aigamedev.com&gt;.
Frequently Asked Questions
Q: I speak English only, will I understand anything?
A: Oui, of course!  The whole conference will be held in English, and almost all the invited speakers are not from France.  Many attendees are coming from throughout Europe (Spain, Germany, The Netherlands, Austria, U.K. and even Israel) so English is the only common language.  We also have people coming from the U.S., Australia and Canada.  It&#8217;s an International Game AI Conference!
Q: Is the venue easy to find?
A: The CNAM is at the center of Paris, so is easily accessible by public transport (map).  It&#8217;s also well signpost and there will be banners for the event itself.  We&#8217;ll also email you with detailed instructions to find the exact building; once you&#8217;ve signed up you&#8217;ll be on the mailing list, as long as you didn&#8217;t request to unsubscribe.
Q: How does this compare to other game AI conferences?
A: It&#8217;ll be a completely different atmosphere than traditional academic conferences.  This event focuses on industry techniques and technology that&#8217;s applicable to commercial games.  Attendees will include professional developers, middleware builders, and academic researchers - but all keen on blending different techniques and approaches together to solve a problem rather than focusing on the solution itself.  Like last year&#8217;s event we organized, or the recent AI Summit we participated in, it will be a friendly and informal gathering of people interested about game AI in practice.
Q: Will this be useful to me as a researcher / academic / student?
A: Absolutely!  We&#8217;ve realized over the last few years of running AiGameDev.com, since there are so many theoretical outlets for academia, what can benefit research the most is an understanding of what professional developers are already doing in industry.  It&#8217;s happened recently on multiple occasions that cutting-edge white papers are independently reinventing techniques that were used by developers a few years ago.  Practical conferences like this are our solution.
Q: Why is it free?  What&#8217;s the catch?
A: There are a limited number of places (requiring registration) and you might well have to get your own lunch!  That aside, there&#8217;s no catch.  We&#8217;re partnering with the CNAM and they are kindly providing the amphitheatre, and rest of the event is organized by people &#038; speakers who are genuinely passionate about their topic.  We &#8220;sold-out&#8221; last year and found that this model works very well &#8212; even better than the most expensive conferences &#8212; to the benefit of everyone!
Q: Where to Sign-Up?
A: REGISTER FOR THE PARIS GAME AI CONFERENCE &#8216;09 HERE



Photo 2: The CNAM Amphitheatre, venue for the 2009 Paris Game AI Conference.

</div></summary>
  </entry>

  <entry>
    <title>AI Summit Slides, Notes, Highlights and </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/1f18GPop3uE/gdc09-slides-highlights"/>
    <id>http://yoursite/article/?i=9be21bb45f7bf40b0af8b6e2aefc9613</id>
    <updated>2009-04-09T03:36:28-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/1f18GPo</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The first two days of GDC 2009 featured the inaugural AI Summit.</div></summary>
  </entry>

  <entry>
    <title>Game Developers Conference ‘09: AI Sum</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/UsU-toWnq-Q/gdc09-ai-summit-video"/>
    <id>http://yoursite/article/?i=1b5fd68a7dcbdcf4def52751ce3584f3</id>
    <updated>2009-03-31T21:00:45-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/UsU-toW</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

The live coverage of GDC 2009 we had planned didn&#8217;t quite work out as we&#8217;d hoped - but we expected the worst.  All the network connections we tried simply couldn&#8217;t cope with the amount of content we were trying to smuggle out of the AI Summit via streaming!  In fact, not many people could broadcast much more than plain text from San Francisco either&#8230;
Things were extremely busy for the first few days anyway, so instead Phil Carlisle &#038; I recorded our opinions of the Summit on Wednesday with the intention of broadcasting them later.  It turns out, there&#8217;s a lot more in the video than just regular coverage of the event itself; click below to find out our impressions and opinions of the major discussion points.











Notes: This video is 1h09 minutes long.  Steve Rabin&#8217;s name is not pronounced the way we pronounce it, it&#8217;s much simpler.  Someone started out the summit with the wrong pronunciation and we only found out later!  Also, Tara&#8217;s last name is indeed Teich.
Topics covered in the report include:

Topics to cover when teaching game AI in academia.
The Sims 3 AI, data-driven traits, planning and production rules.
How designers and programmers can get along to make the best AI.
Behavior trees and the AI / Animation interface controversy.

If you&#8217;d like to pick our brains live, or hear more about the key points we didn&#8217;t cover during this 1h discussion, be sure to join us at 18:00 CET on Wednesday or Noon East Coast for a full marathon debriefing session live online.
</div></summary>
  </entry>

  <entry>
    <title>Exclusive: Havok Announces New AI Middle</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/Uwc-WaD_E6w/havok-ai-announced"/>
    <id>http://yoursite/article/?i=52ab1350d45cadca2c7301e30f6da2ad</id>
    <updated>2009-03-23T00:01:49-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/Uwc-WaD</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

On Friday 20th, Havok invited AiGameDev.com to its San Francisco headquarters for the first ever external preview of their new AI middleware component.  I met with Principal Engineer Dave Gargan and Software Engineer Chris Elion who showed me the technology and demos they&#8217;ve been implementing over the past 18 months.
This article is an exclusive preview of Havok AI.  The official unveiling will take place on on Wednesday, during the Expo at the Game Developers Conference &#8216;09 that takes place in San Francisco from the 23rd to the 27th.  This announcement marks the opening round of AI announcements at the GDC; stay tuned for more coverage from the event in this increasingly exciting market.
 Havok is a sponsor of AiGameDev.com and chose the site to reveal their new AI product to the online game development community.  The article below is a world exclusive; the full release goes out to the press tomorrow.
Dealing With Destruction
According to Havok&#8217;s David Gargan, one of the growing challenges that game developers face, and are looking to for solutions to, is pathfinding in dynamic worlds.  Indeed, not only are worlds in recent becoming larger but they also include destructible environments and numerous moving objects.  Havok designed its AI middleware component with these requirements in mind to support this fully integrated dynamic pathfinding:
&#8220;As opposed to being a static pathfinding solution with an additional layered dynamic avoidance technology, Havok AI is built from the ground up to work with dynamic environments. Its unique, innovative solution handles thousands of moving obstacles in real-time with high fidelity.&#8221;
Obviously, a key challenge to supporting dynamic worlds is efficiently processing necessary changes.  This is achieved in two ways:

The core navigation mesh building algorithm is very fast, capable of processing whole meshes in relatively short times.  As a reference, it takes a few seconds to process the castle level that Havok uses for its demos, and demonstrated during our visit.
Based on Havok&#8217;s experiences with physics, they noticed that dynamic worlds tend to change locally in time and space.  The algorithm is built to deal with dynamic changes as they happen to save time later.

The AI demos that Havok showed us are integrated with the whole suite of middleware, including Havok Physics and Havok Behavior.  The AI component can be connected up to any physics simulation, however.


Screenshot 1: Navigation mesh updates happened dynamically in Havok&#8217;s demo when obstacles were added and removed in the level.  Local steering also helps the characters avoid collisions better (large version).

Dynamic Navigation Meshes
Based on the observation that many modern games are bound more by memory than computation power, Havok made the decision to store only one navigation mesh per level, which then requires some runtime calculations to find paths for arbitrary actors. This decision is also supported by the fact that Havok optimized its pathfinding to run on separate processors like the PS3&#8217;s SPU.  From the release that Havok sent along:
&#8220;Fully extensible and customizable pathfinding solution. The product includes a hierarchical pathfinder which is multithreaded and platform optimized for all of the key gaming platforms.&#8221;
These multi-threaded optimizations can often be difficult to achieve in practice when the pathfinder supports navigation links and smart objects that require integration with the high-level AI - which Havok provides also.
One of the demos that Havok showed included a building with a navigation link placed near a window, so soldiers could come vaulting out of the building using Havok Behavior to handle the animation.  Of course, when the building is destroyed the AI deals with this so the link is no longer available.
This kind of situation, where the configurations of objects is roughly known during development (e.g. building parts are standing or destroyed) are handled particularly efficiently by the underlying system, using a variety of representation tricks.


Screenshot 2: Building windows include navigation links that allow the AI to jump through, similarly to a smart object that&#8217;s handled by Havok Behavior.  Wall destructions also cause connections in the navmesh to be updated (large version).

Crowds and Moving Objects
Another aspect of Havok AI is that it can deal with dynamic moving objects within the world:

Pro-active and autonomous actors like soldiers or pedestrians.
Passive or physics-based entities like grenades or bombs.

The description that Havok sent us describes this as follows:
&#8220;Advanced predictive local steering module that complements the dynamic pathfinding capabilities.  Characters predict the movement of obstacles and adapt accordingly, moving plausibly through the complex and often congested situations that arise when environments become dynamic.&#8221;
The full official press release will be made by Havok to the rest of the press within the next day.


Photo 3: AiGameDev.com at Havok&#8217;s San Francisco Headquarters.  Alex Champandard, Dave Gargan and Chris Elion.

</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #11 2009: 6 Stories</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/bufRsf-6Y3Y/2009-week-11"/>
    <id>http://yoursite/article/?i=09206be18b8f3904a521f07e2c42c051</id>
    <updated>2009-03-17T09:00:29-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/bufRsf-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 The roundup is a little late again this week with all of us preparing for GDC.  This week&#8217;s relatively quiet before the GDC deluge of information - which we&#8217;ll be covering continuously.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don&#8217;t forget Alex&#8217;s Twitter account for his random thoughts on Game AI&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there&#8217;s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
7 Ways to Make Your AI Smarter



Rob Hale posts an informative look at AI with 7 simple and effective ways to improve AI, generally when it comes to shooters. The video below shows how inaccurate enemies don&#8217;t work too well for fun and immersion, with the quote below explaining it in more detail. Make sure to check out the full article of his.




&#8220;Prompted by this article over at Bit-Tech on How AI in Games works it made me want to blog about some of the ways you can make your enemy AI appear smarter without having to re-write your AI back end or invest in expensive middleware&#8230;
(On accuracy)&#8230;If your enemies carry guns then don&#8217;t turn them into Storm Troopers (unless they ARE Storm Troopers in which case it&#8217;s OK). While the Player should have an advantage ov er the AI in terms of accuracy making the AI too inaccurate will just result in them looking stupid. If the player realises that they can just stand still in the open while they pick off the bad guys with a single headshot each then their sense of immersion will be completely broken.&#8221;

7 Ways to Make Your AI Smarter
Commentary by Dave Mark

Related AI Work: CodeBaby


A very press-release-like article, but something worth a glance, where it looks at CodeBaby, a new virtual agent meant to implment some game AI features to help with customer service.
&#8220;The pair started CodeBaby to develop artificial intelligence technology used in BioWare&#8217;s games to power virtual assistants on corporate Web sites to help with customer service, technical support, sales and training.&#8221;

Firm hopes technology for creating characters can be &#8216;gold standard&#8217;

AI Programmer Job
TimeGate Studios has posted up an AI Programmer job, likely to do with Section 8, their new game project.
&#8220;The AI Programmer will work closely with the Lead Software Engineer and the rest of the development team to design and program AI systems for a next-generation first-person shooter game. This entails multiple levels of AI, and touches on several topics including navigation, behaviors, group coordination, environment awareness, tactics, goal-based planning, and terrain analysis.&#8221;

TimeGate Studios AI Programmer

The State of AI Go Players

Once again it seems AI can be forced to dominate human players of certain game types - ones that can be really just simply number crunched. It is still an interesting read to see how far AI&#8217;s playing Go have come - but like chess AI, it is debatable how useful to AI development it can be to brute force the most likely way to win.
&#8220;For the last two decades, human cognitive superiority had a distinctive sound: the soft click of stones placed on a wooden Go board. But once again, artificial intelligence is asserting its domination over gray matter.&#8221;

Humans No Match for Go Bot Overlords

IGN: The Sims 3 Preview


The Sims 3 is a game to look out for in the realm of AI - these previews may well be held against it if the game is noticeably flawed in the AI department since it is so integral to the gameplay. Hopefully this IGN preview instead shows some good progress that will make the game a much more deep experience when simulating entire lives. Then again, how much is &#8220;Too much AI&#8221; in a game based around managing a virtual life? The AI preview video does make me wonder&#8230;
The Sims 3 is the biggest overhaul of the series to date, blowing up the scope of the game from a single household to an entire town. Smarter AI was required, not only to avoid having to micromanage all those bathroom breaks, but to also make the entire town feel like a living world, with potentially hundreds of sims leading rich and fulfilling lives around yours. Smarter AI also takes a load off of you, as you no longer have to hold your sims&#8217; hands to do everything.

IGN: The Sims 3 Preview

ActionScript Pathfinding Prototype

Here&#8217;s a simple but effective path-planning demo using A* written in ActionScript.  The code is by Chris Lindsey of Green Mayo Studios, with data structures ported from Michael Baczynski&#8217;s AS3 Data Structures For Game Developers.

AS3 Data Structures For Game Developers
Path Planning Prototype

xaitment Secures More Customers
AI company xaitment has teamed up with two additional companies for its middleware offering:
Gas Powered Games and Forterra Systems have signed up to use German studio xaitment&#8217;s BrainPack AI engine bundle.
The BrainPack, which is built on xaitFramework 2.5, provides studios undertaking the early stages of a game&#8217;s development with a suite of AI tools to implement artificial intelligence, especially in the areas of advanced AI, decision-making and behaviors.

xaitment secures two new customers

AI Talk at IGDA Meeting


Finally, Chris Jurney is doing a talk called &#8220;On the War Path: Tactical AI in DAWN OF WAR 2&#8243; at the local NJ IGDA Chapter meeting, taking place on the 18th of March. Hopefully there&#8217;ll be a bit of news around about it, or just some people who read this and are in the area can get to see some interesting material.
This talk will cover the new features and modifications made to the tactical AI of the Essence Engine to satisfy the needs of DAWN OF WAR 2. Included will be AI preproduction, handling units of widely varying movement capabilities, and designer tools used to instill personality. Particular focus will be given to pathfinding and behavior for large scale melee. All concepts will be illustrated with in game videos with lots of explosions.

IGDA Forums - IGDA NJ March Meeting!

</div></summary>
  </entry>

  <entry>
    <title>AI Coverage at the GDC ‘09 and Launch </title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/2dSynL5W5g8/gdc09-schedule"/>
    <id>http://yoursite/article/?i=fa2c17b957e9f29938d57c0e0adad89b</id>
    <updated>2009-03-16T16:30:51-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/2dSynL5</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

The Game Developers Conference 2009 starts next week in San Francisco.  If you&#8217;re not going, you&#8217;re probably already bored from hearing about it.  Luckily, thanks to AiGameDev.com&#8217;s innovative patent-pending &#8220;mostly live&#8221; coverage, you&#8217;ll feel like you were there!  We&#8217;re trying something new, so if this sounds interesting to you, please post a comment below to encourage us to broadcast more often.
If you are going to GDC, then read below to find out about the launch gathering and how to meet up with us&#8230;
GDC &#8216;09 AI Coverage
We&#8217;ll be trying something different this year, leveraging the modern technology of the Web 2.0 world.  AiGameDev.com&#8217;s coverage of GDC will center around Twitter and UStream.TV.  Here&#8217;s how it&#8217;s going to work:



In between sessions, I&#8217;ll post a message to Twitter that we&#8217;ll be going live in a few minutes.


The UStream.TV broadcast will start shortly after, and you can watch &#038; ask questions live!


Recordings may be available online shortly after, but we&#8217;ll be uploading them to AiGameDev.com afterwards.


Of course, this depends a lot on the network quality at GDC and that has been famously unreliable in the past, but if that&#8217;s the case we&#8217;ll use Twitter for quick notes and pre-record the broadcasts to upload to the site later on.  That&#8217;s how our &#8220;mostly live&#8221; coverage will work!
Launch Party on Tuesday 24th at 9:00 P.M.
This year&#8217;s GDC isn&#8217;t looking as promising as last year for parties.  Many were canceled or cut back, and nobody stepped up to sponsor a party for the new AI Summit.  We were planning to host a party for AiGameDev.com members only, but after a lot of deliberation, we decided to book a room to host a general Game AI party that will also serve as our launch event.
It&#8217;s not going to be an extravagant event like publisher parties where you can consume dubious substances off the body of scantily clad women.  Instead, it&#8217;s more of a get together of people who are passionate about the same topic in a groovy atmosphere and a great location.

Date: Tuesday, March 24th
Time: 9:00 P.M.
Location: Minna Gallery, San Francisco
Address: 111 Minna Street (map)
Drinks: $6 average.
Talk: &#8220;Great AI is Too Good&#8221; by Baylor Wetzel

Baylor will be giving us an informal talk about the experiments he&#8217;s been running on his game AI students for the past few years!  He&#8217;s been getting them to play various AI types with different strategies, then letting his students guess what they were and which was the most intelligent.  He&#8217;s collected some really fascinating and entertaining insights in the process, and he&#8217;ll be sharing those with us during the evening.
If you&#8217;re a Premium Member, you should definitely come along; the first drink is on us!  If you&#8217;re a fan / reader, you&#8217;re also most welcome  if you&#8217;d like to chat with a bunch of AI geeks.  Also feel free to bring anyone else along if they don&#8217;t mind paying for their own drinks&#8230; :-)  It&#8217;ll be worth it of course.



GDC Schedule
We&#8217;d like to meet as many of you as possible during GDC itself.  To do that, I&#8217;ll also use Twitter to let people know of my location during the show, especially when there are empty moments or if we&#8217;ve setup some group lunch or interviews (etc.) depending on what we come up with.

Monday / Tuesday - AI Summit
Wednesday - Exact session plan to be posted here soon&#8230;
Thursday - AiGameDev.com Booth Crawl, starting at 2:45 P.M, finishing after 4:15 P.M. (It&#8217;s the best slot we could find.) Full itinerary to be announced.
Friday - Exact session plan to be posted here soon&#8230;

We&#8217;ll update this page as we organize the booth crawl with the various companies that have products that include AI technology.  I&#8217;ll also post everything here as we decide which sessions to go to as there are many clashes&#8230; Subscribe to Twitter (you can do it by RSS or phone) for further announcements.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #10 2009: 7 Stories</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/N69r8hIfjfQ/2009-week-10"/>
    <id>http://yoursite/article/?i=95558577dacb21f21cf10605251e1b87</id>
    <updated>2009-03-10T06:00:53-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/N69r8hI</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 A little late this week with the weekly roundup for AiGameDev.com - a lot of items to cover!  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don&#8217;t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there&#8217;s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
How AI in Games Works



First up is a major article by bit-tech on how game AI currently works in some major titles (FEAR2 and Empire: Total War) - it&#8217;s all smoke and mirrors, it seems! In any case, a good overview for those not knowledgeable about the area although it misses out a lot of details, and in some cases entire areas that are being used or researched although this is to be expected in such a large area being covered with so few examples. For developers you can see some of the methodology applied for Total War and FEAR2, so an interesting read regardless.

How AI in Games Works

Middleware Articles

Tough times for AI middleware, as always getting their technology into games. The first article details xaitment&#8217;s attempts to get their tech well known and used, while Develop profiles NaturalMotion&#8217;s morpheme 2.0.
In an interview with Develop xaitment&#8217;s Markus Schneider has detailed the battle to establish the reputation of AI middleware.

AI middleware is &#8220;fighting the battle physics has already won&#8221;

Today Develop has published a profile of NaturalMotion&#8217;s morpheme 2.0 middleware, and its integration of character physics and animation.

morpheme 2.0&#8217;s character toolset in focus

Procedural AI is the Next Big Milestone?


Kris Erickson puts forward a case for Procedural AI solving everything in videogames ;) Well, maybe he&#8217;s not suggesting everything, but it will possibly help content creation and AI - he says 10 years is the estimate, who&#8217;s going to take him up on it? I certainly think it&#8217;s a worthwhile area that&#8217;s getting incremental improvements in current videogames.
&#8220;How can we create realistic open world games where people that we meet in the street repeat more than the same 3 phrases over and over ad infinitum? Well, there are two main approaches that developers could take. The first approach would involve rounding up hot dog vendors and then recording thousands and thousands of lines of dialog from each, ensuring that the simulated characters you met in the game would always have something unique to say. Of course, this would require the invention of a new kind of storage medium just to contain the millions of lines of spoken dialog that the finished product would contain. This approach is not very practical. Luckily, there is another technology looming on the horizon that could enable game developers to craft truly convincing worlds full of speaking characters: Procedural Artificial Intelligence. This would involve creating complex behavioral algorithms and synthesized speech routines so that characters in the game could literally decide what to say based on how they were feeling that precise moment.&#8221;

Why Procedural AI is the Next Big Milestone in Gaming
The Case for Procedural AI commentary by Dave Mark.

Kodu - Microsoft Research


Something out of the recent Microsoft Research is available which might be interesting for game developers. Programming with a controller (which can include AI programming of course) - a tough task to make easy to do for sure.
Kodu is a new visual programming language made specifically for creating games. It is designed to be accessible for children and enjoyable for anyone. The programming environment runs on the Xbox, allowing rapid design iteration using only a game controller for input.
The Kodu language is designed specifically for game development and provides specialized primitives derived from gaming scenarios. Programs are expressed in physical terms, using concepts like vision, hearing, and time to control character behavior. While not as general-purpose as classical programming languages, Kodu can express advanced game design concepts in a simple, direct, and intuitive manner.

Kodu - Microsoft Research

AI Pengo


We&#8217;re always looking out for projects, indie games and anything else which features efforts on AI, so it is great to see some smart enemies added to a 2d game with some really good design aims in mind to make the game more fun. You can also play this one online which is neat!
I wrote this game to try out some ideas for Artificial Intelligence routines. I wanted to make a game where the enemies always did the smartest thing possible; where they worked in teams to get you, and where you&#8217;d have to think to avoid them. There is just one kind of enemy, but it uses every trick in the book to get you - even psychological tactics

Martin Rebas - Creative - AI Pengo

STALKER Early Build


Amazing of GSC to release an early build of their game S.T.A.L.K.E.R - a build from 2004. Check the first link for the download details and the second for some good information on it and videos - which showcase much of the cut content. There are working (to a degree) vehicles, bigger areas with some major layout differences in some cases, different enemies (zombies, a lot more sci-fi horror content), and more. I wonder what the AI is like in the build too!
&#8220;In response to numerous requests, we bring to your attention a build of the game S.T.A.L.K.E.R. from 2004, or, more precisely, &#8216;xrCore&#8217; build 1935, Oct 18 2004.&#8221;
Should be interesting to see the original AI, larger areas and ambient behaviours.


STALKER Early Build
Alpha STALKER released for Free

Autonomous AI and the First Dinosauria


The new Gamasutra blogging features an interesting post about Andy Schatz&#8217;s initial work in academia on AI projects, including the snowglobe above, as well as other work in college:
&#8220;My academic focus in college had always been in Artificial Intelligence, and I continued to be really interested in this idea of autonomous creatures which the player could influence, but not control. These thoughts continued to grow with a Machine Learning course I took at UMass. Each student had to program an AI to compete in a checkers tournament every night. The trick was, you could teach your AI HOW TO LEARN strategies, but you could not teach them the strategies of checkers directly. They had to learn them on their own. So during the day, we trained our AIs against themselves, and at night they would play in the tournament.&#8221;

Andy Schatz&#8217;s Blog - Autonomous AI and the First Dinosauria

Bot Colony
We have some information now in interview form about the project called Bot colony, described on the site as:
The player simply speaks in free-form, unrestricted English to the characters, who reply using speech. This ability to converse freely with the characters is a truly new gameplay experience. It raises immersion to a new level, and is a new storytelling medium &#8211; where a player discovers the story through dialog with the characters.
Not much more to go on apart from the interview - I guess we&#8217;ll be checking out the prototype work at GDC! Looks interesting if they can get anything right in the area of natural language processing, a tough area to crack.

Bot Colony
Bot Colony to Generate and Understand Language
Unraveling The Mysteries Of Bot Colony

Parallel Game Engine Architecture (Intel Smoke)
Finally, we have a discussion which involves our own Alex about an article in Gamasutra called Designing the Framework of a Parallel Game Engine - worth checking out the discussion and critique of it, and I presume more comments are welcome if you have read the article yourself.

Parallel Game Engine Architecture (Intel Smoke)

</div></summary>
  </entry>

  <entry>
    <title>Particle Swarms in Metroid Prime 3’s H</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/fMbtg7Nnr2g/particle-swarm-helios"/>
    <id>http://yoursite/article/?i=f9cc5bd91df1e8424172df199c9dc648</id>
    <updated>2009-03-08T20:31:02-07:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/fMbtg7N</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
This audio / video highlight from the AiGameDev.com Premium Members&#8217; area was brought to you thanks to the sponsorship of Spir.Ops, a game AI middleware company based in Paris.


Metroid Prime 3 was a Wii launch title and received critical acclaim from the press for its gameplay, design and controls.  The game didn&#8217;t receive as much attention from the gaming community as a whole though, and wasn&#8217;t listed among our best games in 2007.  Paul Tozour (Senior AI Engineer on the project) joked with me at the time that he would have put Metroid Prime 3 on that list&#8230; Having not played the game at the time, I didn&#8217;t quite understand that he was undoubtedly right - until his interview last December.
One aspect of Metroid Prime 3&#8217;s innovation was its use of particle swarms to portray various enemies in the Sky Town level, as well as the final Helios boss himself.  This boss is radically different from the usual Nintendo archetype as he&#8217;s composed of one prime bot and many smaller bots swarming around him&#8230; Paul Tozour, who was behind the implementation the design of Helios, talks about the development process in this video.
In the segment that precedes the following 4 minute highlight, Paul talks how the boss was implemented, in particular its use of multiple swarm controllers that can move the individual bots around and make smooth transitions between them.  The clip below goes into the details of how the controllers for each of Helios&#8217; forms behave.











NOTE: Paul&#8217;s use of waypoints is a bit of an inside joke. Paul is not only a strong advocate of navigation meshes, but he actively discourages waypoint uses&#8230; So his admission of using waypoints for Helios was quite a surprise!
Early in the recording, Phil Carlisle&#8217;s question was about the performance of the swarm when colliding with the geometry, and how the individual bots were prevented from intersecting with the level itself.  If you&#8217;d like to hear more from Paul, as well as his answer to these topics about optimizing the particle swarm to run on restricted hardware, you can find the Premium Members&#8217; Area right here.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #9 2009: 9 Stories,</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/9XoV5qjxWMQ/2009-week-9"/>
    <id>http://yoursite/article/?i=78313e1253aaff0b15fd75afad040b5f</id>
    <updated>2009-03-02T09:00:57-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/AiGameDev/~3/9XoV5qj</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Here we are with another Game AI Roundup here at AiGameDev.com.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don&#8217;t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there&#8217;s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Artificial Intelligence in The Sims 3


Richard Evans from EA brings some information about how the AI in the Sims 3 is looking like. Not many technical details, but it is a title to look out for when investigating life simulation AI when it eventually comes out.
&#8220;Hello everyone! My name is Richard. I&#8217;m the AI lead on Sims 3, and I&#8217;ve been busy working on the Sims&#8217; free-will &#8211; what they decide to do when you leave them to their own devices. 
One big thing we have insisted on from the start is that the Sims won&#8217;t need you to hold their hand every time they need to use the toilet. They are now able to take care of their basic needs on their own, leaving you to focus on more important things: building relationships, expanding your career opportunities, and exploring the world around you.
But perhaps more importantly than solving the base physical needs, our major focus has been getting the Sims to express their individuality. Each Sim has a personality defined from a large array of traits, and these traits have a strong influence on autonomous behavior. A flirty Sim will preen and pose, while an un-flirty Sim will reject all but the most persistent suitor. Some Sims are family-oriented &#8211; you will see them playing games with their children and cooing over them; others dislike children, and can be heard complaining about them loudly.  All the Sims will express their personalities on their own, without needing constant input from you.&#8221;

The Sims 3 - VIP - Artificial Intelligence in The Sims 3 


AIIDE Call for Papers (Final)

Kevin Dill, resident expert and AIIDE Organizational Committee Member, sent in details about the call for papers this year.  The deadline is April 14th.

Research Track
Research Track papers describe AI research results that make advances towards solving known game AI problems or enabling a new form of interactive digital entertainment. The novel technique should be validated in a game prototype or test-bed, but need not be validated in a commercial game. Research Track papers are evaluated by the highest standards of academic rigor. The highest rated papers will be presented in short lecture format. The next highest rated group of papers has the opportunity to present their work in a poster session. Applicants submit a paper of no more than 6 pages in the AAAI format for blind review (i.e. authors names and affiliations are omitted). All papers will be allocated 6 pages in the proceedings regardless of presentation format.
Industry Track
Individuals that have game development experience but lack the time or need for publishing rigorous academic papers can alternatively apply to the Industry Track. This track will include presentations of AI techniques, issues, or case studies from the perspective of implementing a product in the current commercial environment. Presentation proposals will be evaluated on their potential for conveying clearly elaborated ideas that have not been previously described to an adequate degree. Industry Track applicants submit an extended abstract describing the content of the proposed talk that also includes one paragraph describing their game industry experience. An extended abstract of two pages is sufficient, although any length up to that of a full paper (6 pages) is acceptable. Abstracts will be published in the conference proceedings.


AIIDE Call for Papers &#8216;09 PDF

New AI details for EVE Online


From this developer blog post, we find out more details of the changes to the AI in the MMO. It appears that the bots will play more in the style of players, which will likely be a nice change of pace versus the original very basic FSM AI.
&#8220;One of goals we have worked towards is making PvE combat more like PvP combat. This has a few benefits. First, new players get a taste of what PvP is like while still doing PvE encounters. Second, they will have ship fittings that are more suited towards PvP, which means that when the victi&#8230; um, player gets jumped by another player he has a fitting that will allow him to fight back effectively, or at least run away. Lastly, it will make for more engaging combat that is both dynamic and feels alive.&#8221;

EVE Online | EVE Insider | Dev Blog - how the ai pew pews the player

AI Programmer Job at Kaos Studios

A job at Kaos Studios this week for an AI Programmer.
Kaos Studios is located in the heart of New York City and is mere blocks from the Empire State Building and the thrill of Midtown Manhattan. Along with the opportunity to live in one of the most exciting cities in the world, we also just finished up one of the most exciting FPS titles to date. Frontlines: Fuel of War (PC/XBOX360) is already receiving great press and that&#8217;s just the beginning! We also offer competitive salaries, comprehensive health benefits, and an excellent compensation package. We are always looking for talented artists, developers, and designers to join our growing team, so check out our job postings and let us know what interests you!

JobSeeker message

On Resident Evil 5&#8217;s AI
This is a producer, but still, it is interesting to see what changes Resident Evil 5 has had in it&#8217;s design related to the AI. Zombie AI is going to be one hot topic at GDC at least!
&#8220;BF: One horror game I played recently that very much impressed me and a lot of people I know is &#8220;Left 4 Dead.&#8221; The reason being that the artificial intelligence is the main reason that game was scary because you never knew what was going to happen. If you played that game, what did you think of it and the A.I.? And relatedly, are there any significant changes in the A.I. of the enemies in &#8220;Resident Evil 5?&#8221;
JT: Yes certainly I have played that and a lot of people at Capcom are playing it. It&#8217;s a great game, a lot of fun, it&#8217;s really well put together. As you said, the A.I. system is very interesting. I think that element in creating that kind of game is really important because you don&#8217;t know what&#8217;s going to happen, where the enemies are going to come from. I think they did a great job creating a shooting game with zombies that&#8217;s very different from &#8220;Resident Evil&#8221; or any other zombie related games out there. One of the things I think is really interesting about &#8220;Left 4 Dead&#8221; is that system works because the zombies are always running at you, always chasing after you. It works really well in that game. As regards the A.I. system in &#8220;Resident Evil 5,&#8221; it has evolved and improved over &#8220;Resident Evil 4.&#8221; Probably the biggest change would be that there are lots of different environments in the game and no matter what environment you put the A.I. into, they don&#8217;t end up getting lost or not being able to find you. They&#8217;re always able to come after you and attack you. That has been a big improvement.&#8221;

Resident Evil 5 producer Jun Takeuchi on race, shooting while standing still, and the Wii

Designing the Framework of a Parallel Game Engine


Jeff Andrews writes a sponsored Gamasutra article on Parallel Game Engine creation, detailing one reason for doing so might be with AI:
The lock step mode can also implement a pseudo-free-step mode of operation by staggering calculations across multiple steps. One use for this might be with an AI that calculates its initial &#8220;large view&#8221; goal in the first clock, then instead of just repeating the goal calculation for the next clock comes up with a more focused goal based on the initial goal.

Designing the Framework of a Parallel Game Engine

Bot Navigation With No Items To Search For
Ted Vessenes posts up some thoughts on navigation AI for bots, in Quake 3-like games when there are no items in a level.
&#8220;Where do you go when there are no items on the level?
This might not seem like a big deal at first glance. But remember that bots use items as the primary motivating factors for deciding where to go. The pathing and routing code will tell you how to get from point A to point B, but all of that is meaningless if you don&#8217;t know what point B is. The typical strategy is for the bot to pick up the items that help it the most and require the least amount of movement. If the bot can&#8217;t find any enemies, it will head to the nearest generally useful item and hope a target wanders by. Item placement is the core component of goal selection in BrainWorks.
If you take away the items, everything falls apart.&#8221;

BrainWorks: Nowhere To Run

Pac-Man&#8217;s AI

A deeply insightful investigation of every single behaviour coded into Namco&#8217;s massively successful Pac-Man - the game is an early example of rather more subtle and complex AI then you would have thought, where difficulty is increased by improved AI algorithms not just throwing more enemies out :)
&#8220;What design and AI lessons can we learn from Namco&#8217;s seminal Pac-Man? From history through behavior, Gamasutra presents a comprehensive Jamey Pittman-authored guide to the classic game.&#8221;

Gamasutra - The Pac-Man Dossier

In The World of Software Architecture&#8230;
The regular social media channels coughed up the following articles this week.

Thought-provoking TDD Exercise at the Software Craftsmanship conference
10 Papers Every Software Architect Should Read (At Least Twice)

Wavefront Algorithm for Robots







Many algorithms applied in game AI today are historically from robotics research.  This interesting tutorial explains the wavefont algorithm.
&#8220;The theories behind robot maze navigation is immense - so much that it would take several books just to cover the basics! So to keep it simple this tutorial will teach you one of the most basic but still powerful methods of intelligent robot navigation.&#8221;

Robot Mapping and Navigation with the Wavefront Alogrithm

Oh, You Newspaper Lot&#8230;hehehe!
Lastly, the inevitably poor reporting from The Sun (If you&#8217;re not from the UK, it&#8217;s kinda akin to a children&#8217;s book but with naughtier pictures ;) ) brings this gem of a quote related to videogame AI, relating it to their feature on the Toshiba robot. Can anyone think of any better examples? You know, ones not over 10 years old? :)
&#8220;The artificial intelligence in MicroProse&#8217;s Civilization II is generally reckoned a great success. Other games have not been so fortunate.&#8221;

Asimo the most advanced robot in the world visits the Sun offices

</div></summary>
  </entry>

  <entry>
    <title>Preview of Behavioral Mathematics for Ga</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/T9flWb0aB6I/behavioral-mathematics"/>
    <id>http://yoursite/article/?i=9f56bdd46bd44abe25febac208ccf12f</id>
    <updated>2009-02-28T13:38:58-08:00</updated>
    <author>
      <name>42c0a2b1ab603f01b03b63e89bfddad3</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 
A new book about game AI, decision making and mathematics is coming out very shortly.  You&#8217;ll recognize the author, Dave Mark, from his semi-regular articles on this site as well as his article from AI Wisdom 4.  Dave is currently an independent game designer and AI consultant.
The reason for mentioning this book now is two fold: first, you&#8217;re going to hear a lot about the book (knowing Dave &#038; the publisher) in the next few months, so this gives you a little warning!  Second, Amazon.com has a 37% discount.  So if you order now, you can get the book at only $31.49.  For those in the UK, Amazon.co.uk has the book at 5% discount for &#163;26.59.  The price typically reverts back to normal once the book is out, so you&#8217;d pay the full $49.99 in a few weeks.  (The book is scheduled for March 10th.)
Editor&#8217;s Note: Join Dave Mark and I (Alex J. Champandard) on April 5th for a public live A/V masterclass about applying behavioral mathematics to improve Left 4 Dead&#8217;s bot AI.  We&#8217;ll look into some common decision problems that Dave has identified in the game, and explain how Behavioral Math could be applied to fix these decision problems without necessarily increasing the number of behaviors.  Get more information and sign-up for notification about this online session!

Book Description
The description still isn&#8217;t on Amazon yet, but Dave was kind enough to send it over.  Here&#8217;s the full blurb:
&#8220;Human behavior is never an exact science. As a result, the design and programming of artificial intelligence that seeks to replicate human behavior is already an uphill battle. Usually, the answers can not be found in sterile algorithms that are often the focus of artificial intelligence programming. However, by analyzing why people humans (and other sentient beings) behave the way we do, we can break the process down into increasingly smaller components. We can model many of those individual components in the language of logic and mathematics and then reassemble them into larger, more involved decision-making processes.
Drawing from classical game theory, this book covers both the psychological underpinnings of human decisions and the mathematical modeling techniques that AI designers and programmers can use to replicate them. With examples from both &#8220;real life&#8221; and game situations, the author explores topics such as utility, the fallacy of &#8220;rational behavior,&#8221; and the inconsistencies and contradictions that human behavior often exhibits. Readers are shown various ways of using statistics, formulas, and algorithms to create believable simulations and to model these dynamic, realistic, and interesting behaviors in video games.
Additionally, the book introduces a number of tools that the reader can use in conjunction with standard AI algorithms to make it easier to utilize the mathematical models. Lastly, the programming examples and mathematical models shown in the book are downloadable, allowing the reader to explore the possibilities in their own creations.&#8221;
If I had to add a tagline to the book it would be &#8220;Beyond Boolean Decisions&#8221;.



Table of Contents
Here&#8217;s the outline of the book itself:
Part I - Introduction

Why Behavioral Mathematics?

Games and Choices
Going Beyond Looks	

Observing the World

Identifying Factors
Finding Hidden Factors
Quantifying Observations
Needing More than Observations

Converting Behaviors to Algorithms

Using Numbers to Select
Using Numbers to Define
Using Algorithms to Construct Numbers


Part II - Decision Theory

Defining Decision Theory

Normative Decision Theory
Descriptive Decision Theory
The Best of Both Worlds

Game Theory

Starting Simple
Asymmetric Games

Rational and Irrational Behavior

Perfect Rationality
Bounded Rationality
Rational Ignorance
Combining it All

The Concept of Utility

Decision Under Risk
Utility of Money
Utility of Time
Our Utility of Utility

Marginal Utility

Value vs. Utility vs. Marginal Utility
Changes in Marginal Utility
Marginal Risk vs. Marginal Reward
Defining Thresholds
Multiple Utility Thresholds
The Utility of Marginal Utility

Relative Utility

Hedonic Calculus
Multi-Attribute Utility Theory
Inconsistencies
Apparent Contradictions
The Relative Benefit of Relative Utilities


Part III - Mathematical Modeling

Mathematical Functions

Simple Linear Functions
Quadratic Functions
Sigmoid Functions
Ad Hoc Functions

Probability Distributions

Identifying Population Features
Uniform Distributions
Normal (Gaussian) Distributions
Triangular Distributions
Uneven Distributions
Parabolic Distributions
Poisson Distributions
Distributing the Distributions

Response Curves

Constructing Response Curves
Converting Functions to Response Curves
Converting Distributions to Response Curves
Search Optimization
Hand-Crafted Response Curves
Dynamic Response Curves

Factor Weighting

Scaling Considerations
Weighting a Single Criterion
Combining Multiple Criteria
Layered Weighting Models


Part IV - Behavioral Algorithms

Modeling Individual Decisions

Defining &#8220;Decision&#8221;
Deciding What to Decide
Analyzing a Single Option
Comparing Options
Selecting an Option
Testing the Algorithm
Summarizing the Decision Process

Changing a Decision

Monitoring a Decision
Perseverance and Decision Momentum
Our Final Decision on Changing Decisions

Variation in Choice

Reasons for Variation
Embracing Randomness
Selecting from Multiple Choices
Scores and Weights


If this sounds interesting to you, pre-order from Amazon.com it now to save 37% in total.  In the UK, save 5% from Amazon.co.uk.  Otherwise, stay tuned for the live public session with Dave discussing Left 4 Dead&#8217;s bots in the next few months!
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #8 2009: 7 Stories,</title>
    <link href="http://aigamedev.com/links/2009-week-8"/>
    <id>http://yoursite/article/?i=42fa0fcccaf726cb9796e2fd50928d75</id>
    <updated>2009-02-23T07:30:32-08:00</updated>
    <author>
      <name>http://aigamedev.com/links/2009-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Onwards with another week of Game AI news in our fittingly named Game AI Roundup here at AiGameDev.com.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Superior Tactics
Richard Bull gives an explanation of the battle tactics the AI uses in Empire: Total War, showcasing the AI using certain tactics in the battle. Of course, he doesn&#8217;t lose, so obviously they&#8217;ve still got a way to go ;)






Empire: Total War ?Superior Tactics? Trailer

AI Changes In Total War
In an interview with Creative Assembly&#8217;s Kieran Brigden at Gamasutra, we find out about how the AI has changed from a state based system in Rome: Total War, to a more comprehensive and useful goal-based AI in Empire: Total War.
?Certainly that?s typified most in our AI system. We moved from a state-by-state AI system, which was like a chess game ? do A then B then C ? over to a goal-oriented action planner, which was essentially a very new kind of academic technique. It?s a constant list of priorities versus resources available. Those priorities are shifted like Post-It notes on somebody?s desk: ?The number one thing I must do today is this.? Depending how increasingly important those tasks become, they move up and down the queue. Then, the resources are allocated to identify those tasks.
What that means is you get reactive gameplay. It makes a massive difference. In something like Rome, for example, the AI will say, ?I have to break down the door or storm the wall to get into the city.? That is state A. To get to state B, where it?s fighting in the city, ?I have to achieve that.? But if you can interrupt it anywhere along that path, it never reaches the next state. It just keeps trying to get there.
Now, you say, ?All right, I?m going to outflank the enemy and go around the back, and he?s charging me down the center.? Then, suddenly the AI goes, ?My general is in danger.? So, ?protect the general? goes from priority six to priority one. Then, all of the resources are moved around doing that, and then the battle?s taking on a very different dynamic.?

PC Heritage, Bright Future: The Creative Assembly Interview

Epic Frontiers Dev Blog


The Epic Frontiers Blog is explaining how the MMORPG is developing the NPC AI, notably NPC conversation systems. Might well be worth keeping an eye on developments of the game, since good AI R&#038;D can come from anywhere and this seems to be on the right lines.
&#8220;One of the features I?m touting is the ability to have conversations (actual two-way conversations) with NPCs in Epic Frontiers. It?s not a new thing, and games like Zork have made deep interaction a priority from well over twenty years ago. Unfortunately, with the AAA game market leaning heavily on cutting-edge graphics, they have lost this ability to interact with NPCs outside of combat, and their ability to fund R&#038;D; into this realm has become stunted. Of course, being an indie without a real budget to stay within, I have the advantage of not having anyone breath down my neck about addressing it by a specific date.&#8221;

Epic Frontiers Dev Blog
Interrogative: A new old way of interaction

GTA IV&#8217;s Pedestrian Dialogue
A quick quote from Dan Houser of Rockstar on how the AI is perceived to be better in each GTA iteration with more behaviours and lines being spoken.
?When we were doing production, we?d just get our friends to come in and do voices, about 10 lines each. And then by ?IV? it split, but the big ones had hundreds of lines each but you keep adding new bits of A.I. or new behaviors and you want them to speak, because that?s what sells the A.I.?
- Dan Houser

?Grand Theft Auto IV? writer speaks, part 2 | Eric 2.0





&#8220;?you know how hard it is to convince someone that games don&#8217;t simply have to be about&#8230;&#8221;
Phil Carlisle writes about planning his AI GDC session, I hope he provides some insightful things to listen to at GDC!
??you know how hard it is to convince someone that games dont simply have to be about killing?
Given that the Wii has expanded the market into new areas, you would think more experimentation in what is arguably the most profitable game segment ever (the simulation) you would expect more. But visit any game trailer site and look at the number of simulation games that aren?t based on war and you?ll see where I?m coming from.
Imagine trying to pitch a game involving the creation of the AI equivalent of a romantic comedy in the vien of ?four weddings and a funeral? and you?ll maybe see my problem. I think games have the potential for social and emotional simulation that may well be a huge underinvestigated role for games as a medium, yet I?m just not entirely sure I can create something convincing enough that people will see what that might look like.?

An AI that can Express Emotions

Tutorial For AI In Flash Games

For anyone implementing Flash games with enemies, this tutorial might be a good starting point for adding AI to the mix.
All games need enemies?. okay, maybe not tetris. But if you?re in some game where you fly a spaceship it is more than likely that there?s going to be an enemy or two. So in this tutorial we?re going to learn to make our enemy class, making enemies randomly appear on the stage and move, and make them fire bullets at us.

Learn How to Make Enemies with AI!

Intelligent Brawling


Gamasutra publishes an article from a previous Game Developer with Tim Smith from THQ commenting on the AI in brawlers - such as God of War - with an in depth look at a variety of different ones. A good resource for researching the area, with some technical information and much design information:
AI attacks often fail to collide with the character even with no player input beyond blocking to avoid them (not moving, not dodging, not attacking), which feels odd. Not sure why this is happening-it seems like a bug. My best guess is it?s a sync issue with the block animation-block makes the player character crouch down a bit, and the attacks appear to go over his head.

Intelligent Brawling

Autonomous AI in student-made Feist

A notable technical achivement according to the makers of Feist was the AI, which is impressive given it&#8217;s a student made game. No more excuses from the big boys that AI is too difficult!
?GCG: Tell us one interesting technical achievement you had in making the game.
AS and FF: Because we wanted to be flexible during development, large parts of the mechanics are very adaptable and allow integration of further elements. The biggest part of that is probably the AI that is fully physics-driven and autonomous.
The player also inherits a lot of the AI code and therefore is also much more part of the game mechanics than in other games. This allows us to create additional characters and objects that interact dynamically with minimal work.?

Interview: IGF Student Compeition Finalists Florian Faller and Adrian Stutz, Feist - GameCareerGuide.com

Useful AI Resources
Some pages to bookmark - on the use of rand(), looking at the speed vs. randomness of different routines, and encouraging you to not use the default C++ library function, and a good page for general artificial intelligence links from around the web.

Artificial Intelligence links and resources
Why you should never use rand()

That?d be nice; Better A.I.
Finally, we have a rant about the progress of AI in relation to other areas of game development.
?While those have come many miles since their first incarnation, the A.I.?s progress seems to have all the progress of Sisyphus pushing his boulder up a mountain. Sure A.I. now is far superior than that of yesteryear but it?s progress doesn?t seem to be as important to game developers. Everytime a developer raves of their A.I. improvements it turns out to be little else than a more refined version of the marines from Half Life. Of course this is an unfair generalisation, but it still seems that the dream of facing off against A.I. that could actually challenge you (without cheating, i.e. catch up A.I., see mario kart and nearly every racing game) has been lost in favour of online play. Only RTS games seem to really get a clever A.I. (Galactic Civilization 2)while us dumb FPS gamers are stuck with A.I. that still sometimes run straight off cliffs or into fire. So I have devised a shopping list of things I would like to see used more in games.?

That?d be nice; Better A.I. « Idlehands Logs On

</div></summary>
  </entry>

  <entry>
    <title>Dynamic Motion Control, Flashback from g</title>
    <link href="http://aigamedev.com/theory/dynamic-motion-control"/>
    <id>http://yoursite/article/?i=118435a55e40bfd2b66b795ad9e4e4b6</id>
    <updated>2009-02-23T07:30:32-08:00</updated>
    <author>
      <name>http://aigamedev.com/theory/dyna</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 This post kicks off a series of retrospective posts from game|tech, a small but focused 2-day seminar held in 2004 about Creating Believable Characters.  The event was organized by industry veterans Jonathan Blow and Jeff Lander with the help of Chris Hecker.  Many of the sessions are relevant for those looking at the low-level aspect of AI &#038; animation integration.
The first talk chosen for this post is entitled &#8220;Dynamic Motion Control&#8221; by Torsten Reil of NaturalMotion, and contains a fascinating look at the trials and tribulations of creating animation based on a genetic algorithm to evolve neural networks.  In particular, modeling biologically-inspired actuators which control movement (in the talk, walking) proved difficult but ultimately successful enough to commercialize.


Figure 1: Leg actuators controlling a walk.

The talk mainly emphasizes how difficult the area of physics-based motion synthesis is, and that starting it from scratch is very hard to accomplish. NaturalMotion has made steady progress since this presentation and is now able to get its animation technology into certain videogames where physics interaction plays an important role.
The audio is below, which is good to listen to along with the slides, although the videos are missing.

Download audio file (Torsten-NaturalMotion.mp3)
Audio: Dynamic Motion Control by Torsten Reil


Dynamic Motion Control
Torsten Reil, NaturalMotion
Download PPT

Related Articles:

NaturalMotion&#8217;s euphoria Technology, editorial on AiGameDev.com

If you have an comments or thoughts about this kind of technology, and wish to discuss the ideas in the talk, feel free to post them below!
</div></summary>
  </entry>

  <entry>
    <title>Call for Proposals: Our Very Own Paris G</title>
    <link href="http://aigamedev.com/site/paris-cfp-2009"/>
    <id>http://yoursite/article/?i=57929ef1fa08be412d698f1f804b5c45</id>
    <updated>2009-02-23T07:30:32-08:00</updated>
    <author>
      <name>http://aigamedev.com/site/paris-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

We don&#8217;t typically dedicate whole posts to call for papers, but this one isn&#8217;t the usual academic conference - and we&#8217;re not necessarily looking for more white papers either!  On June 10th &#038; 11th, AiGameDev.com is co-organizing an event with LIP6 University in Paris, with a schedule that blends invited sessions from top AI developers from industry as well as tutorials / reviews and R&#038;D oriented sessions.
You&#8217;re probably thinking there are loads of conferences that cover game AI already - and you&#8217;re absolutely right!  There&#8217;s AIIDE in California, AAMAS in Budapest this year, CIG in Italy, SAB in Scotland, GIC in London and many others including the AI Games Research Network events around the U.K.

But what each of these conferences is missing - and I know this from either attending or being asked to present - is a solid industry presence!
And Now For Something Different&#8230;
Our Paris Game AI &#8216;08 event stood out from the crowd by actually having more professionals from the games industry and middleware companies than academics.  I have to admit though, the attendees of the workshop also included some leading academics from Europe, so the mix was much healthier and diverse than the usual game conferences too!
So, based on this winning recipe and learning from the great feedback we got from last year, we&#8217;ll be taking things even further this year, in particular focusing on:

Networking opportunities with industry professionals and leading academics in a friendly and informal environment similar to last year&#8217;s event.
The usual practically-oriented solutions, applied techniques and industry focus that you&#8217;ve come to expect from AiGameDev.com!
A free event (by registration open to the public), with invitations sent out to games studios, the game AI community and research institutes.
Less focus on back patting but instead genuinely trying to improve the quality of game AI in practice.

If I may say so myself, all this is refreshingly unique!  Once you find out about the keynotes you&#8217;ll see what I mean :-)
Call for Proposals
There are two main tracks for the talks &#038; presentations, depending on your background and experience:

Industry Track
Presentations about AI techniques used in commercial games, ranging from independent games to AAA titles.  Post-mortems and discussions about R&#038;D are also welcome, as well as participation for panels.
Academic Track
Reviews of fields of research, as applicable in practice to game development.  Tutorials about popular techniques that are already used in industry.  Demos and presentations of research applied to game AI.

Send your proposals and ideas to &lt;events at AiGameDev.com&gt; at the latest by March 15th.  We&#8217;ll consider the submissions and get back to you within a few weeks.  The benefits of being among the submission include invitation to the VIP dinner, as well as access to AiGameDev.com&#8217;s Premium Members&#8217; Area.


Photo 1: Lunch at the Paris Game AI Workshop &#8216;08 - sponsored by Spir.Ops.

Sponsorship Opportunities
Sponsors of the Paris Game AI Workshop will get exposure during announcements relating to the conference, and of course, during the conference itself.  Possible sponsorship includes:

The V.I.P. Dinner for Speakers, Experts and Contributors on Wednesday night.
Coffee Breaks in between the sessions, as well as Lunch during both of days.

Contact &lt;events at AiGameDev.com&gt; for more details and opportunities, particularly if you&#8217;d like to sponsor the event exclusively.
How to Sign-Up&#8230;
Last year&#8217;s event was free (by registration), but we actually &#8220;sold out&#8221; the places we had arranged and had to close registration.  This year&#8217;s location will be bigger, but the program will also be orders of magnitude better!  I&#8217;ve dropped hints before what you can expect, but let&#8217;s just say you don&#8217;t want to miss it&#8230;
The best thing you can do to make sure you don&#8217;t miss out on the emails is sign-up to the site so when we send out notification you can be among the first to join.  Otherwise, stay tuned to this blog for the official announcement.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #8 2009: 7 Stories,</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/mBEg0RJTfOQ/2009-week-8"/>
    <id>http://yoursite/article/?i=600f0e27762a6fa59504579e7f2161cd</id>
    <updated>2009-02-23T04:30:26-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Onwards with another week of Game AI news in our fittingly named Game AI Roundup here at AiGameDev.com.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Superior Tactics
Richard Bull gives an explanation of the battle tactics the AI uses in Empire: Total War, showcasing the AI using certain tactics in the battle. Of course, he doesn&#8217;t lose, so obviously they&#8217;ve still got a way to go ;)






Empire: Total War ?Superior Tactics? Trailer

AI Changes In Total War
In an interview with Creative Assembly&#8217;s Kieran Brigden at Gamasutra, we find out about how the AI has changed from a state based system in Rome: Total War, to a more comprehensive and useful goal-based AI in Empire: Total War.
?Certainly that?s typified most in our AI system. We moved from a state-by-state AI system, which was like a chess game ? do A then B then C ? over to a goal-oriented action planner, which was essentially a very new kind of academic technique. It?s a constant list of priorities versus resources available. Those priorities are shifted like Post-It notes on somebody?s desk: ?The number one thing I must do today is this.? Depending how increasingly important those tasks become, they move up and down the queue. Then, the resources are allocated to identify those tasks.
What that means is you get reactive gameplay. It makes a massive difference. In something like Rome, for example, the AI will say, ?I have to break down the door or storm the wall to get into the city.? That is state A. To get to state B, where it?s fighting in the city, ?I have to achieve that.? But if you can interrupt it anywhere along that path, it never reaches the next state. It just keeps trying to get there.
Now, you say, ?All right, I?m going to outflank the enemy and go around the back, and he?s charging me down the center.? Then, suddenly the AI goes, ?My general is in danger.? So, ?protect the general? goes from priority six to priority one. Then, all of the resources are moved around doing that, and then the battle?s taking on a very different dynamic.?

PC Heritage, Bright Future: The Creative Assembly Interview

Epic Frontiers Dev Blog


The Epic Frontiers Blog is explaining how the MMORPG is developing the NPC AI, notably NPC conversation systems. Might well be worth keeping an eye on developments of the game, since good AI R&#038;D can come from anywhere and this seems to be on the right lines.
&#8220;One of the features I?m touting is the ability to have conversations (actual two-way conversations) with NPCs in Epic Frontiers. It?s not a new thing, and games like Zork have made deep interaction a priority from well over twenty years ago. Unfortunately, with the AAA game market leaning heavily on cutting-edge graphics, they have lost this ability to interact with NPCs outside of combat, and their ability to fund R&#038;D; into this realm has become stunted. Of course, being an indie without a real budget to stay within, I have the advantage of not having anyone breath down my neck about addressing it by a specific date.&#8221;

Epic Frontiers Dev Blog
Interrogative: A new old way of interaction

GTA IV&#8217;s Pedestrian Dialogue
A quick quote from Dan Houser of Rockstar on how the AI is perceived to be better in each GTA iteration with more behaviours and lines being spoken.
?When we were doing production, we?d just get our friends to come in and do voices, about 10 lines each. And then by ?IV? it split, but the big ones had hundreds of lines each but you keep adding new bits of A.I. or new behaviors and you want them to speak, because that?s what sells the A.I.?
- Dan Houser

?Grand Theft Auto IV? writer speaks, part 2 | Eric 2.0





&#8220;?you know how hard it is to convince someone that games don&#8217;t simply have to be about&#8230;&#8221;
Phil Carlisle writes about planning his AI GDC session, I hope he provides some insightful things to listen to at GDC!
??you know how hard it is to convince someone that games dont simply have to be about killing?
Given that the Wii has expanded the market into new areas, you would think more experimentation in what is arguably the most profitable game segment ever (the simulation) you would expect more. But visit any game trailer site and look at the number of simulation games that aren?t based on war and you?ll see where I?m coming from.
Imagine trying to pitch a game involving the creation of the AI equivalent of a romantic comedy in the vien of ?four weddings and a funeral? and you?ll maybe see my problem. I think games have the potential for social and emotional simulation that may well be a huge underinvestigated role for games as a medium, yet I?m just not entirely sure I can create something convincing enough that people will see what that might look like.?

An AI that can Express Emotions

Tutorial For AI In Flash Games

For anyone implementing Flash games with enemies, this tutorial might be a good starting point for adding AI to the mix.
All games need enemies?. okay, maybe not tetris. But if you?re in some game where you fly a spaceship it is more than likely that there?s going to be an enemy or two. So in this tutorial we?re going to learn to make our enemy class, making enemies randomly appear on the stage and move, and make them fire bullets at us.

Learn How to Make Enemies with AI!

Intelligent Brawling


Gamasutra publishes an article from a previous Game Developer with Tim Smith from THQ commenting on the AI in brawlers - such as God of War - with an in depth look at a variety of different ones. A good resource for researching the area, with some technical information and much design information:
AI attacks often fail to collide with the character even with no player input beyond blocking to avoid them (not moving, not dodging, not attacking), which feels odd. Not sure why this is happening-it seems like a bug. My best guess is it?s a sync issue with the block animation-block makes the player character crouch down a bit, and the attacks appear to go over his head.

Intelligent Brawling

Autonomous AI in student-made Feist

A notable technical achivement according to the makers of Feist was the AI, which is impressive given it&#8217;s a student made game. No more excuses from the big boys that AI is too difficult!
?GCG: Tell us one interesting technical achievement you had in making the game.
AS and FF: Because we wanted to be flexible during development, large parts of the mechanics are very adaptable and allow integration of further elements. The biggest part of that is probably the AI that is fully physics-driven and autonomous.
The player also inherits a lot of the AI code and therefore is also much more part of the game mechanics than in other games. This allows us to create additional characters and objects that interact dynamically with minimal work.?

Interview: IGF Student Compeition Finalists Florian Faller and Adrian Stutz, Feist - GameCareerGuide.com

Useful AI Resources
Some pages to bookmark - on the use of rand(), looking at the speed vs. randomness of different routines, and encouraging you to not use the default C++ library function, and a good page for general artificial intelligence links from around the web.

Artificial Intelligence links and resources
Why you should never use rand()

That?d be nice; Better A.I.
Finally, we have a rant about the progress of AI in relation to other areas of game development.
?While those have come many miles since their first incarnation, the A.I.?s progress seems to have all the progress of Sisyphus pushing his boulder up a mountain. Sure A.I. now is far superior than that of yesteryear but it?s progress doesn?t seem to be as important to game developers. Everytime a developer raves of their A.I. improvements it turns out to be little else than a more refined version of the marines from Half Life. Of course this is an unfair generalisation, but it still seems that the dream of facing off against A.I. that could actually challenge you (without cheating, i.e. catch up A.I., see mario kart and nearly every racing game) has been lost in favour of online play. Only RTS games seem to really get a clever A.I. (Galactic Civilization 2)while us dumb FPS gamers are stuck with A.I. that still sometimes run straight off cliffs or into fire. So I have devised a shopping list of things I would like to see used more in games.?

That?d be nice; Better A.I. « Idlehands Logs On

</div></summary>
  </entry>

  <entry>
    <title>Dynamic Motion Control, Flashback from g</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/lqUblT4OH88/dynamic-motion-control"/>
    <id>http://yoursite/article/?i=b2f05b3492cae62c83b77a35b212c690</id>
    <updated>2009-02-21T16:00:51-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 This post kicks off a series of retrospective posts from game|tech, a small but focused 2-day seminar held in 2004 about Creating Believable Characters.  The event was organized by industry veterans Jonathan Blow and Jeff Lander with the help of Chris Hecker.  Many of the sessions are relevant for those looking at the low-level aspect of AI &#038; animation integration.
The first talk chosen for this post is entitled &#8220;Dynamic Motion Control&#8221; by Torsten Reil of NaturalMotion, and contains a fascinating look at the trials and tribulations of creating animation based on a genetic algorithm to evolve neural networks.  In particular, modeling biologically-inspired actuators which control movement (in the talk, walking) proved difficult but ultimately successful enough to commercialize.


Figure 1: Leg actuators controlling a walk.

The talk mainly emphasizes how difficult the area of physics-based motion synthesis is, and that starting it from scratch is very hard to accomplish. NaturalMotion has made steady progress since this presentation and is now able to get its animation technology into certain videogames where physics interaction plays an important role.
The audio is below, which is good to listen to along with the slides, although the videos are missing.

Download audio file (Torsten-NaturalMotion.mp3)
Audio: Dynamic Motion Control by Torsten Reil


Dynamic Motion Control
Torsten Reil, NaturalMotion
Download PPT

Related Articles:

NaturalMotion&#8217;s euphoria Technology, editorial on AiGameDev.com

If you have an comments or thoughts about this kind of technology, and wish to discuss the ideas in the talk, feel free to post them below!
</div></summary>
  </entry>

  <entry>
    <title>Call for Proposals: Our Very Own Paris G</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/THTv9DexvnI/paris-cfp-2009"/>
    <id>http://yoursite/article/?i=e1cb5f165167b39369f987cbde8bedf0</id>
    <updated>2009-02-20T14:30:40-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

We don&#8217;t typically dedicate whole posts to call for papers, but this one isn&#8217;t the usual academic conference - and we&#8217;re not necessarily looking for more white papers either!  On June 10th &#038; 11th, AiGameDev.com is co-organizing an event with LIP6 University in Paris, with a schedule that blends invited sessions from top AI developers from industry as well as tutorials / reviews and R&#038;D oriented sessions.
You&#8217;re probably thinking there are loads of conferences that cover game AI already - and you&#8217;re absolutely right!  There&#8217;s AIIDE in California, AAMAS in Budapest this year, CIG in Italy, SAB in Scotland, GIC in London and many others including the AI Games Research Network events around the U.K.

But what each of these conferences is missing - and I know this from either attending or being asked to present - is a solid industry presence!
And Now For Something Different&#8230;
Our Paris Game AI &#8216;08 event stood out from the crowd by actually having more professionals from the games industry and middleware companies than academics.  I have to admit though, the attendees of the workshop also included some leading academics from Europe, so the mix was much healthier and diverse than the usual game conferences too!
So, based on this winning recipe and learning from the great feedback we got from last year, we&#8217;ll be taking things even further this year, in particular focusing on:

Networking opportunities with industry professionals and leading academics in a friendly and informal environment similar to last year&#8217;s event.
The usual practically-oriented solutions, applied techniques and industry focus that you&#8217;ve come to expect from AiGameDev.com!
A free event (by registration open to the public), with invitations sent out to games studios, the game AI community and research institutes.
Less focus on back patting but instead genuinely trying to improve the quality of game AI in practice.

If I may say so myself, all this is refreshingly unique!  Once you find out about the keynotes you&#8217;ll see what I mean :-)
Call for Proposals
There are two main tracks for the talks &#038; presentations, depending on your background and experience:

Industry Track
Presentations about AI techniques used in commercial games, ranging from independent games to AAA titles.  Post-mortems and discussions about R&#038;D are also welcome, as well as participation for panels.
Academic Track
Reviews of fields of research, as applicable in practice to game development.  Tutorials about popular techniques that are already used in industry.  Demos and presentations of research applied to game AI.

Send your proposals and ideas to &lt;events at AiGameDev.com&gt; at the latest by March 15th.  We&#8217;ll consider the submissions and get back to you within a few weeks.  The benefits of being among the submission include invitation to the VIP dinner, as well as access to AiGameDev.com&#8217;s Premium Members&#8217; Area.


Photo 1: Lunch at the Paris Game AI Workshop &#8216;08 - sponsored by Spir.Ops.

Sponsorship Opportunities
Sponsors of the Paris Game AI Workshop will get exposure during announcements relating to the conference, and of course, during the conference itself.  Possible sponsorship includes:

The V.I.P. Dinner for Speakers, Experts and Contributors on Wednesday night.
Coffee Breaks in between the sessions, as well as Lunch during both of days.

Contact &lt;events at AiGameDev.com&gt; for more details and opportunities, particularly if you&#8217;d like to sponsor the event exclusively.
How to Sign-Up&#8230;
Last year&#8217;s event was free (by registration), but we actually &#8220;sold out&#8221; the places we had arranged and had to close registration.  This year&#8217;s location will be bigger, but the program will also be orders of magnitude better!  I&#8217;ve dropped hints before what you can expect, but let&#8217;s just say you don&#8217;t want to miss it&#8230;
The best thing you can do to make sure you don&#8217;t miss out on the emails is sign-up to the site so when we send out notification you can be among the first to join.  Otherwise, stay tuned to this blog for the official announcement.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #7 2009: 6 Stories,</title>
    <link href="http://aigamedev.com/links/2009-week-7"/>
    <id>http://yoursite/article/?i=3f1bb80e4ee42520d349b16057b387a3</id>
    <updated>2009-02-16T21:00:24-08:00</updated>
    <author>
      <name>http://aigamedev.com/links/2009-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Another week flies by and we have another Game AI Roundup here at AiGameDev.com. With us catching up, we have less news then our last updates, but still some interesting pieces.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.

Maximizing Player Satisfaction
Assistant professor, researcher and long-time reader Georgios Yannakakis sent in a link about his recent work at CIG &#8216;08.  Here&#8217;s the gossip:
&#8220;Below you may find a link of a paper I recently wrote (in proceedings of the IEEE Computational Intelligence and Games Symposium). It is about a rather efficient adaptation mechanism used for increasing the level of fun of children playing augmented reality games. The game adjusts itself in real-time for the entertainment value of the child to be improved.
The entertainment model is a neural network function that maps between player characteristics (e.g. response time) and reported (expressed) fun. The neural network outputs an entertainment value that predicts children&#8217;s level of satisfaction with an accuracy of approx. 80%. The same neuro-evolution methodology has been used quite successfully to simple screen-based games like Pac-Man during my PhD in Edinburgh.&#8221;

Real-time Adaptation of Augmented-Reality Games for Optimizing Player Satisfaction
Georgios N. Yannakakis and John Hallam
Download PDF

Left 4 Dead Developers Commentary


Excerpts from Left 4 Dead&#8217;s developers commentary (They say &#8220;Developer&#8217;s&#8221; - who edits GamesRadar anyway?) for those without the game. Some interesting design information based on the AI:
They already had the idea for co-op, Michael Booth was the guy who had done the AI for Counter-Strike bots so he really wanted to have AI at the forefront of the game. So, even when our companies were separate, we started working with them on the game. Gabe Newell was sitting with me and Erik Wolpaw at lunch and we were just babbling about the game to him. An hour later, he sent out an email that said, ?Hi Michael. Chet and Eric are going to help you with Counter-Strike?. We asked how much we could do, and he just said to work as much as we liked on it.

Developer?s commentary - Left 4 Dead | GamesRadar

SOM Neural Networks

Alex pointed out this interesting article on self organizing map neural networks, updated this week with new points. Here&#8217;s some information on the technique:
You have a number of neurons usually arranged in a 2D or 3D grid, each neuron has an associated weight vector. The input, which is a vector of the same size as the weight vector is connected to each neuron. The natural association is that each vector is a point in an n-dimensional space. By providing, during the learning phase, an uniformly distributed number of n-points to the network the neurons will arrange themself uniformly in the n-dimensions hypercube from which the n-points come from. Otherwise said, the neurons will classify the (sub)space, each neuron representing a partition of that (sub)space. When provided with a new point the network will act such that a single neuron will fire and that neuron will be the one closer to the provided sample. The network will classify the new point in an appropriate partition.

SOM neural networks

PathEngine Updated

In the middleware scene, Thomas Young sent in a note that PathEngine version 5.19 has been released. See the changelog here.
New optimisations offer 2x faster preprocessing times. PathEngine has released version 5.19 of its eponymous pathfinding middleware.
Alongside general bug fixes and minor API changes, the 3D content preprocessing has been significantly sped up, with ?most? scenes seeing build reductions of up to half.

PathEngine version 5.19 released

Firkin AI
A short rant about racing AI in Mario Kart Wii, and Need for Speed, showing some game series still have a long way to go to not frustrate gamers:
So last night I played some Mario Kart Wii and some more Need For Speed: Undercover. All-in-all, tons of fun, especially MKW. That game is pretty fun and I?m looking forward to unlocking most of the stuff so when party-goers come over we can choose from anything in the game to play.
But today is a day for ranting about video game AI, especially these two racing games. Let?s start with MKW&#8230;

Firkin AI | DarqByte

F.E.A.R. 2 Artificial Intelligence Video
Now the game has been released, this video about F.E.A.R. 2&#8217;s AI few weeks ago, which discusses the goal-oriented behaviors, dynamic cover, and fire response, has resurfaced.  Watch it below:







Behavioral Mathematics for Game AI

Dave Mark has been posting more information about his book over on his blog. This might be of interest for those looking for coverage of the area:
&#8220;Human behavior is never an exact science. As a result, the design and programming of artificial intelligence that seeks to replicate human behavior is already an uphill battle. Usually, the answers can not be found in sterile algorithms that are often the focus of artificial intelligence programming. However, by analyzing why people humans (and other sentient beings) behave the way we do, we can break the process down into increasingly smaller components. We can model many of those individual components in the language of logic and mathematics and then reassemble them into larger, more involved decision-making processes.
Drawing from classical game theory, this book covers both the psychological underpinnings of human decisions and the mathematical modeling techniques that AI designers and programmers can use to replicate them. With examples from both ?real life? and game situations, the author explores topics such as the fallacy of ?rational behavior,? utility, and the inconsistencies and contradictions that human behavior often exhibits. Readers are shown various ways of using statistics, formulas, and algorithms to create believable simulations and to model these dynamic, realistic, and interesting behaviors in video games.
Additionally, the book introduces a number of tools that the reader can use in conjunction with standard AI algorithms to make it easier to utilize the mathematical models. Lastly, the programming examples and mathematical models shown in the book are downloadable, allowing the reader to explore the possibilities in their own creations.&#8221;

Behavioral Mathematics for Game AI

Game/AI: Game AI Is Obsolete
Finally, we&#8217;ll end on a humorous video posted by Paul Tozour at Game/AI. Looks like we&#8217;re all out of work or fun things to do in AI now&#8230;

Game/AI: Game AI Is Obsolete




Relevant Programming Articles
On a more general note, a few good articles came up this week on Social Media sites, in particular:

Optimizing Code for Speed
Sharing Is the Root of All Contention

Stay tuned next week for more smart links from around the web!
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #7 2009: 6 Stories,</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/Bjdbt-npB0U/2009-week-7"/>
    <id>http://yoursite/article/?i=fdb60decee7132cd32b184aeedd653b8</id>
    <updated>2009-02-16T18:01:00-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Another week flies by and we have another Game AI Roundup here at AiGameDev.com. With us catching up, we have less news then our last updates, but still some interesting pieces.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.

Maximizing Player Satisfaction
Assistant professor, researcher and long-time reader Georgios Yannakakis sent in a link about his recent work at CIG &#8216;08.  Here&#8217;s the gossip:
&#8220;Below you may find a link of a paper I recently wrote (in proceedings of the IEEE Computational Intelligence and Games Symposium). It is about a rather efficient adaptation mechanism used for increasing the level of fun of children playing augmented reality games. The game adjusts itself in real-time for the entertainment value of the child to be improved.
The entertainment model is a neural network function that maps between player characteristics (e.g. response time) and reported (expressed) fun. The neural network outputs an entertainment value that predicts children&#8217;s level of satisfaction with an accuracy of approx. 80%. The same neuro-evolution methodology has been used quite successfully to simple screen-based games like Pac-Man during my PhD in Edinburgh.&#8221;

Real-time Adaptation of Augmented-Reality Games for Optimizing Player Satisfaction
Georgios N. Yannakakis and John Hallam
Download PDF

Left 4 Dead Developers Commentary


Excerpts from Left 4 Dead&#8217;s developers commentary (They say &#8220;Developer&#8217;s&#8221; - who edits GamesRadar anyway?) for those without the game. Some interesting design information based on the AI:
They already had the idea for co-op, Michael Booth was the guy who had done the AI for Counter-Strike bots so he really wanted to have AI at the forefront of the game. So, even when our companies were separate, we started working with them on the game. Gabe Newell was sitting with me and Erik Wolpaw at lunch and we were just babbling about the game to him. An hour later, he sent out an email that said, ?Hi Michael. Chet and Eric are going to help you with Counter-Strike?. We asked how much we could do, and he just said to work as much as we liked on it.

Developer?s commentary - Left 4 Dead | GamesRadar

SOM Neural Networks

Alex pointed out this interesting article on self organizing map neural networks, updated this week with new points. Here&#8217;s some information on the technique:
You have a number of neurons usually arranged in a 2D or 3D grid, each neuron has an associated weight vector. The input, which is a vector of the same size as the weight vector is connected to each neuron. The natural association is that each vector is a point in an n-dimensional space. By providing, during the learning phase, an uniformly distributed number of n-points to the network the neurons will arrange themself uniformly in the n-dimensions hypercube from which the n-points come from. Otherwise said, the neurons will classify the (sub)space, each neuron representing a partition of that (sub)space. When provided with a new point the network will act such that a single neuron will fire and that neuron will be the one closer to the provided sample. The network will classify the new point in an appropriate partition.

SOM neural networks

PathEngine Updated

In the middleware scene, Thomas Young sent in a note that PathEngine version 5.19 has been released. See the changelog here.
New optimisations offer 2x faster preprocessing times. PathEngine has released version 5.19 of its eponymous pathfinding middleware.
Alongside general bug fixes and minor API changes, the 3D content preprocessing has been significantly sped up, with ?most? scenes seeing build reductions of up to half.

PathEngine version 5.19 released

Firkin AI
A short rant about racing AI in Mario Kart Wii, and Need for Speed, showing some game series still have a long way to go to not frustrate gamers:
So last night I played some Mario Kart Wii and some more Need For Speed: Undercover. All-in-all, tons of fun, especially MKW. That game is pretty fun and I?m looking forward to unlocking most of the stuff so when party-goers come over we can choose from anything in the game to play.
But today is a day for ranting about video game AI, especially these two racing games. Let?s start with MKW&#8230;

Firkin AI | DarqByte

F.E.A.R. 2 Artificial Intelligence Video
Now the game has been released, this video about F.E.A.R. 2&#8217;s AI few weeks ago, which discusses the goal-oriented behaviors, dynamic cover, and fire response, has resurfaced.  Watch it below:







Behavioral Mathematics for Game AI

Dave Mark has been posting more information about his book over on his blog. This might be of interest for those looking for coverage of the area:
&#8220;Human behavior is never an exact science. As a result, the design and programming of artificial intelligence that seeks to replicate human behavior is already an uphill battle. Usually, the answers can not be found in sterile algorithms that are often the focus of artificial intelligence programming. However, by analyzing why people humans (and other sentient beings) behave the way we do, we can break the process down into increasingly smaller components. We can model many of those individual components in the language of logic and mathematics and then reassemble them into larger, more involved decision-making processes.
Drawing from classical game theory, this book covers both the psychological underpinnings of human decisions and the mathematical modeling techniques that AI designers and programmers can use to replicate them. With examples from both ?real life? and game situations, the author explores topics such as the fallacy of ?rational behavior,? utility, and the inconsistencies and contradictions that human behavior often exhibits. Readers are shown various ways of using statistics, formulas, and algorithms to create believable simulations and to model these dynamic, realistic, and interesting behaviors in video games.
Additionally, the book introduces a number of tools that the reader can use in conjunction with standard AI algorithms to make it easier to utilize the mathematical models. Lastly, the programming examples and mathematical models shown in the book are downloadable, allowing the reader to explore the possibilities in their own creations.&#8221;

Behavioral Mathematics for Game AI

Game/AI: Game AI Is Obsolete
Finally, we&#8217;ll end on a humorous video posted by Paul Tozour at Game/AI. Looks like we&#8217;re all out of work or fun things to do in AI now&#8230;

Game/AI: Game AI Is Obsolete




Relevant Programming Articles
On a more general note, a few good articles came up this week on Social Media sites, in particular:

Optimizing Code for Speed
Sharing Is the Root of All Contention

Stay tuned next week for more smart links from around the web!
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #5-6 2009: 7 Storie</title>
    <link href="http://aigamedev.com/links/2009-week-5-6"/>
    <id>http://yoursite/article/?i=0a55644a05aab85d1be3518c1e4f6a21</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/links/2009-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Weekends at AiGameDev.com are dedicated to rounding up the interesting and relevant game AI articles from around the web.  This week&#8217;s roundup has finally caught up with 2009 and we&#8217;ll be posting them weekly from now onwards!  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Alternative To Rubber Band AI As Used In Pure





Most racing videogames only provide simple rubber band mechanisms to increase or decrease difficulty for AI drivers. The Pure developers seeked another method out, as explained in this Gamasutra article.

Gamasutra - The Pure Advantage: Advanced Racing Game AI

Paris Game AI Conference 09 on LinkedIn Events

The upcoming Paris Game AI Conference (co-organized by AiGameDev.com) was announced recently, and we&#8217;re looking for proposals, in particular tutorials about cutting edge research topics and industry talks.  If you&#8217;re interested in participating email &lt;alexjc at AiGameDev.com&gt; with your ideas.
Make sure to mark it in your diary for June 10th and 11th later this year!

Paris Game AI Conference 09

Open Game World AI for Destroy All Humans 2


Pandemic&#8217;s Destroy All Humans 2 has an open world which required suitable AI - this Gamasutra article details the data-driven AI framework used for the game, which is applicable to other open game worlds.

Gamasutra - Creating All Humans: A Data-Driven AI Framework for Open Game Worlds

xaitment Opens LA Office

xaitment, AI middleware developers, opened a new office in LA at the start of February. From the press release:
&#8220;xaitment GmbH, one of the leading AI developers for games and simulations, today announced that they have opened a new office in Los Angeles, CA in order to position themselves closer to their US customer base. In addition, they have named Markus Schneider as head of their U.S. operations.&#8221;

Xaitment opens new US office | Game Development | News by Develop
xaiment

AI Jobs
2 Game AI jobs spotted for the past 2 weeks, details are:
We are looking for a GAMEPLAY &#038; AI PROGRAMMER for our ambitious next-gen project Earth No More.

GAMEPLAY AND AI PROGRAMMER - Earth No More / Recoil Games

The AI Programmer will work closely with the Lead Software Engineer and the rest of the development team to design and program AI systems for a next-generation first-person shooter game. This entails multiple levels of AI, and touches on several topics including navigation, behaviors, group coordination, environment awareness, tactics, goal-based planning, and terrain analysis.

TimeGate Studios AI Programmer

Jeff Hawkins on Artificial Intelligence Videos
Jeff Hawkins, of Palm Computing, has done a lecture on Artitifical Intelligence that might be of interest. The description is rather optimistic, but there we go.
The founder of Palm, Jeff Hawkins, solves the mystery of Artificial Intelligence and presents his theory at the RSA Conference 2008. He gives a brief tutorial on the neocortex and then explains how the brain stores memory and then describes how to use that knowledge to create artificial intelligence. This lecture is insightful and his theory will revolutionize computer science.




The role of AI in Virtual Worlds
Ben Goertzel has a look at the use of AI in virutal worlds, the challenges and why AI agents are not implemented in many virtual worlds, as well as what he thinks will solve the problems.
There seems little doubt that in the next years, AI will make huge inroads into virtual worlds, making them more compelling and increasing mainstream acceptance. But making this vision a reality is going to require plenty of interesting work on both the AI and virtual worlds sides.

The role of AI in Virtual Worlds - CyberTech News

AI Coming to EVE Online


Slowly but surely better AI is coming to EVE Online, which might well change the game drastically for some people:
Last but not least, we are further improving NPCs by assigning advanced AI capabilities to them. Of course we are not going to assign such improvements all of a sudden to all NPCs, but rather proceed on a careful step-by-step approach which starts with the Apocrypha release. At first, only Sleepers and existing Officer spawns will receive such improved behavior and no other changes will be made to existing PvE interactions. However, with time, we might want to progressively revamp the whole face the EVE Online PVE experience by giving most NPCs clean and fresh roots to rest on.
How will they react with such a behavior? Let us just say at the moment they are going to make logical target choices depending on the most threatening targets available; but again such details are left to be explained in another Dev Blog.

When evolution leaps forward | EVE Online | Dev Blog

Fink About It » Artificial Intelligence Acting Stupid

Alex Fink writes about artificial intelligence, a good basic introduction, but more interestingly how AI is being pushed forwards by game development.
This is an informative essay about artificial intelligence. Firstly this essay will argue that artificial intelligence is nothing to be afraid about, and secondly that its development is driven by computer games. In the following I am going to explain how artificial intelligence works and how intelligence is created.

Fink About It » Artificial Intelligence Acting Stupid

Responses to the FEAR 2 Demo


The original F.E.A.R. is an outstanding example of FPS squad based AI, so the sequel has a lot to live up to. Before the reviews come rolling in, the demo released recently has had some appraisal. Here are some quotes from various blogs:
FEAR AI, it?s hard to comment on. It?s been so hyped and such a crucial aspect of the first game, I don?t know really what to say. I mean first thing I noticed was the immediate cover as soon as they see you, although that?s not uncommon in the genre by any means. Next thing I noticed was that they are pro at throwing their grenades. It?s been so long since FEAR 1 I don?t recall that game?s details too much, but it?s been a while since I recall a game with such deadly AI grenade throwing. Playing through the fire fights was definitely fun though, I guess in the end that?s all that matters.

For honor, justice, and bacon - FEAR 2 Demo

Monolith has greatly improved the AI in F.E.A.R 2 to act and feel more realistically. The general rule of thumb here is if you can do it, so can they.The AI will take cover and work as a team while they attempt to flank you. To be more specific, they will throw over vending machines, desk, tables and anything else that can be used as cover. If you find yourself burning to death, a quick jump in a puddle will put the flames out. Keep in mind the AI will do the same thing if you lite them on fire. If you expect to walk into a room and be able to see every enemy out in the open, you better think again. There were often times where the enemies will be hiding in places you would least expect, and then out of no where they come out guns a blazing.?

F.E.A.R 2 Demo Impressions

?I think FEAR, fortunately enough for Monolith, was subjected to one of games journalism?s biggest sins; The Hivemind. Like Grand Theft Auto IV?s ?Living Breathing City?, enough critics praised FEAR?s A.I. that it?s become gospel, a set-in-stone-fact that FEAR has incredible A.I. Don?t get me wrong, in FEAR 2 the enemy soldiers will flank, flush-out and use cover, but they aren?t the be-all-and-end-all of enemy intelligence in games. You?ll see soldiers flip over tables for cover, only to vault straight over them instantly.?

The F.E.A.R. 2 Demo (Or: I Took 142 Screenshots)

</div></summary>
  </entry>

  <entry>
    <title>Hierarchical Path-Finding A* Demo on a C</title>
    <link href="http://aigamedev.com/videos/hpa-pathfinding"/>
    <id>http://yoursite/article/?i=d4836d465d09d024f0847d6c5fe3194b</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/videos/hpa-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

In a previous post, I wrote about the terrain area generation algorithm that I implemented as part of the AiGameDev.com Sandbox.  That code was based on the ideas of our resident expert William van der Sterren (his site).  The areas, even those generated by a simple algorithm, are very useful for speeding up most types of terrain operations&#8230; including navigation.  See our sample terrain analysis reports for more information about this.
Over the last month, Jad Nohra (programmer and contributor) has been adding hierarchical pathfinding to the codebase.  This work is based on the HPA* algorithm which I covered previously on the blog.  In the video below, you&#8217;ll see a 2D approximation of a popular Counterstrike map de-dust as a 64&#215;64 grid, which has areas generated and searched hierarchically to find paths between two points.

Note: If you&#8217;re an AiGameDev.com Member, you will be able to get access to this demo and the code (plus a few bug fixes and improvements to the area generation) at the end of the week.  If you&#8217;ve not signed up yet you can join here for another day and a half!











The video goes through the following phases:

Areas are generated using the same algorithm as the previous post.  This algorithm wasn&#8217;t explained publicly, but feel free to guess how it works!  (It&#8217;s relatively simple.)
Connections between the areas are identified and used to setup a high-level graph that can be searched.
The user selects a set of points: source (white) and target (red, a bit hard to see) in the world and the HPA* pathfinder is engaged.
The set of connections being searched are displayed in orange, and the active connections are displayed in yellow while the algorithm is running.
Once the path is found, the final path on the low-level is displayed in white.

If you have any questions, feel free to post them!  If you&#8217;d like to see the code at the end of the week, feel free to sign-up. :-)  And big thanks once again to Jad Nohra for his hard work.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #3-4 2009: 17 Stori</title>
    <link href="http://aigamedev.com/links/2009-week-3-4"/>
    <id>http://yoursite/article/?i=3b2a64fe83a0ac53d6a002ce7330b9e1</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/links/2009-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 The weekend roundups at AiGameDev.com are almost back to normal! There&#8217;s still a lot going on in the world of game AI, judging from the articles below.  The big news on the site this week is the re-opening of the Members&#8217; Area and its continuous training program (finally!); you have slightly over two days left to sign-up.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget our Twitter account for random thoughts&#8230;
This roundup was written by Andrew Armstrong and Alex Champandard.  If you have any news or tips for next week, be sure to email them in to editors at AiGameDev.com. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Automatic Game Rule Creation



Julian Togelius sent in a blog post about an interesting presentation he gave at at the recent CIG conference, titled &#8220;An Experiment in Automatic Game Design.&#8221;
?What we?re trying to do is search a space of game rules for rule sets that constitute fun games. This immediately raises two questions: how do you define and search a space of game rules, and how can you measure whether a game is fun??

Automatic Game Design

Aleks Krotoski at The Guardian Gamesblog also picks up on the story with her own commentary.
?This week, our interest is piqued by reports of a game developed without human intervention. Julian Togelius, a postdoc researcher in Artificial Intelligence at the Dalle Molle Institute for Artificial Intelligence in Switzerland, has aimed to create a machine that generates a game based on ?meta-rules?, with the aim of creating something - automatically - that is, well, fun.?


Game that develops itself could save industry

Finally, Slashdot has a discussion on the piece, with some comments.

Can We Create Fun Games Automatically? Slashdot discussion

Conference News
We&#8217;ve got information on a upcoming GDC presentation on multithreaded AI from Intel&#8217;s blog:
?I am going to give a presentation about multithreaded AI at GDC this year. We will examine how AI can be threaded and live in a highly parallel environment. How can you thread AI? How can AI talk to physics running on another thread or device? Is deferred processing worthwhile? Do you have to thread your designers? My presentation will hopefully answer these questions and more. The presentation will end with a quick overview of Intel?s Smoke demo; Smoke is a n-way threaded framework that includes source code for highly parallel AI.?

Intel Software Network Blogs » Threaded AI: FTW


Also, AIIDE-09 calling for speakers and the previously noted AAAI conference proceedings are online if you missed the previous news.

AIIDE-09 calls for speakers
AAAI conference proceedings

MIT Lectures: Shortest Path Algorithm
 
A set of three videoed lectures with details, all to do with shortest path algorithms. The first one is above, and covering a wide range of typical solutions:
This is the twelfth post in an article series about MIT?s lecture course ?Introduction to Algorithms.? In this post I will review a trilogy of lectures on graph and shortest path algorithms. They are lectures seventeen, eighteen and nineteen. They?ll cover Dijkstra?s Algorithm, Breadth-First Search Algorithm and Bellman-Ford Algorithm for finding single-source shortest paths as well as Floyd-Warshall Algorithm and Johnson?s Algorithm for finding all-pairs shortest paths.


MIT?s Introduction to Algorithms, Lectures 17, 18 and 19: Shortest Path Algorithms - good coders code, great reuse

An Introduction to Computer Go
Another learning resource, if you&#8217;re interested in Go as a technical AI problem, this is a good starter for learning about the field of using AI to play Go.

An Introduction to the Computer Go Field and Associated Internet Resources

The Creator of Creatures Hints His New Work
Creatures creator Steve Grand is noted as being back with this article on his work on biologically based AI called &#8220;Grandroids&#8221;.
?You may not have heard from Steve lately, but he has been busy?both in artificial life and robotics. Sim-biosis, his underwater life-form simulation is well underway, while his Graindroids project involves building a series of intelligent robots for rent, as crowd pullers in public events and trade shows. His first robot is a five foot tall humanoid female called Grace.?

Steve Grand is back!

Middleware News


Autodesk reveals their plans for Kynogon that they brought previously&#8230;
?What we?re focusing on is a complete solution for believable characters and that will run from art packages to runtimes,? enthused Michel Kripalani, Autodesk?s senior games industry manager. ?With the next generation of gaming platforms, the focus is going to be on runtime simulations. Of course, art tools are also becoming more tied into physics and AI, and while we already had the HumanIK technology, we wanted a complete team that could develop, market, sell and support middleware.?

Autodesk?s plans for Kynogon tech revealed

&#8230;morpheme 2.0 has also been released, which boasts NVIDIA PhysX integration&#8230;
&#8220;?With morpheme 2.0, we have developed a method to give programmers and animators much more targeted and differentiated control over physics and animation. It is now possible to add arbitrary physics modes to different parts of the same body ? all graphically.?

morpheme 2.0 now available

&#8230;and finally Alice McGee&#8217;s Grimm is noted to use AI Implant to render behaviours precisely.
?AI implant proved to be essential to getting the AI of our NPCs right. All the NPCs in Grimm have very specific behaviors, and using AI Implant enabled Marwin, our Technical Level Designer, to make those NPCs behave the way they should. He could do this without having to bug the programming team to code new behaviors every time we came up with new requests for NPC AI. This greatly improved both speed and efficiency, and allowed the programmers to focus on all the other tasks at hand.?

Postmortem: American McGee?s Grimm

AI on your GPU

NVIDIA and ATI went on a PR drive to associate AI development with the GPGPU.
?Nvidia?s director of product management for PhysX, Nadeem Mohammad, agrees,telling Custom PC that ?all the simple, complex operations? involved with path finding and collision detection ?are all very repetitive, so path finding is one of the algorithms which does work very well on CUDA.? ?You can always imagine CUDA as loads of processors running the same program but not the same instruction, and ideally on the same data set but with different input parameters,? says Mohammad. ?So, in the context of AI, the data set consists of the whole game world, and the parameters going into it are the individual bots ? that?s one way of neatly parallelising the problem. If you look at it in that context then any AI program could be accelerated.?
The idea of GPGPU-accelerated AI is also appealing to game developers. ?I think there?s a lot of potential for GPU acceleration to benefit AI,? Relic?s senior programmer on Dawn of War II, Chris Jurney, told Custom PC, ?all our AI is grid based, and we?re already using rasterisation to keep our maps up to date, and for line-draws on those maps to test for passability, so it?s a great match.?

Nvidia and AMD to accelerate gaming AI on GPUs

Kokatu raises the point that there is no standardisation on this with ATI, so might be less useful then first expected for most developers.
?Only problem we can see - and it?s a big one - is whether ATI and Nvidia would bother to actually standardise this, or whether we?d end up with two competing solutions that would split the developer community and make the whole thing a royal pain in the ass.?

PC: First Physics, Now AI Is Being Moved To Your Graphics Card

Videogames as Emotional Simulators?


Earnest Adams has an interesting, if somewhat shallow, article on his thoughts on if games can be realistic emotional simulators (taking examples as Facade above into account).

Gamasutra - The Designer&#8217;s Notebook: Numbers, Emotions, and Behavior

Far Cry 2, NPC reactions
Gamasutra&#8217;s Far Cry 2: Looking Back, Looking Forwards article has some details on the design decisions around NPC reactions.
Question: Though obviously you stressed they?re totally different games, Fallout 3 and Fable II both also have systems that modify NPC reaction to the player based on in-game actions. But In those games, they explicitly set a plus or minus score that occurs at the time you perform an action. In yours, the player isn?t really aware of it unless they look for it.
Answer: [?] But it?s not clearer that any one of those measures would have significantly improved it. I think that maybe it?s the wrong issue. For us, it would have been asking the wrong question, because instead what we should be trying to do is seek out those values, those metrics, in the game that are easy for a player to parse just by using their senses. Just by hearing, you?ll see the way the AI is behaving ? just by hearing the dialogue, and just by seeing the way the game world alters itself.

Gamasutra - Beyond Far Cry 2 : Looking Back, Moving Forward

AI NodeGraphs in Half Life 2 Developers Commentary (0:50)
For everyone who&#8217;s not found it in Half-Life 2, here is the video containing the directors commentary on AI NodeGraphs in Half Life 2.




Behavioral Mathematics for Game AI
Dave Mark&#8217;s book Behavioral Mathematics for Game AI is available to pre-order, check out the blurb below to see if it looks to be your fancy for helping improve your AI skills.
?Perfect for intermediate to advanced game programmers, this book shows readers how to use AI programming tools and techniques to create more realistic and interesting behaviors in video games. Readers are shown various ways of using statistics, formulas, and algorithms to create believable simulations and to model behavior. Additionally, the book introduces a number of tools that can be used in conjunction with standard AI algorithms to make it easier to use the mathematical models.?

Behavioral Mathematics for Game AI (Book)

Godfather 2&#8217;s AI Families


Finally, a quote to end the roundup - John Calhoun promises AI run rival families with personalities like real people, we&#8217;ll see if this game crops up more with proven AI when it&#8217;s released.
?Another cool technical innovation is the AI that runs the strategy game. While you?re playing the game, so are the five rival families you?re up against. Their actions are driven by a system that mimics playing against real people. (In fact, the rule set is derived from a table-top card game we developed!)
These families have personalities - some are vindictive, some are defensive, and some are downright devilish. When they come after you, you?ll realize that their decisions aren?t random. They?re pretty smart, and they know how to hit you where it hurts the most!?

Interview: Godfather II

</div></summary>
  </entry>

  <entry>
    <title>Procedural Worlds to Challenge Game AI: </title>
    <link href="http://aigamedev.com/discussion/procedural-city-engine"/>
    <id>http://yoursite/article/?i=6347fa0e2ce777800204d07796ea70ce</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/discussion/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 




One of the hottest topics of 2008 in the games industry was procedural world generation, which got a lot of attention due to the release of Spore primarily.  The technology hasn&#8217;t swept across the industry yet; procedural techniques are still confined to a few games in practice, but with the growing costs of generating next-gen content this trend is likely to grow.  There&#8217;s little doubt that we&#8217;ll have to deal with this problem as game AI developers very soon, so here&#8217;s how you can stay ahead of the curve!
This week for the developer discussion, AiGameDev.com has teamed up with Procedural Inc. - the team behind CityEngine.  The topic for the discussion:
&#8220;How does procedural technology and the generation of detailed 3D cities  affect our AI code, and what can we do to prepare for this paradigm shift?&#8221;
Procedural Inc. is providing detailed 3D city models as a bonus to all new members of AiGameDev.com&#8217;s new continuous training program this week (just recently relaunched).  However, you can also win a copy of these cities by entering this week&#8217;s discussion, and posting a comment on the blog or in the forums.  The author of the most interesting and insightful comment will receive the 3D files of high detail cities generated by CityEngine.


Screenshot 1: Procedurally generated version of Manhattan using CityEngine.


Discussion Topics
To give you a quick idea of the kind of topics you can tackle, here are a few more questions:

Do we need improvements to our tools &#038; data pipelines to deal with procedurally generated worlds during development?
How can we build AI behaviors to cope with the wide variety of cities that procedural algorithms may generate?
What&#8217;s a good way to make incremental improvements to our AI technology to support procedural generation of worlds?

You should post your comments below on the blog or in the corresponding forum thread.  The deadline for this contest is Monday, February 9th at 18:00 CET.


Screenshot 2: Venice as an automatically generated peninsula using CityEngine.

Prize Details
The cities you&#8217;ll receive for posting the most insightful comment in this discussion are detailed 3D models that contain details to challenge AI.  These models are being created by Procedural Inc., generated automatically based on user design using CityEngine.
You can use these 3D models whether you&#8217;d like to:

Test your AI algorithms against procedurally generated worlds to see how well they cope, or
Try building NPCs for large worlds too see what kinds of challenges Rockstar&#8217;s AI has to deal with!

Don&#8217;t forget you can download the trial version of CityEngine if you&#8217;d like to experiment with the software, but you won&#8217;t be able to export cities without a license.  If you contact Procedural Inc. for further details, be sure to mention you heard about them through AiGameDev.com!
Note: The screenshots in this post are taken from the Procedural.com website, and are not indicative of the 3D cities for this contest or the ones you&#8217;ll receive when joining as a member to our continuous training program this week.  The models are still being custom generated by the CityEngine team, specifically to maximize the challenges for AI (e.g. navigation).




Get started and post a comment below on the blog, or in the corresponding forum thread.
</div></summary>
  </entry>

  <entry>
    <title>AI and Avatars Research  Collaboration U</title>
    <link href="http://aigamedev.com/coverage/2009-ai-avatars-workshop"/>
    <id>http://yoursite/article/?i=6e02a28cf1c7e4bb0b61fed7ea63a204</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/coverage/20</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
This report of the AI Games Research Network was written by Andrew Armstrong (blog), who attended a game AI workshop in the U.K. recently.

On Monday 12th of January the National Media Museum in Bradford, U.K. held the AI and Avatars Workshop, organised by Bradford Universities Professor Peter Cowling, and sponsored by the EPSRC Industry/Academia Research Network on AI for Games and Screen Yorkshire&#8217;s Game Republic Academy. The day consisted of six 20 to 40 minute talks, with question and discussion time. The day was finished off by a large panel discussion. The evening also hosted an event in Leeds by Game Republic called &#8220;AI is dead, long live online gaming!&#8221; although I didn&#8217;t take notes from this.
I&#8217;ve uploaded all the slides I managed to get from the day, so a big thanks to all the speakers for providing these. My notes may contain errors, missing pieces or need the slides to complete the overview of the talk (as well as the nature of notes being brief and concise, meaning I deliberately cut down some of the material). Alex recorded the days talks with audio and video - there is a video available online from the last discussion panel &#8220;The Future of Collaboration in Player Representation and Engagement&#8221;, with others going to be released freely for AiGameDev.com Insiders. (Free registration required.)

High?level character behaviour for Interactive Storytelling and other derived applications


Photo 1: Marc Cavazza

Marc Cavazza, of Teeside University, started the day with a talk about NPCs, design and avatars. The initial joint research project was BARDS between Teeside and Eidos. It was to explore high level NPC behaviour from the perspective of Interactive Storytelling. It&#8217;s a good case study for discussing the problems with AI.
The project aimed to add planning to support narrative consistency and to explore the potential use in upcoming Eidos games. Difficulty getting the strategy accepted ? cannot take chances for a new title, lack of expertise with it, all things heard many times before. This meant will experiment with one title and develop an academic prototype to show it off.
The prototype took the novel classical novel Madam Bovery and put it into an interactive story. Why choose this? Most games are action based, not many based on psychology and emotions. The core action is changes of feeling and emotions in Madam Bovery. Need the ?ground truth? for characters interpretations ? the drafts of Madam Bovery describe all the feelings the characters are expressing, like having the complete picture from the author himself.
How many people have read the book? (2 people from the audience) not a bad amount actually. It is about boredom, about the female lead character dreaming. Noted as the first feminist book now, but put the author in court ? so shocking at the time.  The NPC&#8217;s are modelled (and can have a player jump in and impersonate them) using planning. How did we get the planning domain defined? Extremely specific emotions based off the drafts by Flaubert.
Can change the progress of the novel ? can change the ending but how can you do this without altering the intention of the novel? Used speech based interaction to allow the game to work (not much physical interaction). Emotional speech recognition could be used to solve the issue of the limits of speech processing. Only capture the emotional aspects of a piece of dialogue rather then the entire meaning. If the NPC is expecting a response then any other response may be negatively taken (example being saying ?Emma I don&#8217;t love you? which set her to more duty, saying she never wants to see you again). Feedback from users thought that the emotional response was correct, or noticed, and that they affected the story.
What about testing it on a real game, like Hitman? Moving to design&#8230;because they said what we really would like is&#8230;exploring possible solutions to a game level ? a solution creator, and for checking if they missed any paths. Generate a storyboard from the given actions the search returns. One problem is the world is static now, so this was emulated while the system was generating.
Time for AI: Emotions, Goals, Turn Taking (and more) for Intelligent Actors


Photo 2: Joanna Bryson

Joanna Bryson, from the University of Bath, described the use of memory for actors. Why does time matter? You can&#8217;t think of everything. Memory, sequencing and pursuit of goals (taking the time to get something done).
For memory, you&#8217;re like a notebook and write bits of things down to remember things. Can access things quickly in memory ? important things, usually more recent things. Recent things are incomplete information though, so understanding the memories can be hard without more information. To make more believable behaviour, you need context sensitive behaviour. You have recent events but these fade, while knowledge (facts, expectations) get stored.
Tanguy&#8217;s research into it has the same situation gone into with different preconceptions/knowledge, and having different reactions form that. Tension and mood are, over the short amount of time (given 3 good pieces of news then 3 bad pieces of news) are constant. The constants that change are  happiness and anger ? someone who was angry at the start only smiles on the first piece of really good news, while someone who was happy to start with smiles and becomes more happy for all the good news. Mood is long term, while emotions are short term. Behaviours are altered by these.
Action selection means sequencing when there are constraints to what you can do. Worrying about the situation where you&#8217;re trying to get one thing done.
You have to gather together modules to provide the correct parts for perception, action and memory, and do the selection of actions by putting these together in objects (eg; objects in C++ design) and work on iteration of the design to build it up. Working from the most simple implementation first. The simple interactions prioritise attacking, moving, responding to attacks, in a CTF game. The behaviours can get more complex (two actions at once ? such as moving and attacking).
In summary, you can&#8217;t think of everything and forgetting things you don&#8217;t need in the future, but emotions are a form of memory.

Time for AI: Emotions, Goals, Turn Taking (and more) for Intelligent Actor
Joanna Bryson
Download PDF

Approaches to Interactive Narrative Generation


Photo 3: Daniel Kudenko

Daniel Kudenko, from the University of York presented a talk about narrative in games related to AI Avatars. The history of narrative in games goes from stories written in manuals - weak stories. Moving onto pre-written stories (Farenheit), and more recently the story overlaid on a set of actions you can&#8217;t alter (Bioshock). But you can&#8217;t write paths for every decision&#8230;
What do we want? Some way to help the author along (if not replace them). Agency in the game, feeling he is part of the story and does influence the story. You also want scalability so it works for a fair amount of time, and domain-independence from the non-story elements, interestingness/immersion in the story, and re-playability if the game was played again in a different way.
GADIN ? Generation of Adaptive Dilemma-based Narrative. Idea is to put a point of focus to be lead towards with story actions, and when achieved and the climax is reached, the point of focus changes. Example used was soap operas to keep it relatively simple (contrasting with classic literature for instance).
Dilemmas in soap operas ? should I do A or B? Five generic categories of dilemmas extracted from the soap operas ? the story is a sequence of events just to lead to these dilemmas. Events are controlled by drama engine and by player actions. It is scalable so is potentially infinite.
The categories are betrayal (cheating on a partner), sacrifice (admit to crime friend accused of), greater good (giving something up to enemy in order to save self), take down (accepting punishment for injuring/killing enemy) and favour (giving something to a friend).  The architecture has inputs from the knowledge based (characters) story actions and dilemmas. The user model (trying to predict if a dilemma will be interesting) and user interacts both ways with the planner, both inputting and getting outputs from it.
As an example, a club scene with Mary (user) and 2 guys, who should end up both interested in her and her interested in both of them (so the eventual decision will be detrimental to one of them). A live example shows us flirting with someone, drugging them then having an affair ? as well as reporting a friends stealing crime, where upon she then says you should stop the affair.  The non-interactive generated story was overall positive when questioned users, although could be improved a lot (text only interaction is a problem).
Conclusions are that the problem with the authoring bottleneck is GADIN ? which is domain-independent (only deals with the story), among other features which make it advantageous. Problems are it takes time to do the planning, and that limits the game worldwide. A solution to this would be to leave action choice to NPC&#8217;s, which is emergent drama. However, may lead to incoherent story (where nothing exciting ever happens even). Want a compromise between the director and the characters choice of actions.
Moving into immersive interfaces, the solution to the text based option is a 3D interface (eg: Second Life). Need to translate the high level actions (eg: flirting) to high level actions, and making it real time but with cutting techniques (such as jumping from location to location).
Integrating it into MMORPG&#8217;s and social networking sites with a mixture of players and NPCs would be interesting. The challenge is detection of the social relationships and interactions, and then exploiting those (eg: seeing two close characters and putting a third in there to break them apart).

Approaches to Interactive Narrative Generation
Daniel Kudenko
Download PDF

Discussion: Emotional Interaction with Game Players


Photo 4: Daniel, Jaonna and Marc answering questions

This was a panel discussion (basically, a concentration of Q&#038;A for the previous speakers) based on the topic of emotional interaction with game players.
Question: Subjectivity ? assuming all characters are together in their likes, while really there are different things people like. Thoughts?
Daniel: Not everyone likes Soap Operas but the sandbox mode allows more ways to do things. The domain is specific to the system ? to do James Bond you need to move to another domain.
Marc: Can offer different genres, with some people in each genre liking to bring characters together, and others to take them apart. Comedy has failure too, where funny situations can arise from it. Within that genre that is chosen people interact with that genre, it is not scaled up to a stage for multiple dramas going on at once.
Joanna: It could be very easy to make it flexible. Individual customisation of intelligence, getting to what the player wants. If you start profiling the interesting parts of the story, then you could elaborate the plans more around them and the important characters.
Question: 99% of games are seemingly there are to keep a player there occupied (one action after another). More interesting is character development, plots are setup to elicit an aspect of a characters personality (if the plot was changed the outcome of the book would be the same). Possibly the purpose of a game could be to not just achieve things but to show the character understands different situations.
Joanna: Usually no point competition in it, very touchy feely. Allow some players to tweak the situations.
Daniel: I don&#8217;t know any game that does it. My children get a lot of fun out of trying the event five times until successful. Current computer games are not addressing it.
Question: Actors in your title Joanna, we&#8217;ve seen characters but with actors they bring something to the role. Are we really there in terms of virtual actors yet?
Joanna: You could see a different actors actions from the different AI procedures seen, even though they had the same face in the research shown. There in very basic ways.
Daniel: Do we really want to get real actors? An ideal computer action is a chameleon of behaviour, unlike human actors who bring something to the role.
Question:Adapting a story based on what you profile a player as (including gender etc.) when you gather information, and store it to model the personality.
Daniel: Various characteristics get stored based on the user choice for the dilemmas. It allows the story to pick interesting dilemmas. A selfish player can be given more interesting dilemmas (not ones which are giving you an option of helping yourself or a friend since they&#8217;ll only help themselves).
Joanna: Collaborative filtering, like Amazon recommended books, allows this to be looked at - privacy issues though.
Question:The cost at producing the assets for the creation of the expansive narrative rather then a linear world?
Marc: The procedural generation of plot can be used with procedural generation of assets. The designers said they don&#8217;t like it, it means there only needs to be one designer instead of four. Loss of control too in the design, rejecting the whole procedural generation because of this (as well as partially the issue of quality ? 80% of sitcom plots generated are average or not interesting). Why the game industry is conservative is because it is difficult to predict what someone will like ? whether it will sell 500,000 copies or not. (asked about machine learning to combat this) Yes, machine learning, but might not have the right data set (more actions in a comedy might not be more funny).
Joanna: You might be able to get something that gets more and more exciting. Myst and Facebook for instance. Lionhead doesn&#8217;t want to move towards it however.
Marc: The ability to communicate using natural language is paramount to NPC interaction. Chicken and egg problem for this.
Someone: In the Interactive Fiction community, Gallataya, single NPC interaction except a conversation with a statue. Borderline game, no points.
Another: Is that a game? What makes a game a game?
Marc: A coffee break question!
Question: I wondered about your Turing test, did you polish up or boiling down to abstract concepts?
Daniel: The second one ? the abstract parts (movement and suchlike) can be sometimes not part of the interesting story. It is the narrative skeleton of the soap opera story.
Question: If we boil down the real thing, we mechanising what a complex real soap is ? and perhaps before the reduction the model doesn&#8217;t fit the soap.
Daniel: Giving the author the skeleton to put the meat on is one way to do it. We however tried to stick to a high level narrative and not to a full story with all the details. Is a limit of the system.
Funding Streams for AI/Games research


Photo 5: Simon Colton

Simon Colton presented a talk which I only made brief notes on (since the majority of the information is contained in the slides), about funding Game AI related research between companies and universities.
Many funding proposals done (15 in 12 months, 12 accepted, 3 rejected unjustly ;) ). Been working with games companies such as Introversion Software (Small independent), Rebellion Developments (300 strong developer), Emote Games (80 strong, social games).
Examples of Introversion funding were wide ranging in both money and the depth of what the required work was. Most of the time Introversion provided a certain percentage of the amount of money for the project. Projects for DEFCON, Subversion, and others.
Check the slides for much more piratical information (such as who does funding, what was available).

Funding streams for AI/Games research
Simon Colton
Download PDF

Areas for Industry/Academic Research Collaboration in Game AI


Photo 6: Mark Morris

Mark Morris from Introversion Software presented a talk about his experience with academic collaboration, and the potential for it in the future. Looking at how to make my life better, and this will possibly help any other indie developers out there.
For Uplink, the game picks up whether the player wants to save the internet or destroy the internet (jobs can be good or bad for instance). There are actually other hidden agents that are not shown that work in the background. The question was if it would make a more meaningful experience?
The typical academic way is to fir the problem into something else (this isn&#8217;t working, lets plug it into Second Life). Maybe it isn&#8217;t best applied to Second Life though? Maybe put it directly into a game, with the actual code?  Darwinia hasn&#8217;t got any AI academic area specifically, but is fun to watch.
Why might we want to work with academics? To get additional resources and bigger teams, and funding helps pays for things. It also helps build up future employees, and access to the relevant research from the academic side. PR/Marketing is also big, but the main reason is to make the games better. Not harder or more advanced, but more copies sold ? so more fun. A bigger (better) experience then the last time. Also needs highly reliable results and technology ? 80-90% success is not acceptable for games, need a much higher percent. Any opponent AI&#8217;s also need to have a good learning curve.
Introversion works on it&#8217;s own design process (which might not be applicable to all companies). An idea spawns concept development which is tight and goes on for a while with lots of iterations, then the game is produced and put into QA before launching. Bigger companies usually go back to just before production rather then doing more concept iterations. This is the area where academics can really help with.
Concept development has a small team (one or two) working with technology to create a workable game concept. Ends in the ?first playable?. Very open ended (subversion took 5 years). Pushing the boundaries in this time, accepting new ideas to make it unique (like many indies). Is done with rapid development and undefined core systems and API&#8217;s.
The production goes into the larger team to create the final game. Still allows some new ideas to be added but usually it is laid out with deadlines.  Companies usually know people will like the previous game with more polygons. Game development is high risk and research is high risk. Sky high risk if you multiple them together. How can you manage the risk? During the concept and development phase, what potential ideas are there to work with the academic community to exploit? Then develop code that is amenable to research. If we can define components of the game that academics can improve then allow the academics to work on it, but if it isn&#8217;t completed or it doesn&#8217;t work the game still has the rest and can be completed.
All is not lost if it&#8217;s not finished the first time around ? ports, and other opportunities might arise.  Defcon AI project was launched a while after launch, and the game is still being developed (currently for an unannounced mobile platform which isn&#8217;t the iPhone). The AI was originally just to train against a bit, was going to be made into more of an opponent. Defcon was a bit a of a mess for academic use, but the API was completed. Looking for more students to look into it, since we&#8217;re looking for if there is any ultimate strategy.
Subversion is the second case study. Subversion is at the stage of procedural city generation (a technique needed for generating things in various games), Simon stated previously it&#8217;ll involve Espionage. We want to blur the lines between procedural and user generated since users can put their own buildings in the city. A question is how a transport system (eg: Monorail) can be added to the procedural generation ? will improve the fun, and is an academic question. If it works, great! If not, no worries.
How can we help each other? The industry is to blame, they need to provide sandboxes to the academics with code, and engineering it so it is ameniable for research. Academia should look for practical areas of research to achieve (also remember 90% is not good enough reliability). Academics should work with live game code and recognise the time pressure of the industry.  To get a tangible output, should identify areas of potential collaboration, provide an API, allow academics to produce papers and where appropriate assimilate the research into game development.

Areas for Industry/Academic Research Collaboration in Game AI
Mark Morris
Download ZIP of slides

Conclusion
Overall an interesting workshop which was a lot easier to take notes at then the last one. I am thankful to all the presenters who provided slides since these contain specific information I would have missed copying, and the Q&#038;A&#8217;s were delightful insights into the collaboration and the areas of research by academics, and the needs of industry, with a balanced set of speakers to reflect that.
I can only hope the next event is as enjoyable and useful. If you are in the UK and interested in the organisation, joining up for newsletters and information is free, so I&#8217;d give it a shot to keep up to date on the events at the very least. If you&#8217;re a developer who has had your interest piqued into making applications for research funding, make sure to contact them!
Editor&#8217;s note: From the two sessions omitted from the report, the first (panel) is already available as a full video recording in the Insider&#8217;s area, and the other will be posted shortly. (Priceless registration is required. :-)
</div></summary>
  </entry>

  <entry>
    <title>Using Potential Fields in a Real-time St</title>
    <link href="http://aigamedev.com/tutorials/potential-fields"/>
    <id>http://yoursite/article/?i=c2c6ae92c545f6147df6212511d4980e</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/tutorials/p</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
Editor&#8217;s note: This in-depth article was submitted by Johan Hagelbäck, lecturer and Ph.D. researcher in adaptive game AI.  If you&#8217;d like to join Johan and myself (Alex J. Champandard) for a live online masterclass (public) on Wednesday, February 4th at 21:00 CET Europe, 15:00 East Coast, then go to live.aigamedev.com for more details.  You&#8217;ll learn about the key concepts in this tutorial, but also learn how potential fields fit in with high-level AI strategy, dynamic navigation in crowds, and optimizing traditional pathfinding. (These sessions are normally for members only, so don&#8217;t miss it!)

Bots for RTS games may be very challenging to implement. The bot controls an often very large number of units that will have to navigate in a large dynamic game world, while at the same time avoiding each other, searching for enemies, defending own bases, and coordinating attacks to hunt the enemy down. RTS games operate in real-time which can make planning and navigation difficult to handle.
This is a tutorial about an unconventional planning and navigation method that uses multi-agent potential fields. It is based on the work we have presented in [1, 2, 3].  (See the bottom of this page for the white papers references, and links to the corresponding PDF files for download.)
What is a Potential Field?
PF&#8217;s has some similarities with influence maps. Influence maps are often used to decide whether an area in the game world is controlled by own or enemy units, or if it is an area currently not under control by any forces (no man&#8217;s land). The idea is to put a positive numerical value on the tiles currently under control by own units, and a negative numerical value on the tiles controlled by the enemy. By letting the numerical values gradually fade to zero we can create a map displaying the influence own and enemy units has in an area. Figure 1 shows an example of an influence map with one own and one enemy unit.


Figure 1: Influence map showing the areas occupied by own units (red) and enemy units (blue). White areas are no man&#8217;s land.


Potential fields work in a similar manner. The idea is to put a charge at an interesting position in the game world and let the charge generate a field that gradually fades to zero. The charge can be attracting (positive) or repelling (negative). Note that in some literature about potential fields negative charges are attractive and vice versa. In this tutorial positive charges are always attractive. Figure 2a-c show a simple game world with some impassable terrain (brown), an enemy unit (green) and a goal destination for the unit (E). An attractive charge is placed in the destination position (figure 2a), the charge generates a field that spreads in the game world (figure 2b) and fades to zero (figure 2c).


Figure 2a: An attractive charge (E) is placed in the destination for an own unit (green).



Figure 2b: The charge generates a field that spreads in the game world. Light blue areas are more attractive than darker blue areas.



Figure 2c: The field have spread throughout the game world and gradually fades to zero.

Navigation using Potential Fields
In Figure 2c an attractive field is spread around the destination point E. The idea is to let the green unit move to positions with a more attractive value and in the end find a way to its destination. To make this work we also need to deal with obstacles in the game world, in this case the mountains (brown areas). If we let the mountains generate small repelling fields, and we sum the fields with the attractive field from Figure 2c we get a total field which can be used for navigation (Figure 3). Since units always move to the adjacent position with the highest attractive value it will avoid mountains if other paths are available.


Figure 3: Repelling fields generated by mountains has been added.

The same idea is used for other obstacles. In Figure 4 two own units (white) are added. They generate small repelling fields which again are summed to the total field. Our green unit will then move around other units to avoid collisions. Now we have a final path for our unit (figure 5).
The unit can navigate from its current position to a destination and avoid obstacles without using any form of pathfinding algorithm.


Figure 4: Two own units added. They generate repelling fields for obstacle avoidance.



Figure 5: The final path for our unit (green).

Benefits of Using Potential Fields
One of the most important advantages of using potential fields is its ability to handle dynamic game worlds. Since units (agents) only have a one step ahead approach
instead of generating a long path from A to B there is no risk that a path becomes obsolete due to changes in the game worlds. Pathfinding in dynamic worlds can often
be complex to implement and require a lot of computational resources, and a lot of research has been done in this area. When using a potential field based solution the problem is solved automatically. Of course one need to take care when implementing the PF system to make updates of the potential fields as efficient as possible. (More about that later).
Another major advantage is the ability to create quite complex behavior by simply playing around with the shape of the generated fields. Instead of a linear field fading to 0, we suggest the use of non-linear fields. If we for example have ranged units like tanks in our army, we don&#8217;t want the tanks to move too close to an enemy unit but instead surround it at an appropriate distance (for example maximum shooting range of its cannons). This behavior can be created by putting a 0 charge at the enemy unit position, generate an increasing field with the most attractive value at maximum shooting distance, and then let the field fade to 0. Figure 6 shows an example of two tanks (green) moving in to attack an enemy unit (red) generating a non-linear potential field. Equation 1 shows an example equation of how this type of field can be generated.


Figure 6: Example of a non-linear field generated by an enemy unit (red). Own units (green) surround the enemy at an appropriate distance.



Equation 1: Example of a non-linear field used to create a surrounding behavior around enemy units. The weight w1 is used to alter the relative strength of the field at runtime. D is the maximum shooting distance, and R is the maximum detection range (the distance from which an agent controlling an own unit detect an enemy unit at).

Another behavior that is simple to implement is attack-and-retreat. A unit moves to attack an enemy unit from maximum shooting range (Figure 7a). After the attack our unit have to reload its weapon and retreats from the enemy until it is ready to fire again (Figure 7b). In the retreat phase all enemy units generate strong repelling fields with the radius of maximum shooting range of the unit. This is an example of how specific potential fields can be active or inactive depending on the internal state of an agent controlling a unit. An inactive field is simply ignored when summing the total potential field.


Figure 7a: A unit (green) moves in to attack an enemy unit (red) from maximum shooting range.



Figure 7b: After an attack the unit (green) have to reload its weapon and retreats from the enemy (red). In this phase enemy units generate a strong repelling field that overrides a part of the attractive field.

Figure 8 shows a screenshot from our potential field based bot for the ORTS engine. The left side of the figure shows a 2D view of the current game state. It shows our tanks (green circles) move in to attack enemy bases (red squares) and units (red circles). The brown/black areas are impassable terrain (mountains). The right side of the figure shows a potential field representation of the game state. As in other figures in this tutorial light blue areas are the most attractive. The white/gray lines are attacks from own tanks. The PF view clearly shows how own units surround the enemy at maximum shooting range while at the same time avoiding collisions with each other and terrain. The behavior of surrounding the enemy worked very well and was probably one of the key things behind our success in 2008 years&#8217; ORTS tournament.


Figure 8: Screenshot from our PF based ORTS bot. Left side is a 2D view of the current game state, right side shows the potential field representation of the game state. The blue circles are neutral units called sheep. They are moving randomly around the map to make pathfinding more complex. (Click to view full size.)

One thing we discovered while developing the ORTS bot was the totally different behavior when summing the potentials enemy units generate in each point compared to just using the highest potential an enemy unit generates in a point. In Figure 9a the potentials generated by the three enemy units are summed and added to the total potential field. By doing this the highest total potential is in the center of the enemy unit cluster (shown with a red ring) and our units were very keen to attack the enemy at its strongest points. The solution was to not sum the potentials, but instead take the highest potential generated by an enemy unit in a point (Figure 9b). In the latter case the highest total potential is a front at an appropriate distance from the enemy (shown with red lines).


Figure 9a: The potentials generated by enemy units are summed. The most attractive region is in the center of the enemy unit cluster.



Figure 9b: Only the highest potential generated by an enemy unit is added to the total field. The most attractive region is a front surrounding the enemy.

Notes about the Implementation
With careful design and implementation of the PF system the computational resources needed does not have to exceed a traditional A* based solution. Our ORTS bot used least CPU resources in a comparison with 2 other pathfinding based bots from 2007 years&#8217; tournament. We must however stress that it is hard to exactly measure the CPU usage due to the fact that the winning bot use more resources at the end of a game since it have more units left to control. Threading also made it complex to measure CPU resources used. The comparison were conducted by comparing the total CPU resources used be each client process in a Linux environment over 100 games. We can at least draw the conclusion that the bot was well within the margin of the frametime of 0.125 sec used in ORTS.
To improve performance we divided the potential fields into three categories:

Static field. Fields that are static throughout a game, in our case the terrain. This field is genererated at startup.
Semi-static field. Fields that doesn&#8217;t require frequent updates. In our case own and enemy bases. This field is generated at startup and only updated if a base is destroyed.
Dynamic field. All dynamic objects of the game world such as own and enemy tanks. This field is updated every game frame. For shorter frame times updates for example every 2:nd or 3:rd frame might be more suitable.

We experimented with two main architectures for generating the potential fields&#8230;
Pre-generation
The field generated by each object type was pre-calculated and stored in static matrices in a header file. At runtime the pre-generated fields were simply added to the total potential field at correct position. To make this feasible the game world had to be divided into tiles, in our case each tile consisted of 8&#215;8 points in the game world. This approach proved not to be detailed enough and the bot performed badly (2007 years&#8217; ORTS tournament). Since the game world was divided into quite large tiles we had problems deciding which tile(s) an object occupied. Consider the unit (orange circle) and base (orange square) in figure 10. Which tile(s) (grey squares) are occupied by the green unit, and which tiles shall be used as boundaries for the base?
This approach can be suitable for games like Wargus which uses a less detailed tile-based navigation system.

 

Figure 10: A unit (orange circle) and base (orange square) are placed in a grid representation of the game world. Which tile(s) are occupied by the unit and base?

Runtime Calculation
The potentials generated in a point are calculated at runtime by calculating the distance between the point and all nearby objects, pass each distance as a variable to a function and then calculate the generated potentials. This approach actually used less CPU resources in our bot than pre-generated fields
due to:

We only calculated potentials in points that are candidates to move to by unit(s). In the pre-generated approach the potentials for the whole game world were
calculated (of course this can be optimized in the same manner).
By first estimating the distance to an object with a quick Manhattan distance calculation, we could skip costly Euclidean distance and potential calculations for a large portion of the objects in the game world.

This approach was used in the second version of our bot (2008 years&#8217; ORTS tournament). Equation 2 shows an example of a potential field equation (with 2D and 3D graphs) used to calculate the potential a cliff generates in a point with the distance a from the cliff.

 


Equation 2: The equation (with 2D and 3D graphs) used in our bot to calculate the potential generated by cliffs at distance a.

What about the Local Optima Problem?
One of the most common issues with potential fields is the local optima problem. Figure 11a shows an example where this problem arises. The destination E generates a circular field that is blocked by a mountain. The unit (green) move to positions with higher potentials, but end up in a position (as shown in the figure) where the highest potential is where the unit currently stands. The unit hence get stuck.


Figure 11a: The local optima problem. The potential field generated by E is blocked by a mountain and the unit (green) is unable to reach its destination.

We solved this by using a trail similar to a pheromone trail as described by Thurau et al. in [4]. Each agent controlling a unit adds a trail at the last n positions visited by the unit, as well as the current position of the unit. The trail generates slightly repelling potentials and &#8220;pushes&#8221; the unit forward. Figure 11b shows how the trail pushes the unit (green) around the local optima (yellow path) and the unit are able to find a path to its destination.


Figure 11b: The trail (yellow) pushes the unit around a local optima.

Even with trails there is a risk that units get stuck in situations as shown in Figure 12a. This can be solved with convex filling of gaps (see Figure 12b).


Figure 12a: A unit (green) can get stuck in the gap in the mountain.



Figure 12b: Convex filling can solve this problem.

Summary
Below we list a number of criticisms against potential field based solutions and our point of view:

PF&#8217;s have issues like local optima that are difficult to solve. With the use of trails most local optima can be solved. PF&#8217;s still have problems in very complex terrain, but in those cases pathfinding based methods are better suited. The strength of PF&#8217;s are in large dynamic worlds with large open areas and less complicated terrain. This is the case for many RTS games of today.
PF based solutions use too much resources. We have in our work shown that PF based solutions can be implemented with the same or better resource efficiency as pathfinding based methods. More work in other environments has to be done to back up this statement. Efficiency can still be a problem, but that can often be the case in pathfinding based systems as well.
PF based solutions are difficult to implement and tune. PF&#8217;s can be implemented with very simple architectures. Tuning can be difficult and time consuming, but the relative importance between the fields is a great help here (i.e. is destroying a base more important than destroying units?). A graphical representation of the potential field view as the one shown in Figure 8 is also valuable. There is however a need for better tools and methodologies to aid in this matter.

After my talk on AIIDE 2008 I got some interesting comments and ideas. Brian Schwab pointed out the possibility of using the GPU to further improve the performance of field generation. I have not been able to investigate this in more detail mostly due to my lack of knowledge in GPU programming. If anyone knows about an easy framework for this feel free to contact me. Chris Darken came up with an idea of combining pathfinding and potential fields to benefit from both worlds. Pathfinding could for example be used to move units over large distances, while potential fields could be used when engaging the enemy. The idea sounds interesting and I hope I&#8217;ll be able to try it out soon.
We believe that potential field based solutions can be a successful option to more conventional pathfinding based solutions. After a mediocre ORTS tournament 2007, some tactical and technical problems were addressed and solved and a new bot version was created. In experiments this bot won over 99% of the games against the four top teams from 2007 years&#8217; ORTS tournament (see Table 1). The bot also won 98% of the games in 2008 years&#8217; tournament, but we must point out that the number of participants was very low. This was quite an improvement from ending at 6:th place of 9 participants in 2007.  The results from 2008 can be found on the tournament webpage.




OpponentTeam
Win %(100 games)
Avg units left(of 50)
Avg bases left(of 5)


NUS
100%
28.05
3.62


WarsawB
99%
31.82
3.21


UBC
98%
33.19
2.84


Uofa.06
100%
33.19
4.22


Average
99.25%
31.56
3.47



Table 1: Experiment results from our PF based bot against the four top teams from 2007 years&#8217; ORTS tournament. Our bot won 99.25% of the games with an average
of 31.56 units left after each game (both teams start with 50 units) and 3.47 bases (both teams start with 5 bases).

In a working paper we show that PF based bots can handle complex scenarios such as a full RTS game including fog-of-war, resource gathering, exploration, base building and a simple tech tree. The work might be a scope for a second part of this tutorial. We have also experimented with runtime difficulty scaling and tests conducted by human players.
We are interested in investigating PF based approaches in other RTS environments and we have done some initial testing on the Wargus platform. I gladly accept suggestions on other platforms.
References

Using Multi-agent Potential Fields in Real-time Strategy Games
Johan Hagelbauck and Stefan J. Johansson
International Conference on Autonomous Agents and Multi-agent Systems (AAMAS), 2008.
1. Download PDF


The Rise of Potential Fields in Real Time Strategy Bots
Johan Hagelbauck and Stefan J. Johansson.
Proceedings of Artificial Intelligence and Interactive Digital Entertainment (AIIDE), 2008.
2. Download PDF


A Multiagent Potential Field-Based Bot for Real-Time Strategy Games
Johan Hagelbauck and Stefan J. Johansson
International Journal of Computer Games Technology, 2009.
3. Download PDF


Learning Human-like Movement Behavior for Computer Games
C. Thurau, C. Bauckhage, and G. Sagerer
International Conference on the Simulation of Adaptive Behavior (SAB), 2004.
4. Download PDF

About the Author
Johan Hagelbauck is a Ph.D. student and lecturer in adaptive game AI at Blekinge Institute of Technology, Sweden. You can visit his webpage or contact him at jhg[at]bth.se.
Editor&#8217;s note: If you&#8217;d like to join Johan and myself (Alex J. Champandard) for a live online masterclass (public) on Wednesday, February 4th at 21:00 CET Europe, 15:00 East Coast, then go to live.aigamedev.com for more details.  You&#8217;ll not only learn about the practical details behind this article, but also how potential fields fit in with high-level AI strategy, dynamic navigation in crowds, and optimizing traditional pathfinding.  Similar sessions are run weekly as part of AiGameDev.com&#8217;s membership site, so don&#8217;t miss this free event.
Feel free to also post questions or feedback in the comments below.
</div></summary>
  </entry>

  <entry>
    <title>Designing Survival Behaviors: Inside the</title>
    <link href="http://aigamedev.com/design/survival-behavior"/>
    <id>http://yoursite/article/?i=3765da97d107aa0f53ed26c9d9759b82</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/design/surv</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

These days, it&#8217;s becoming much easier to program logic to animate on screen characters.  However, that&#8217;s only a small part of the challenge of building a game that involves and immerses the player.  Actually bringing NPCs to life is something that all AI developers struggle with - and frankly, few succeed&#8230;
Earlier in the week (as part of our newly re-opened membership site) I had the pleasure of interviewing Introversion&#8217;s Chris Delay about the design and implementation of the AI in Darwinia and Multiwinia.  Introversion is an independent game development company that was also behind Defcon - recently in the news about its API.
Darwinia, released in 2005, is a game that received acclaim for its blend of innovative design, gameplay, and stylized characters &#038; world.  Players and reviewers genuinely felt that the Darwinians were a living part of their environment.  In the following video, you&#8217;ll hear Chris describe how they managed to imbue life into the Darwinians by designing them with a wide range of survival behaviors.  (The video is 5:12 minutes long, and is approximately 4Mb if your browser supports a recent version of Flash - smaller otherwise.)

About Chris
The creative force behind Introversion, Chris Delay is the lead designer and developer of all Introversion&#8217;s games.  He also writes regularly about design and technical issues on the Introversion blog, in particular about upcoming games such as Subversion.
Audio / Video Recording











Like to know how these survival behaviors were implemented in practice?  Wondering how the Darwinians know how to prioritize their threats when there are many enemies, lasers and grenades around?  Curious how Chris got around the performance problems of having thousands of Darwinians at the same time in Multiwinia?  Sign-up now to the premium Members&#8217; Area; the full length high-quality interview will be posted this weekend.




If you have any comments about this highlight, be sure to post them below or in the corresponding forum thread.
</div></summary>
  </entry>

  <entry>
    <title>AiGameDev.com’s Membership Site Now Op</title>
    <link href="http://aigamedev.com/site/premium-launch"/>
    <id>http://yoursite/article/?i=0be07e1d1b700d724984e76217a26077</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/site/premiu</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 
This has been an incredibly hectic day.  In fact, I&#8217;m embarrassed to admit it&#8217;s been so busy that the new server &#038; build machine we received today is still sitting in the hallway unwrapped.  But once again it&#8217;s been worth it!  Basically, we&#8217;ve just re-opened our membership site, motivated by the persistent demand of readers who missed out last time.  And, based on feedback from an early adopter today, we&#8217;re doing something right!
Anyway, here is the launch page, which contains all the details you need to get access to our very best content - and secure your fast mover bonuses! (You have approximately 21h more hours longer to get a free month, and there are a couple more extra reports left to win.)
If this is the first time you&#8217;re hearing about the membership site, then here&#8217;s everything you need to know.  There are three parts to our online training program (click on the links to find out more):

Technical Reports Combining the Expertize of Veterans on Specific Topics
Live Masterclasses and Interviews with Experts and High-Quality Recordings
Source Code Samples and the Industrial-Strength Prototyping Environment

Also, keep in mind we have a contributors system in place for the site, so once you sign-up you can sustain your membership points by transcribing audio tracks for example.  So there&#8217;s really no excuse for not signing up!  If you have any questions of course, email me at &lt;alexjc at AiGameDev.com&gt;!  Otherwise head over to the launch page :-)



Edit: I will add the questions I receive to this page along with my answers.
Frequently Asked Questions
Question: What&#8217;s the difference between &#8220;Members&#8221; and &#8220;Insiders&#8221;?
Answer: If you&#8217;re already registered on the site (free) and have access to some of our content for no-cost, then you&#8217;re what we call an Insider.  This will not change!  What we&#8217;re re-launching this week is access to our best material for paying members, which you can easily upgrade to if you have a credit card nearby!
Question: Will the monthly price go up if I don&#8217;t sign up now?
Answer: Short answer, yes.  Long answer, there&#8217;s already lots of content in the members area and as we improve it the price will steadily increase to reflect that.  Also, we&#8217;re subject to VAT since the start of the year and we will add that to the price after this week is over.
Note that the individual offer may not even stay open after this week.  It&#8217;s a lot of work to take on new members and re-open the site, and we&#8217;d really rather focus on developing top quality content!
Question: I&#8217;d like to subscribe for a whole year; is there a yearly payment option?
Answer: No, we currently provide only quarterly packages.  Those of you that mentioned you&#8217;d like to support the site, then don&#8217;t hesitate to select a more comprehensive package!  (There are some for independent developers and studios.)
Question: I can&#8217;t quite afford the recurring membership at the moment, but I&#8217;d love to join now. What can I do?
Answer: We have a contributors system in place so you can sustain your membership.  This basically means you help us out with things you are comfortable with doing, such as transcribing the audio of online sessions.  If you&#8217;re interested, email us &lt;members at AiGameDev.com&gt; for more information.
Question: Do you support alternative forms of payment, like American Express or bank transfers?
Answer: For the individual membership you have the choice between Visa and Mastercard.  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 &lt;members at AiGameDev.com&gt;.

So, what are you waiting for, go and check it out now!
</div></summary>
  </entry>

  <entry>
    <title>Quote of the Month about AI in Games, Th</title>
    <link href="http://aigamedev.com/essays/quote-generic-uniqueness"/>
    <id>http://yoursite/article/?i=1295b91c7a7d1c9f9a6536c671ab1181</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/essays/quot</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 There are two things that drive your favorite game AI website.  The first is the membership part of the site (which is re-opening in 12 hours) where we develop the best possible material about artificial intelligence in games.  The second is our sponsors, who help make the best highlights of this content available to a wider audience - including you!
This month, I decided to throw in a little nugget from the AI Games Network event in Bradford a few weeks ago.  The following quote is by Adam Russell, who&#8217;s officially a &#8220;Games Studio Manager and Lecturer in Games Programming&#8221; at the University of Derby.  Adam worked at Lionhead as an AI programmer, on the original Fable in particular.
Scroll down to find out what Adam had to say&#8230;

Thanks to Our Sponsors

SpirOps is a middleware development team focused on AI. Their ultimate goal is to allow video games and simulations development teams to enter what we call &#8220;the Living Game era&#8221;. To design more realistic behaviors with a never reached complexity, the SpirOps developed an artificial intelligence design paradigm called &#8220;Drive Oriented&#8221; which allows designing AI with graphical tools and keeping a linear complexity during the brain creation process.


PathEngine provides a sophisticated toolkit for agent movement, built around an advanced points-of-visibility pathfinding core. This gives you powerful paired path planning and collision against a sophisticated, continuous space, pathfinding movement model, with robust integrated dynamic obstacle functionality and exact representation of agent shape, for seamless movement over overlapping ground geometry.


We bring bytes alive! This is the vision and motivation that drives Artificial Technology GmbH. Graphically, many computer games already emulate the real world quite faithfully. The behavior of the characters, on the other hand, is often less authentic. EKI One Middleware (emotional &#038; artificial intelligence) is a new solution by Artificial Technology GmbH which allows game developers to bestow on their characters with emotional behavior.


Havok is the premier provider of interactive software and services for digital media creators in the games and movie industries. With world leading expertise in physics, animation and tools, Havok&#8217;s business is to turn customers&#8217; creative aspirations into technical realities. Havok&#8217;s modular suite of tools gives power to the creator, making sure that clients can reach new standards of realism and interactivity, while mitigating the overall cost and risks associated with creating today&#8217;s leading video games and movies.


A spin-off of the world-renowned German Research Center for Artificial Intelligence (DFKI), xaitment was founded in 2004 with the mission to create lifelike AI for games and simulations. Their mission led to the development of the xaitEngine, a highly customizable and highly modular multi-agent system that enables bots to learn from their mistakes, coordinate activities, compete with each other and achieve their goals with uncanny realism.


TruSoft provides behavior-capture AI technology, AI middleware and tools that empower game developers and gamers to create humanlike, learning, adaptive AI agents, simply by playing the role of the agent, which then replicates the behavior of human players. TruSoft&#8217;s clients include SONY, Lockheed Martin, and Electronic Arts, plus many universities and research centers worldwide.

Quote of the Month
Here&#8217;s what Adam had to say during the main panel in Bradford at the end of the day:
&#8220;There&#8217;s a tension between the business goals of game developers and the academic model (taken purely) which is [that] we want to make general domain-independent AI algorithms that we can apply to lots of problems - as academics.
But what makes games sell is actually uniqueness and not general solutions.  If you&#8217;re doing funded work, then that desire to make things generic actually pulls against that business goal.&#8221;

Thanks to Adam Russell for his great insight, and thanks to our sponsors for everything else!
</div></summary>
  </entry>

  <entry>
    <title>AAAI Opens Up Library, Dangerous White P</title>
    <link href="http://aigamedev.com/coverage/aaai-archives"/>
    <id>http://yoursite/article/?i=f5a9abd4d76f6974eede7cbf50589cb2</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/coverage/aa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

 After months of secrecy, AiGameDev.com is finally re-opening the doors of its continuous training program for game AI professionals!  If you&#8217;re interested in the membership site, be sure to sign-up here for more information.

A few months ago, I criticized AIIDE for having a poor record this year: very few white papers were available before and after the conference itself - particularly compared to other conferences such as CIG that was featured recently.  In fact, in the same article, I encouraged authors to release versions of their papers online themselves.  This year&#8217;s AIIDE was more successful onsite than previous years, but for people not attending many papers were simply not available online.   In 2007, it was almost the other way around: the online papers and posters were widely read, but the conference didn&#8217;t quite reach the expected attendance.
Now, to the delight of both conference attendees and armchair academics, the white papers are freely available online.  The AAAI Organization has been a non-profit organization since its inception, yet it required a registration fee to access the papers online.  However, in late 2008, AI Magazine announced that it would open up its archives:
&#8220;AAAI has launched a major initiative to open up access to the technical content of its digital library in 2009. AAAI conference proceedings and technical reports will be available to the international research community, and will be widely indexed on major search and indexing engines.&#8221;
Nick Monfort from Grand Text Auto noticed this happen and blogged about it.
Here&#8217;s the content from the AIIDE Library that&#8217;s the most relevant to those of you working with artificial intelligence and game development:

2005 - 24 full papers, 6 demos, 5 invited talks.
2006 - 16 full papers, 10 posters, 9 demos.
2007 - 11 full papers, 11 posters, 5 demos.
2008 - 26 full papers, 9 posters, 7 demos.

NOTE: All links to papers from AIIDE 2008 are apparently broken.  I&#8217;ve notified the webmaster so hopefully this should be fixed soon!




Of course, stay tuned to AiGameDev.com for our trademark reviews of the best white papers from past AIIDE conferences, as we hunt down interesting and under appreciated papers that fell through the cracks!
P.S. Don&#8217;t miss the relaunch of the Members&#8217; Area this Thursday!
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #1-2 2009: 14 Stori</title>
    <link href="http://aigamedev.com/links/2009-week-1-2"/>
    <id>http://yoursite/article/?i=e58172d0ead38b0089d0cc17b61f62c3</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/links/2009-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 The weekend roundups at AiGameDev.com are back - though still a week or so behind! There&#8217;s really lots going on in the world of game AI, judging from the articles below, and more has happened since then too!  Also don?t forget our Twitter account for random thoughts&#8230;
This roundup was written by Andrew Armstrong and Alex Champandard.  If you have any news or tips for next week, be sure to email them in to editors at AiGameDev.com. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.


Procedural Narrative in Left 4 Dead

Dan Kline reviews L4D on his blog, and discusses the emergence of stories from simple mechanics:
?The AI Director?s procedural narrative doesn?t just give the respawns variety and change the pace, it provides narrative depth that the systems lack, player stories that change every time you play. It keeps the game itself from being simple, by varying these mechanics in such a way that they are always new and interesting - in a story way.?

Procedural Narrative: Left 4 Dead

JobSwarm: A microthreading framework with lockless FIFO
John Ratcliff has released a new C++ framework that aims to make multi-core and multi-threaded programming easier:
I call it a ?JobSwarm?. What it is, is a micro-threading library that can handle tens of thousands of extremely tiny jobs with almost no overhead. My goal was to make it 100% lock free. It almost is, but there is still a mutex lock when a new job is added and removed. I plan to replace this with a fully lockless FIFO.

JobSwarm: A microthreading framework with lockless FIFO

Procedural Narrative in FarCry 2



Dan Kline again discusses his experiences with Far Cry 2, and the apparent failure at experience management:
?But the procedural narrative implementation itself didn?t work for me either. Narrative doesn?t have a big impact on the game - and when that?s true it?s hard to be the first innovator . It was neat to see the responsive characters and have ?buddies? with character. But it was used more as bookends for quests rather then gameplay-developing, which made it feel like a branching tree. And there were no mechanics beyond ?quest selection? that seemed to fit back into the procedural narrative to make it feel different. Now this maybe is better towards the end of the game (I know they did a bunch of work on character barks, for example), but as I mentioned, I couldn?t get far enough to notice.?

Procedural Narrative: Far Cry 2

Decisionality Decision Trees
Freddie McMahon writes up his thoughts on expert systems versus decision trees, a good &#8220;For&#8221; and &#8220;Against&#8221; comparison:
&#8220;Procedural knowledge is about IF-THEN-ELSE logic. Decision-Trees are a natural visualization for this type of logic. Of course, knowledge cannot be contained in one Decision-Tree. So by treating knowledge as a collection of Decision-Tree objects which can be linked enables an ecosystem to be created that can cover any breadth and depth. Indeed, this ecosystem of knowledge objects can grow and evolve without constraint.&#8221;

EXPERT SYSTEMS versus DECISIONALITY DECISION-TREES

Tic-Tac-Toe Machine in Little Big Planet
User generated content brings up some rudimentary mechanical AI in Little Big Planet&#8230;
In this Little Big Planet level, you can play Tic Tac Toe against a machine. There are 2 boards. One is beatable, and one hopefully isn?t. First I show you the level, after that I show you the edit mode. You can find my level in the ?highest rated? levels. It?s called ?Tic Tac Toe? and is on the western tip of Afrika. My PSN name is Cristel. Have fun!



TCMalloc : Thread-Caching Malloc
Memory allocations can often cause many problems for AI, because some aspects often need frequent dynamic memory allocations.  One easy way around the problem is to use a better memory allocator, like this one from Google.

TCMalloc : Thread-Caching Malloc

Expressive AI: Games and Artificial Intelligence (PDF)
A paper written by Michael Mateas in 2003 on Expressive AI in video games.

Expressive AI: Games and Artificial Intelligence
Michael Mateas, 2003.
Download PDF

A Look At Modern Game AI
Slashdot discussion of a IEEE story posted previously, summing up some of the more common thoughts on the state of modern game AI.

A Look At Modern Game AI

Kurukshetra &#8216;09 - Game AI Event


Pages about an AI Game Dev event at Kurukshetra, although there is no downloadable winners the aims and API are still available for those who are interested.
Computational intelligence techniques can be said to have been combined with games for the first time in 1959, when Arthur Samuel applied a simple reinforcement learning algorithm to the board game Checkers. With no human instructions, through only playing itself and observing which sequences of moves won games and which sequences lost, and using the extremely limited hardware available at the time, the algorithm managed to learn strategies good enough to beat its inventor. Today, we are in an attempt to recreate a similar scenario. But, we need some one to play Arthur Samuel. with scripted AI leaving much to be desired from today?s games, we look, again, towards traditional Computational Intelligence/Machine Learning techniques.

Kurukshetra &#8216;09 - Game AI Event

Also is the reasoning behind it:
?We wanted the event to reflect the current trends in the Game AI development industry. It is left to the participants to be the judge of to what extent the main goal is accomplished. The trends seem to be 1) Player specific content and 2) a move away from hard-coded-rules based opponents. We chose Lunar Lander to be the test game for both problem statements. Why? Lunar Lander was one of the earliest games to use Vector Graphics. But that?s not the reason why. Lunar Lander is simple, to code and to play. And? it seemed to offer scope for hacking both problem statements.?

Game AI Development Event at Kurukshetra 09

Middleware News&#8230;
Report about NaturalMotion?s tech being ?tightly? coupled with Emergent?s engine.

Gamebryo gets morpheme integration

News on a &#8220;tool suit to offer flexible and affordable AI for games beginning development&#8221;.

Xaitment launches BrainPack AI solution

NavPower has worked its way into Namco&#8217;s development suite:
&#8220;Namco Bandai has signed up as a licensee of BabelFlux?s NavPower AI middleware. The publisher?s US studio is using the tech, which automatically generates 3D navigation meshes, on its forthcoming game based on the Afro Samurai license.&#8221;

Namco Bandai picks NavPower

Innovative Data Systems Conference Write-Up


A writeup of notes from CIDR 2009, in particular a section on data-driven game AI that can be updated in batches:
?The Cornell Data-Driven Games group pitched their language for batch specification of state update in computer games. It?s a compelling story: they point out that when a game has lots of computer-controlled characters, the game AI has large-scale batch updates between time ticks. So that logic is more simply programmed and optimized/parallelized via a data-centric language. Their language is declarative (compiles to relational algebra) but has an imperative ?skin? to make it look more familiar and Java-like. In the CIDR spirit, it?s early days for their project ? they don?t have any games implemented yet, and are still focused on simple select/project/join/aggregate queries. The argument for their specific language (over SQL, say) is currently just programmer familiarity ? they assert that game designers are allergic to SQL. I buy the argument that syntax matters. But I?m looking forward to hearing about the features they evolve for the games domain that force them to go beyond vanilla relational algebra.?

CIDR Conference Notes 1

Rockstar makes AI improvements to Midnight Club


Improvements which are not rubber-band to the AI from Rockstar now added in a patch for their Midnight Club racing game.
?The update is intended to improve the gameplay balance and AI by adjusting dynamically to user skill level. However, Rockstar have pointed out that the update does not add rubber banding to opponent cars. In fact, the patch is designed to make the game easier for novice players who have complained about the tough level of early races. Opponent cars will now screw up a little more often in green and yellow races, allowing players to progress more easily. Red races will remain difficult as ever.?

Midnight Club LA Gets AI Patch

Neural Networks - A Systematic Introduction (PDF Book)
A free PDF book is available online for free on Neural Networks by Raul Rojas:

Neural Networks - A Systematic Introduction
Raul Rojas, 1996.
Download PDF


Neural Networks - A Systematic Introduction

Automated Avatars in Second Life
&#8220;A 10 min video showing our work in creating automated avatars in Second Life. The &#8220;AI&#8221; &#8220;brain&#8221; sits outside of SL so can also drive web based avatars (eg Sitepal), and avatars in other virtual worlds. Our goal is to create an autonomous avatar within Second Life, and other virtual worlds.&#8221;




Owyl: Behaviour Tree Creation
An interesting project on Google Code, for behaviour trees.
?The goal of Owyl: provide a fast and flexible Behavior Tree framework implemented in python. Owyl trees use nested generators to iterate through your behaviors. The root of the tree always works just like a normal python iterator. If you know how to work with iterators, you know how to work with an Owyl tree. Because Owyl is small and behavior trees are easy to grasp, it?s easy to control and extend your AI behaviors.?

owyl - Behavior Tree in Python

Senior AI Programmer at KAOS Studios
Responsibilities: * Design and Develop AI and Game Play systems for the game engine within schedule * Participates in Design and Code reviews * Create systems that achieve the game design goals * Create technology that can be re-used and extended in the future * Work with other team members to identify, define and solve problems * Work with external technology as needed * Other duties as assigned

Senior AI Programmer at KAOS Studios

On Introvision&#8217;s Academic and Everyday Programmer Bot API


A report on Introvision opening their DEFCON AI API as previously reported in detail on AiGameDev.com.
?While Introversion Software seem to be genuinely interested in the academic sector for the project - they aren?t leaving out the everyday programmer or even amateurs, with calls for the ?next world destroying AI? open to anyone, with the API available for all, along with the Quickstart and Documentation, Function List, Constants and Tables and Introversion?s bot. There is also a mailing list for technical issues. The AI API will work with the Windows demo of DEFCON, which can used to test your bots against Introversion?s own. More information on the technical underpinnings of making a DEFCON bot can be found on Baumgarten?s website.?

DEFCON developers seek AI killing machine from academics

Destructoid&#8217;s Commentary on last years Videogame AI
Destructoid thinks we should be making the following new year&#8217;s resolutions as AI Developers:
?I will be honest and admit that the character A.I. is about as revolutionary and advanced as in every other game ? not very much.?

The Game Industry?s New Year Resolutions


Computer Programming and Magic: The Gathering: AI Overview

A write up of how the AI works building up complex behaviour from simple individual card AI. Check the site for full details on most of the aspects of it.
?The AI that plays cards is essentially very simple, it just randomly plays a card in his hand. Most cards have some AI code hardcoded into them. The computer will only play Wrath of God if you have a creature in play. Elvish Piper?s ability will choose the biggest creature in hand to put into play. The code in Giant Growth will only target a creature that will attack. The AI for each card is usually pretty simple, but combined together it makes the computer seem alive.?

Computer Programming and Magic: The Gathering: AI Overview

</div></summary>
  </entry>

  <entry>
    <title>Computational Intelligence and Games 200</title>
    <link href="http://aigamedev.com/coverage/2008-cig"/>
    <id>http://yoursite/article/?i=b1405a3bf45e5f1499009a382d2f6684</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/coverage/20</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
This coverage of CIG &#8216;08 was written up by Daniel Harabor, post-graduate student at The Australian National University currently pursuing is Ph.D. in pathfinding.  See the bottom of this report for details, or his blog.

Last month I was fortunate enough to attend the IEEE Symposium on Computational Intelligence and Games (CIG&#8217;08) which was held over 4 days (15-18 December) at the University of Western Australia in sunny Perth. 
For those unfamiliar with the event, the CIG series of conferences (now in its 4th iteration) has quickly established itself as a forum for academics and games industry insiders to discuss recent advances in AI and explore directions for future work. Its aims are actually not dissimilar to AIIDE (which was held a few months ago). The main difference between them seems to be that CIG has a rather strong evolution and learning flavour whereas AIIDE is more general; in the academic community the two are regarded about equal.
I was looking forward to this event because one of the keynote speakers is none other than Jonathan Schaeffer. You might have heard Jonathan solved checkers a couple of years ago but he&#8217;s also rather well known for his work on pathfinding (he co-authored the HPA* algorithm among other notable achievements).  The other keynote speakers were Penny Sweetser from 2K Australia and Jason Hutchens from Interzone (a local development house based in Perth). 
Aside from the academic track, in which over 50 papers were presented, the conference also featured a number of competitions: TORCS Car Racing, Ms. Pac-Man and the 2K Bot Prize. The latter, billed as a Turing Test for bots, garnered quite a bit of interest, due mostly I suspect, to the AUD$10,000 prize on offer for any bot able to fool 4/5 human judges playing Unreal Tournament 2004.
What follows is my summary of the event; my notes are by no means exhaustive so I&#8217;ll attempt to focus on the bits I found particularly interesting.  (Editor&#8217;s note: Links to the white papers where added when they were found.)




Day 1
The first day of the conference was a warm-up of sorts with a number of tutorials on different aspects of computational intelligence from learning algorithms to opponent modeling and player satisfaction. I think the standout session for me was Simon Lucas&#8217; talk on co-evolution and Temporal Difference Learning. TDL has long been on my never-ending &#8220;stuff-to-read-about&#8221; list and Simon is a great presenter able to clearly communicate complex ideas in a straightforward manner.
The day ended with a combined poster session and welcoming festivities. There were a number of interesting posters: Julien Kloetzer undertook a comparative study of different algorithms for solving the game of Amazons, Vukosi Marivate looked at evolving board-game agents using social learning and Stefan Wender used reinforcement learning to find city placement strategies in Civilization IV. I&#8217;m a big Civ fan so I spent a while talking to Stefan about his approach; they use the Civ scenario editor to train an offline learner that evaluates candidate locations using scoring information from the game &#8212; it&#8217;s pretty neat!

A Comparative Study of Solvers in Amazons Endgames
Julien Kloetzer, Hiroyuki Iida, and Bruno Bouzy
Download PDF


Social Learning Methods in Board Game Agents
Vukosi Marivate and Tshilidzi Marwala
Download PDF

Day 2
Jonathan Schaeffer kicked off the day with a fantastic keynote on how he and his team at the University of Alberta solved Checkers over an almost 20 year period. Along the way they solved the famous 100 year checkers position and pushed the very limits of computation and storage. According to Jonathan they actually had to stop the search for 4 years during 1997 and 2001 to wait until 64bit precision machines became commonplace. Checkers has 1020 possible positions (a rather large number!) so it&#8217;s very impressive that it was solved at all. 
Simon Lucas looked at learning rates of evolutionary and TDL algorithms. He observes that co-evolution is very slow and suggests using TDL to bootstrap the learning process.
Pieter Spronck had a paper dealing with units in a group learning formations and moving as a whole (the effect sounds similar to flocking). 
Stephen Hladky talked about estimating the positions of opponents in FPS games. His approach relies on a database of game logs (CounterStrike in this case) to figure out the probability of a player moving from one area to another. The approach seems to work well and the idea was, I thought, rather nice.
Mike Preuss discussed the use self organising maps to learn which unit was best against an opposing unit type in an RTS game. 
Raphael Stuer looked at using influence maps and flocking to prevent groups of units getting killed while pathfinding through enemy territory. In their implementation, agents path around areas influenced by strong enemy structures (like walls of towers) and plow through easy enemy structures when the group is at an advantage. Very cool!

Investigating Learning Rates for Evolution and Temporal Difference Learning
Simon Lucas
Download PDF


Dynamic Formations in Real-Time Strategy Games
Marcel van der Heijden, Sander Bakkes, and Pieter Spronck
Download PDF


Dynamic Formations in Real-Time Strategy Games
Marcel van der Heijden, Sander Bakkes, and Pieter Spronck
Download PDF


An Evaluation of Models for Predicting Opponent Positions in First-Person Shooter Games
Stephen Hladky and Vadim Bulitko
Download PDF

Day 3
Penny Sweetser from 2K Australia started the day with an interesting keynote on emergence in games in order to improve the player experience. Penny posited that emergence in games should be limited within certain restricted parameters rather than sandbox-style emergence (local rather than global emergence). The talk was actually quite broad in scope, covering alot of ground from emergent unit behaviour to narrative. 
Bobby Bryant discussed his progress in trying to evolve a visual controller for FPS shooters. The main idea involves training a genetic algorithm to recognise visual input from a low-resolution &#8220;retina&#8221; in order to create aiming behaviours for bots.
John Reede had a neat paper about using Modular Neural Nets for agent control in a realtime top-down shooter. John&#8217;s controller has two components, one for movement and the other for shooting; each trained independently of the other. The main advantage of MNNs seems to be that they can speed up the learning process significantly and evolve better fitness functions.
There were 3 competitions run during the afternoon:

Ms. PacMan (won by Marcus Gallagher)
TORCS Car Racing (won by Luigi Cardamone)
2K Bot Prize (won by a team from the Czech Republic)

I spent most of my time at the bot prize chatting to participants and spectators. Winning the major prize of the competition involved building a bot able to play Unreal Tournament such that 4 of the 5 judges are fooled into thinking they are playing a human. Unfortunately the winning entry, AMIS, did not win the major prize (only 2 of the 5 judges were fooled) but there was a minor prize on offer and nice looking trophy.
I took a few photos during the competition to try and capture the flavour:




Day 4
Jason Hutchens from Interzone Games opened the final day with a keynote about pseudo-intelligence as entertainment.  Jason&#8217;s talk centered around a major problem of AI game developers: building surprising yet relevant behaviour.  In the talk Jason posited that game AI is a Turing test where players are the judge. Learning and other emergent behaviours make this goal difficult to achieve so AI developers cheat. Jason also discussed some of the challenges faced by game developers, including tight deadlines, camera problems, terrain analysis, dynamic obstacles, spatial awareness and building better tools to debug AI.
One of the interesting papers of the day came from Marcus Gallagher who discussed his approach for winning the Ms. Pac Man competition. Marcus described a simple (but effective) system using influence maps (potential fields really) to drive Pac Man away from ghosts and towards pills.
Mark Wittkamp discussed a learning method for improving group behaviour for ghosts in Pac-Man. The idea was interesting but the overall result a little disappointing; Pac Man only dies 1/6 more often when compared to the original ghost AI from 30 years ago (using a hand-coded Pac-Man bot to train against). 

Using NEAT for Continuous Adaptation and Teamwork Formation in Pacman
Mark Wittkamp, Luigi Barone, and Philip Hingston
Download PDF

Toward the end of the conference I gave my talk on efficient pathfinding approaches for variable-size units in heterogeneous terrain environments. My paper describes HAA*, a hierarchical path planner that builds a single compact graph to represent complex multi-terrain game maps. I believe this is the first time this problem has been thoroughly studied in the academic literature. I spoke to a few game developers at the conference  who had come across this issue; it seems they solve it by storing different copies of the map: one for each agent size/terrain-traversal capability combination.  I believe HAA* should be much more (space) efficient and I hope to discuss the technique at length in an upcoming post. In the meantime, you can read the paper, take a look at my presentation slides or play around with the source code.
</div></summary>
  </entry>

  <entry>
    <title>AiGameDev.com On Tour — San Francisco </title>
    <link href="http://aigamedev.com/site/2009-party"/>
    <id>http://yoursite/article/?i=13d8be313723cf14832579f1a07d35dc</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/site/2009-p</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

First, I&#8217;d like to extend a warm welcome to new readers of the blog.  The new year always brings in fresh faces and it&#8217;s great to see growing interest in artificial intelligence and game development.  Make yourselves at home by reading the best features of the blog so far, and don&#8217;t hesitate to sign-up and drop by the forums for friendly discussions and to pick the brains of our resident experts!
In other news, pretty much all of the people behind the site will be attending this year&#8217;s GDC in San Francisco.  Petra (Mrs. AiGameDev.com) is busy finalizing the arrangements for the launch party, and we&#8217;d love to meet as many of you as possible!  So, let us know which day you would prefer the party to take place.  (Edit: Thanks to everyone who voted.  We had to make a decision to book the place, so the party will take a place on Tuesday 24th.  Be sure to let people know you&#8217;re attending on the LinkedIn event page.)

Note: There is a poll within this post, please visit the site to participate in this post&#8217;s poll.
Edit: The party will take place on Tuesday.

The party on Monday would be squeezed between the two Tutorials and Summit days, including the one for AI.  The party on Tuesday would happen the evening before the main conference starts.  Of course, if you&#8217;re a member you&#8217;ll get extra special treatment at the party :-)  Details to follow, but be sure to mark the event on Linked In.
Normal programming on the blog will resume shortly&#8230;



</div></summary>
  </entry>

  <entry>
    <title>2008 AiGameDev.com Awards for Game AI: T</title>
    <link href="http://aigamedev.com/awards/2008-results"/>
    <id>http://yoursite/article/?i=f4499e37c5e826adcb6a0c8351cec314</id>
    <updated>2009-02-12T17:30:54-08:00</updated>
    <author>
      <name>http://aigamedev.com/awards/2008</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Here are the results for the 2nd Annual AiGameDev.com Awards for Game AI, where the best games of the year are nominated and voted by professionals, enthusiasts, and researchers in artificial intelligence for games.
Best AI in a Mainstream Game
Left 4 Dead





Left 4 Dead obliterated the competition, the AI in the game standing out for multiple reasons:

As with previous Valve games, there is strong NPC interaction with comrades reacting to a massive amount of circumstances, shouting to comrades and having their own banter between themselves.
The NPC AI for the human survivors is able to help assist the PC up until the hardest difficulty, and easily take over at a moments notice for an idle player in online multiplayer. The individual zombie AI is good too, with various special zombies all being able to get to survivors wherever they are on a level, causing havoc.
The &#8220;AI director&#8221;, which works to spawn enemies and items, makes playthroughs different each time.

Here&#8217;s what readers and voters had to say:
&#8220;I think it&#8217;s obvious that Left 4 Dead should be up there. AI characters behave in believable, competent manners&#8230; the zombies have fantastic pathing AI, the bosses can be surprisingly devious, and the AI director does a fantastic job of regulating the experience.&#8221; - Ian Morrison
Left 4 Dead got the majority of the votes, with the finalists all having less, but more equal amount of votes:

Finalists: Fallout 3, Grand Theft Auto 4, Resistance 2, S.T.A.L.K.E.R.: Clear Sky

Technical Innovation in Game AI
Left 4 Dead




Left 4 Dead won a close race for Technical Innovation in Game AI, coming up against some reasonable competition from EA&#8217;s Spore. It stands out on its own as an impressive feat of technical work however with:

An impressive set of spawning and path finding technologies that allow the well-animated zombies (who look impressive when cornering!) to run anywhere in a level, chasing down survivors wherever they go.
The &#8220;AI director&#8221;, collecting together many technologies to allow the pacing of the level to change by spawning items and zombies, and doing zombie attacks at different times - providing a different playthrough each time.

Here&#8217;s what readers had to say:
&#8220;in my book they deserve an award just for *attempting* an AI director, to say nothing of really pulling it off.&#8221; - Kevin Dill
Spore was hot on the heels of Left 4 Dead, with its own achievements in procedural animation well observed.

Runner Up: Spore
Finalists: Fable 2, Far Cry 2, Star Wars: The Force Unleashed

Best AI in an Independent Game
Sins of a Solar Empire




Sins of a Solar Empire won out against the competition with it&#8217;s competitive multiplayer AI:

The AI is able to control masses of ships and plan expansion between planets, as well as retreating when in a losing battle and planning attacks against weak points in opposing empires.
Fleet AI is very good, allowing players to usually send their own strategic orders to attack an enemy planet and not have to worry about individual fleet battle tactics.

Defcon&#8217;s new AI came a close second this year, with Be the Dinosaur and Multiwinia being the other finalists.

Runner Up: Defcon
Finalists: Be the Dinosaur, Multiwinia

Most Influential Research Publication 2008
Automatically-generated Convex Region Decomposition for Real-time Spatial Agent Navigation in Virtual Worlds




The winning paper takes navigation mesh generation up to the next level, being able to automatically generate it for any given level space. From the paper:
This paper presents a new method for decomposing environments of complex geometry into a navigation mesh represented by bounding geometry and a connectivity graph for real-time agent usage in virtual worlds. This is accomplished by the generation of a well-de?ned and high-coverage set of convex navigable regions and the connected gateways between them. The focus of this paper is a new automated algorithm developed for decomposing a 2D representation of world-space into arbitrary sided high-order polygons. The DEACCON (Decomposition of Environments for the Creation of Convex-region Navigation-meshes) algorithm works by seeding a 2D polygonal representation of world-space with a series of quads. Each quad is then provided with the opportunity to grow to its maximum extent before encountering an obstruction. DEACCON implements an automatic subdividing system to convert quads into higher-order polygons while still maintaining the convex property. This allows for the generation of navigation meshes with high degrees of coverage while still allowing the use of large navigation regions, providing for much easier agent navigation in virtual worlds. Compared to the Space-?lling Volumes and HertelMelhorn navigation mesh decomposition methods, DEACCON provides more complete coverage, controllable mesh sizes, and better overall algorithmic control to desired decomposition quality with an improvement in agent navigation speed due to better decompositions.
Automatically-generated Convex Region Decomposition for Real-time Spatial Agent Navigation in Virtual Worlds shows how better results can be obtained when building navigation meshes.

Automatically-generated Convex Region Decomposition for Real-time Spatial Agent Navigation in Virtual Worlds
Authors: D. Hunter Hale, G. Michael Youngblood, and Priyesh N. Dixit
Download PDF


Runner Up: Real-Time Planning for Parameterized Human Motion
Finalists: A Cover-Based Approach to Multi-Agent Moving Target Pursuit, Planning with Hierarchical Task Networks in Video Games, The Rise of Potential Fields in Real Time Strategy Bots

What do you think about the results?  Who would have you like to see win an award? Click here to post a comment!
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #5-6 2009: 7 Storie</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/2IpsT578BJc/2009-week-5-6"/>
    <id>http://yoursite/article/?i=b9a3f4cf7d65f165c8bcc95da01b28fb</id>
    <updated>2009-02-08T21:00:48-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 Weekends at AiGameDev.com are dedicated to rounding up the interesting and relevant game AI articles from around the web.  This week&#8217;s roundup has finally caught up with 2009 and we&#8217;ll be posting them weekly from now onwards!  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget Alex&#8217;s Twitter account his random thoughts&#8230;
This roundup was written by Andrew Armstrong (site).  If you have any news or tips for next week, be sure to email them in to &lt;editors at AiGameDev.com&gt;. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Alternative To Rubber Band AI As Used In Pure





Most racing videogames only provide simple rubber band mechanisms to increase or decrease difficulty for AI drivers. The Pure developers seeked another method out, as explained in this Gamasutra article.

Gamasutra - The Pure Advantage: Advanced Racing Game AI

Paris Game AI Conference 09 on LinkedIn Events

The upcoming Paris Game AI Conference (co-organized by AiGameDev.com) was announced recently, and we&#8217;re looking for proposals, in particular tutorials about cutting edge research topics and industry talks.  If you&#8217;re interested in participating email &lt;alexjc at AiGameDev.com&gt; with your ideas.
Make sure to mark it in your diary for June 10th and 11th later this year!

Paris Game AI Conference 09

Open Game World AI for Destroy All Humans 2


Pandemic&#8217;s Destroy All Humans 2 has an open world which required suitable AI - this Gamasutra article details the data-driven AI framework used for the game, which is applicable to other open game worlds.

Gamasutra - Creating All Humans: A Data-Driven AI Framework for Open Game Worlds

xaitment Opens LA Office

xaitment, AI middleware developers, opened a new office in LA at the start of February. From the press release:
&#8220;xaitment GmbH, one of the leading AI developers for games and simulations, today announced that they have opened a new office in Los Angeles, CA in order to position themselves closer to their US customer base. In addition, they have named Markus Schneider as head of their U.S. operations.&#8221;

Xaitment opens new US office | Game Development | News by Develop
xaiment

AI Jobs
2 Game AI jobs spotted for the past 2 weeks, details are:
We are looking for a GAMEPLAY &#038; AI PROGRAMMER for our ambitious next-gen project Earth No More.

GAMEPLAY AND AI PROGRAMMER - Earth No More / Recoil Games

The AI Programmer will work closely with the Lead Software Engineer and the rest of the development team to design and program AI systems for a next-generation first-person shooter game. This entails multiple levels of AI, and touches on several topics including navigation, behaviors, group coordination, environment awareness, tactics, goal-based planning, and terrain analysis.

TimeGate Studios AI Programmer

Jeff Hawkins on Artificial Intelligence Videos
Jeff Hawkins, of Palm Computing, has done a lecture on Artitifical Intelligence that might be of interest. The description is rather optimistic, but there we go.
The founder of Palm, Jeff Hawkins, solves the mystery of Artificial Intelligence and presents his theory at the RSA Conference 2008. He gives a brief tutorial on the neocortex and then explains how the brain stores memory and then describes how to use that knowledge to create artificial intelligence. This lecture is insightful and his theory will revolutionize computer science.




The role of AI in Virtual Worlds
Ben Goertzel has a look at the use of AI in virutal worlds, the challenges and why AI agents are not implemented in many virtual worlds, as well as what he thinks will solve the problems.
There seems little doubt that in the next years, AI will make huge inroads into virtual worlds, making them more compelling and increasing mainstream acceptance. But making this vision a reality is going to require plenty of interesting work on both the AI and virtual worlds sides.

The role of AI in Virtual Worlds - CyberTech News

AI Coming to EVE Online


Slowly but surely better AI is coming to EVE Online, which might well change the game drastically for some people:
Last but not least, we are further improving NPCs by assigning advanced AI capabilities to them. Of course we are not going to assign such improvements all of a sudden to all NPCs, but rather proceed on a careful step-by-step approach which starts with the Apocrypha release. At first, only Sleepers and existing Officer spawns will receive such improved behavior and no other changes will be made to existing PvE interactions. However, with time, we might want to progressively revamp the whole face the EVE Online PVE experience by giving most NPCs clean and fresh roots to rest on.
How will they react with such a behavior? Let us just say at the moment they are going to make logical target choices depending on the most threatening targets available; but again such details are left to be explained in another Dev Blog.

When evolution leaps forward | EVE Online | Dev Blog

Fink About It » Artificial Intelligence Acting Stupid

Alex Fink writes about artificial intelligence, a good basic introduction, but more interestingly how AI is being pushed forwards by game development.
This is an informative essay about artificial intelligence. Firstly this essay will argue that artificial intelligence is nothing to be afraid about, and secondly that its development is driven by computer games. In the following I am going to explain how artificial intelligence works and how intelligence is created.

Fink About It » Artificial Intelligence Acting Stupid

Responses to the FEAR 2 Demo


The original F.E.A.R. is an outstanding example of FPS squad based AI, so the sequel has a lot to live up to. Before the reviews come rolling in, the demo released recently has had some appraisal. Here are some quotes from various blogs:
FEAR AI, it?s hard to comment on. It?s been so hyped and such a crucial aspect of the first game, I don?t know really what to say. I mean first thing I noticed was the immediate cover as soon as they see you, although that?s not uncommon in the genre by any means. Next thing I noticed was that they are pro at throwing their grenades. It?s been so long since FEAR 1 I don?t recall that game?s details too much, but it?s been a while since I recall a game with such deadly AI grenade throwing. Playing through the fire fights was definitely fun though, I guess in the end that?s all that matters.

For honor, justice, and bacon - FEAR 2 Demo

Monolith has greatly improved the AI in F.E.A.R 2 to act and feel more realistically. The general rule of thumb here is if you can do it, so can they.The AI will take cover and work as a team while they attempt to flank you. To be more specific, they will throw over vending machines, desk, tables and anything else that can be used as cover. If you find yourself burning to death, a quick jump in a puddle will put the flames out. Keep in mind the AI will do the same thing if you lite them on fire. If you expect to walk into a room and be able to see every enemy out in the open, you better think again. There were often times where the enemies will be hiding in places you would least expect, and then out of no where they come out guns a blazing.?

F.E.A.R 2 Demo Impressions

?I think FEAR, fortunately enough for Monolith, was subjected to one of games journalism?s biggest sins; The Hivemind. Like Grand Theft Auto IV?s ?Living Breathing City?, enough critics praised FEAR?s A.I. that it?s become gospel, a set-in-stone-fact that FEAR has incredible A.I. Don?t get me wrong, in FEAR 2 the enemy soldiers will flank, flush-out and use cover, but they aren?t the be-all-and-end-all of enemy intelligence in games. You?ll see soldiers flip over tables for cover, only to vault straight over them instantly.?

The F.E.A.R. 2 Demo (Or: I Took 142 Screenshots)

</div></summary>
  </entry>

  <entry>
    <title>Hierarchical Path-Finding A* Demo on a C</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/hcab5emPiSY/hpa-pathfinding"/>
    <id>http://yoursite/article/?i=8e7311966d8a6737083dc59a7f7c610a</id>
    <updated>2009-02-03T22:00:36-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 

In a previous post, I wrote about the terrain area generation algorithm that I implemented as part of the AiGameDev.com Sandbox.  That code was based on the ideas of our resident expert William van der Sterren (his site).  The areas, even those generated by a simple algorithm, are very useful for speeding up most types of terrain operations&#8230; including navigation.  See our sample terrain analysis reports for more information about this.
Over the last month, Jad Nohra (programmer and contributor) has been adding hierarchical pathfinding to the codebase.  This work is based on the HPA* algorithm which I covered previously on the blog.  In the video below, you&#8217;ll see a 2D approximation of a popular Counterstrike map de-dust as a 64&#215;64 grid, which has areas generated and searched hierarchically to find paths between two points.

Note: If you&#8217;re an AiGameDev.com Member, you will be able to get access to this demo and the code (plus a few bug fixes and improvements to the area generation) at the end of the week.  If you&#8217;ve not signed up yet you can join here for another day and a half!











The video goes through the following phases:

Areas are generated using the same algorithm as the previous post.  This algorithm wasn&#8217;t explained publicly, but feel free to guess how it works!  (It&#8217;s relatively simple.)
Connections between the areas are identified and used to setup a high-level graph that can be searched.
The user selects a set of points: source (white) and target (red, a bit hard to see) in the world and the HPA* pathfinder is engaged.
The set of connections being searched are displayed in orange, and the active connections are displayed in yellow while the algorithm is running.
Once the path is found, the final path on the low-level is displayed in white.

If you have any questions, feel free to post them!  If you&#8217;d like to see the code at the end of the week, feel free to sign-up. :-)  And big thanks once again to Jad Nohra for his hard work.
</div></summary>
  </entry>

  <entry>
    <title>Game AI Roundup Week #3-4 2009: 17 Stori</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/6dxeiooUAl0/2009-week-3-4"/>
    <id>http://yoursite/article/?i=daddd4a82c314f97e96de1ae4d9402b2</id>
    <updated>2009-02-03T08:00:50-08:00</updated>
    <author>
      <name>http://feeds.aigamedev.com/~r/Ai</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
 The weekend roundups at AiGameDev.com are almost back to normal! There&#8217;s still a lot going on in the world of game AI, judging from the articles below.  The big news on the site this week is the re-opening of the Members&#8217; Area and its continuous training program (finally!); you have slightly over two days left to sign-up.  Be sure to swing by The Game AI Forums for some stimulating discussion, and also don?t forget our Twitter account for random thoughts&#8230;
This roundup was written by Andrew Armstrong and Alex Champandard.  If you have any news or tips for next week, be sure to email them in to editors at AiGameDev.com. Remember there?s a mini-blog over at news.AiGameDev.com (RSS) with game AI news from the web as it happens.
Automatic Game Rule Creation



Julian Togelius sent in a blog post about an interesting presentation he gave at at the recent CIG conference, titled &#8220;An Experiment in Automatic Game Design.&#8221;
?What we?re trying to do is search a space of game rules for rule sets that constitute fun games. This immediately raises two questions: how do you define and search a space of game rules, and how can you measure whether a game is fun??

Automatic Game Design

Aleks Krotoski at The Guardian Gamesblog also picks up on the story with her own commentary.
?This week, our interest is piqued by reports of a game developed without human intervention. Julian Togelius, a postdoc researcher in Artificial Intelligence at the Dalle Molle Institute for Artificial Intelligence in Switzerland, has aimed to create a machine that generates a game based on ?meta-rules?, with the aim of creating something - automatically - that is, well, fun.?


Game that develops itself could save industry

Finally, Slashdot has a discussion on the piece, with some comments.

Can We Create Fun Games Automatically? Slashdot discussion

Conference News
We&#8217;ve got information on a upcoming GDC presentation on multithreaded AI from Intel&#8217;s blog:
?I am going to give a presentation about multithreaded AI at GDC this year. We will examine how AI can be threaded and live in a highly parallel environment. How can you thread AI? How can AI talk to physics running on another thread or device? Is deferred processing worthwhile? Do you have to thread your designers? My presentation will hopefully answer these questions and more. The presentation will end with a quick overview of Intel?s Smoke demo; Smoke is a n-way threaded framework that includes source code for highly parallel AI.?

Intel Software Network Blogs » Threaded AI: FTW


Also, AIIDE-09 calling for speakers and the previously noted AAAI conference proceedings are online if you missed the previous news.

AIIDE-09 calls for speakers
AAAI conference proceedings

MIT Lectures: Shortest Path Algorithm
 
A set of three videoed lectures with details, all to do with shortest path algorithms. The first one is above, and covering a wide range of typical solutions:
This is the twelfth post in an article series about MIT?s lecture course ?Introduction to Algorithms.? In this post I will review a trilogy of lectures on graph and shortest path algorithms. They are lectures seventeen, eighteen and nineteen. They?ll cover Dijkstra?s Algorithm, Breadth-First Search Algorithm and Bellman-Ford Algorithm for finding single-source shortest paths as well as Floyd-Warshall Algorithm and Johnson?s Algorithm for finding all-pairs shortest paths.


MIT?s Introduction to Algorithms, Lectures 17, 18 and 19: Shortest Path Algorithms - good coders code, great reuse

An Introduction to Computer Go
Another learning resource, if you&#8217;re interested in Go as a technical AI problem, this is a good starter for learning about the field of using AI to play Go.

An Introduction to the Computer Go Field and Associated Internet Resources

The Creator of Creatures Hints His New Work
Creatures creator Steve Grand is noted as being back with this article on his work on biologically based AI called &#8220;Grandroids&#8221;.
?You may not have heard from Steve lately, but he has been busy?both in artificial life and robotics. Sim-biosis, his underwater life-form simulation is well underway, while his Graindroids project involves building a series of intelligent robots for rent, as crowd pullers in public events and trade shows. His first robot is a five foot tall humanoid female called Grace.?

Steve Grand is back!

Middleware News


Autodesk reveals their plans for Kynogon that they brought previously&#8230;
?What we?re focusing on is a complete solution for believable characters and that will run from art packages to runtimes,? enthused Michel Kripalani, Autodesk?s senior games industry manager. ?With the next generation of gaming platforms, the focus is going to be on runtime simulations. Of course, art tools are also becoming more tied into physics and AI, and while we already had the HumanIK technology, we wanted a complete team that could develop, market, sell and support middleware.?

Autodesk?s plans for Kynogon tech revealed

&#8230;morpheme 2.0 has also been released, which boasts NVIDIA PhysX integration&#8230;
&#8220;?With morpheme 2.0, we have developed a method to give programmers and animators much more targeted and differentiated control over physics and animation. It is now possible to add arbitrary physics modes to different parts of the same body ? all graphically.?

morpheme 2.0 now available

&#8230;and finally Alice McGee&#8217;s Grimm is noted to use AI Implant to render behaviours precisely.
?AI implant proved to be essential to getting the AI of our NPCs right. All the NPCs in Grimm have very specific behaviors, and using AI Implant enabled Marwin, our Technical Level Designer, to make those NPCs behave the way they should. He could do this without having to bug the programming team to code new behaviors every time we came up with new requests for NPC AI. This greatly improved both speed and efficiency, and allowed the programmers to focus on all the other tasks at hand.?

Postmortem: American McGee?s Grimm

AI on your GPU

NVIDIA and ATI went on a PR drive to associate AI development with the GPGPU.
?Nvidia?s director of product management for PhysX, Nadeem Mohammad, agrees,telling Custom PC that ?all the simple, complex operations? involved with path finding and collision detection ?are all very repetitive, so path finding is one of the algorithms which does work very well on CUDA.? ?You can always imagine CUDA as loads of processors running the same program but not the same instruction, and ideally on the same data set but with different input parameters,? says Mohammad. ?So, in the context of AI, the data set consists of the whole game world, and the parameters going into it are the individual bots ? that?s one way of neatly parallelising the problem. If you look at it in that context then any AI program could be accelerated.?
The idea of GPGPU-accelerated AI is also appealing to game developers. ?I think there?s a lot of potential for GPU acceleration to benefit AI,? Relic?s senior programmer on Dawn of War II, Chris Jurney, told Custom PC, ?all our AI is grid based, and we?re already using rasterisation to keep our maps up to date, and for line-draws on those maps to test for passability, so it?s a great match.?

Nvidia and AMD to accelerate gaming AI on GPUs

Kokatu raises the point that there is no standardisation on this with ATI, so might be less useful then first expected for most developers.
?Only problem we can see - and it?s a big one - is whether ATI and Nvidia would bother to actually standardise this, or whether we?d end up with two competing solutions that would split the developer community and make the whole thing a royal pain in the ass.?

PC: First Physics, Now AI Is Being Moved To Your Graphics Card

Videogames as Emotional Simulators?


Earnest Adams has an interesting, if somewhat shallow, article on his thoughts on if games can be realistic emotional simulators (taking examples as Facade above into account).

Gamasutra - The Designer&#8217;s Notebook: Numbers, Emotions, and Behavior

Far Cry 2, NPC reactions
Gamasutra&#8217;s Far Cry 2: Looking Back, Looking Forwards article has some details on the design decisions around NPC reactions.
Question: Though obviously you stressed they?re totally different games, Fallout 3 and Fable II both also have systems that modify NPC reaction to the player based on in-game actions. But In those games, they explicitly set a plus or minus score that occurs at the time you perform an action. In yours, the player isn?t really aware of it unless they look for it.
Answer: [?] But it?s not clearer that any one of those measures would have significantly improved it. I think that maybe it?s the wrong issue. For us, it would have been asking the wrong question, because instead what we should be trying to do is seek out those values, those metrics, in the game that are easy for a player to parse just by using their senses. Just by hearing, you?ll see the way the AI is behaving ? just by hearing the dialogue, and just by seeing the way the game world alters itself.

Gamasutra - Beyond Far Cry 2 : Looking Back, Moving Forward

AI NodeGraphs in Half Life 2 Developers Commentary (0:50)
For everyone who&#8217;s not found it in Half-Life 2, here is the video containing the directors commentary on AI NodeGraphs in Half Life 2.




Behavioral Mathematics for Game AI
Dave Mark&#8217;s book Behavioral Mathematics for Game AI is available to pre-order, check out the blurb below to see if it looks to be your fancy for helping improve your AI skills.
?Perfect for intermediate to advanced game programmers, this book shows readers how to use AI programming tools and techniques to create more realistic and interesting behaviors in video games. Readers are shown various ways of using statistics, formulas, and algorithms to create believable simulations and to model behavior. Additionally, the book introduces a number of tools that can be used in conjunction with standard AI algorithms to make it easier to use the mathematical models.?

Behavioral Mathematics for Game AI (Book)

Godfather 2&#8217;s AI Families


Finally, a quote to end the roundup - John Calhoun promises AI run rival families with personalities like real people, we&#8217;ll see if this game crops up more with proven AI when it&#8217;s released.
?Another cool technical innovation is the AI that runs the strategy game. While you?re playing the game, so are the five rival families you?re up against. Their actions are driven by a system that mimics playing against real people. (In fact, the rule set is derived from a table-top card game we developed!)
These families have personalities - some are vindictive, some are defensive, and some are downright devilish. When they come after you, you?ll realize that their decisions aren?t random. They?re pretty smart, and they know how to hit you where it hurts the most!?

Interview: Godfather II

</div></summary>
  </entry>

  <entry>
    <title>Using Potential Fields in a Real-time St</title>
    <link href="http://feeds.aigamedev.com/~r/AiGameDev/~3/4QUuyYEF-Uo/potential-fields"/>
    <id>http://yoursite/article/?i=390a7c8f580365b827ed5c8af83546c2</id>
    <updated>2009-02-03T00:24:23-08:00</updated>
    <author>
      <name>c10cde8c87b050a44b736dcbea316ba6</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Copyright &#0169; AiGameDev.com, 2009. 
Editor&#8217;s note: This in-depth article was submitted by Johan Hagelbäck, lecturer and Ph.D. researcher in adaptive game AI.  If you&#8217;d like to join Johan and myself (Alex J. Champandard) for a live online masterclass (public) on Wednesday, February 4th at 21:00 CET Europe, 15:00 East Coast, then go to live.aigamedev.com for more details.  You&#8217;ll learn about the key concepts in this tutorial, but also learn how potential fields fit in with high-level AI strategy, dynamic navigation in crowds, and optimizing traditional pathfinding. (These sessions are normally for members only, so don&#8217;t miss it!)

Bots for RTS games may be very challenging to implement. The bot controls an often very large number of units that will have to navigate in a large dynamic game world, while at the same time avoiding each other, searching for enemies, defending own bases, and coordinating attacks to hunt the enemy down. RTS games operate in real-time which can make planning and navigation difficult to handle.
This is a tutorial about an unconventional planning and navigation method that uses multi-agent potential fields. It is based on the work we have presented in [1, 2, 3].  (See the bottom of this page for the white papers references, and links to the corresponding PDF files for download.)
What is a Potential Field?
PF&#8217;s has some similarities with influence maps. Influence maps are often used to decide whether an area in the game world is controlled by own or enemy units, or if it is an area currently not under control by any forces (no man&#8217;s land). The idea is to put a positive numerical value on the tiles currently under control by own units, and a negative numerical value on the tiles controlled by the enemy. By letting the numerical values gradually fade to zero we can create a map displaying the influence own and enemy units has in an area. Figure 1 shows an example of an influence map with one own and one enemy unit.


Figure 1: Influence map showing the areas occupied by own units (red) and enemy units (blue). White areas are no man&#8217;s land.


Potential fields work in a similar manner. The idea is to put a charge at an interesting position in the game world and let the charge generate a field that gradually fades to zero. The charge can be attracting (positive) or repelling (negative). Note that in some literature about potential fields negative charges are attractive and vice versa. In this tutorial positive charges are always attractive. Figure 2a-c show a simple game world with some impassable terrain (brown), an enemy unit (green) and a goal destination for the unit (E). An attractive charge is placed in the destination position (figure 2a), the charge generates a field that spreads in the game world (figure 2b) and fades to zero (figure 2c).


Figure 2a: An attractive charge (E) is placed in the destination for an own unit (green).



Figure 2b: The charge generates a field that spreads in the game world. Light blue areas are more attractive than darker blue areas.



Figure 2c: The field have spread throughout the game world and gradually fades to zero.

Navigation using Potential Fields
In Figure 2c an attractive field is spread around the destination point E. The idea is to let the green unit move to positions with a more attractive value and in the end find a way to its destination. To make this work we also need to deal with obstacles in the game world, in this case the mountains (brown areas). If we let the mountains generate small repelling fields, and we sum the fields with the attractive field from Figure 2c we get a total field which can be used for navigation (Figure 3). Since units always move to the adjacent position with the highest attractive value it will avoid mountains if other paths are available.


Figure 3: Repelling fields generated by mountains has been added.

The same idea is used for other obstacles. In Figure 4 two own units (white) are added. They generate small repelling fields which again are summed to the total field. Our green unit will then move around other units to avoid collisions. Now we have a final path for our unit (figure 5).
The unit can navigate from its current position to a destination and avoid obstacles without using any form of pathfinding algorithm.


Figure 4: Two own units added. They generate repelling fields for obstacle avoidance.



Figure 5: The final path for our unit (green).

Benefits of Using Potential Fields
One of the most important advantages of using potential fields is its ability to handle dynamic game worlds. Since units (agents) only have a one step ahead approach
instead of generating a long path from A to B there is no risk that a path becomes obsolete due to changes in the game worlds. Pathfinding in dynamic worlds can often
be complex to implement and require a lot of computational resources, and a lot of research has been done in this area. When using a potential field based solution the problem is solved automatically. Of course one need to take care when implementing the PF system to make updates of the potential fields as efficient as possible. (More about that later).
Another major advantage is the ability to create quite complex behavior by simply playing around with the shape of the generated fields. Instead of a linear field fading to 0, we suggest the use of non-linear fields. If we for example have ranged units like tanks in our army, we don&#8217;t want the tanks to move too close to an enemy unit but instead surround it at an appropriate distance (for example maximum shooting range of its cannons). This behavior can be created by putting a 0 charge at the enemy unit position, generate an increasing field with the most attractive value at maximum shooting distance, and then let the field fade to 0. Figure 6 shows an example of two tanks (green) moving in to attack an enemy unit (red) generating a non-linear potential field. Equation 1 shows an example equation of how this type of field can be generated.


Figure 6: Example of a non-linear field generated by an enemy unit (red). Own units (green) surround the enemy at an appropriate distance.



Equation 1: Example of a non-linear field used to create a surrounding behavior around enemy units. The weight w1 is used to alter the relative strength of the field at runtime. D is the maximum shooting distance, and R is the maximum detection range (the distance from which an agent controlling an own unit detect an enemy unit at).

Another behavior that is simple to implement is attack-and-retreat. A unit moves to attack an enemy unit from maximum shooting range (Figure 7a). After the attack our unit have to reload its weapon and retreats from the enemy until it is ready to fire again (Figure 7b). In the retreat phase all enemy units generate strong repelling fields with the radius of maximum shooting range of the unit. This is an example of how specific potential fields can be active or inactive depending on the internal state of an agent controlling a unit. An inactive field is simply ignored when summing the total potential field.


Figure 7a: A unit (green) moves in to attack an enemy unit (red) from maximum shooting range.



Figure 7b: After an attack the unit (green) have to reload its weapon and retreats from the enemy (red). In this phase enemy units generate a strong repelling field that overrides a part of the attractive field.

Figure 8 shows a screenshot from our potential field based bot for the ORTS engine. The left side of the figure shows a 2D view of the current game state. It shows our tanks (green circles) move in to attack enemy bases (red squares) and units (red circles). The brown/black areas are impassable terrain (mountains). The right side of the figure shows a potential field representation of the game state. As in other figures in this tutorial light blue areas are the most attractive. The white/gray lines are attacks from own tanks. The PF view clearly shows how own units surround the enemy at maximum shooting range while at the same time avoiding collisions with each other and terrain. The behavior of surrounding the enemy worked very well and was probably one of the key things behind our success in 2008 years&#8217; ORTS tournament.


Figure 8: Screenshot from our PF based ORTS bot. Left side is a 2D view of the current game state, right side shows the potential field representation of the game state. The blue circles are neutral units called sheep. They are moving randomly around the map to make pathfinding more complex. (Click to view full size.)

One thing we discovered while developing the ORTS bot was the totally different behavior when summing the potentials enemy units generate in each point compared to just using the highest potential an enemy unit generates in a point. In Figure 9a the potentials generated by the three enemy units are summed and added to the total potential field. By doing this the highest total potential is in the center of the enemy unit cluster (shown with a red ring) and our units were very keen to attack the enemy at its strongest points. The solution was to not sum the potentials, but instead take the highest potential generated by an enemy unit in a point (Figure 9b). In the latter case the highest total potential is a front at an appropriate distance from the enemy (shown with red lines).


Figure 9a: The potentials generated by enemy units are summed. The most attractive region is in the center of the enemy unit cluster.



Figure 9b: Only the highest potential generated by an enemy unit is added to the total field. The most attractive region is a front surrounding the enemy.

Notes about the Implementation
With careful design and implementation of the PF system the computational resources needed does not have to exceed a traditional A* based solution. Our ORTS bot used least CPU resources in a comparison with 2 other pathfinding based bots from 2007 years&#8217; tournament. We must however stress that it is hard to exactly measure the CPU usage due to the fact that the winning bot use more resources at the end of a game since it have more units left to control. Threading also made it complex to measure CPU resources used. The comparison were conducted by comparing the total CPU resources used be each client process in a Linux environment over 100 games. We can at least draw the conclusion that the bot was well within the margin of the frametime of 0.125 sec used in ORTS.
To improve performance we divided the potential fields into three categories:

Static field. Fields that are static throughout a game, in our case the terrain. This field is genererated at startup.
Semi-static field. Fields that doesn&#8217;t require frequent updates. In our case own and enemy bases. This field is generated at startup and only updated if a base is destroyed.
Dynamic field. All dynamic objects of the game world such as own and enemy tanks. This field is updated every game frame. For shorter frame times updates for example every 2:nd or 3:rd frame might be more suitable.

We experimented with two main architectures for generating the potential fields&#8230;
Pre-generation
The field generated by each object type was pre-calculated and stored in static matrices in a header file. At runtime the pre-generated fields were simply added to the total potential field at correct position. To make this feasible the game world had to be divided into tiles, in our case each tile consisted of 8&#215;8 points in the game world. This approach proved not to be detailed enough and the bot performed badly (2007 years&#8217; ORTS tournament). Since the game world was divided into quite large tiles we had problems deciding which tile(s) an object occupied. Consider the unit (orange circle) and base (orange square) in figure 10. Which tile(s) (grey squares) are occupied by the green unit, and which tiles shall be used as boundaries for the base?
This approach can be suitable for games like Wargus which uses a less detailed tile-based navigation system.

 

Figure 10: A unit (orange circle) and base (orange square) are placed in a grid representation of the game world. Which tile(s) are occupied by the unit and base?

Runtime Calculation
The potentials generated in a point are calculated at runtime by calculating the distance between the point and all nearby objects, pass each distance as a variable to a function and then calculate the generated potentials. This approach actually used less CPU resources in our bot than pre-generated fields
due to:

We only calculated potentials in points that are candidates to move to by unit(s). In the pre-generated approach the potentials for the whole game world were
calculated (of course this can be optimized in the same manner).
By first estimating the distance to an object with a quick Manhattan distance calculation, we could skip costly Euclidean distance and potential calculations for a large portion of the objects in the game world.

This approach was used in the second version of our bot (2008 years&#8217; ORTS tournament). Equation 2 shows an example of a potential field equation (with 2D and 3D graphs) used to calculate the potential a cliff generates in a point with the distance a from the cliff.

 


Equation 2: The equation (with 2D and 3D graphs) used in our bot to calculate the potential generated by cliffs at distance a.

What about the Local Optima Problem?
One of the most common issues with potential fields is the local optima problem. Figure 11a shows an example where this problem arises. The destination E generates a circular field that is blocked by a mountain. The unit (green) move to positions with higher potentials, but end up in a position (as shown in the figure) where the highest potential is where the unit currently stands. The unit hence get stuck.


Figure 11a: The local optima problem. The potential field generated by E is blocked by a mountain and the unit (green) is unable to reach its destination.

We solved this by using a trail similar to a pheromone trail as described by Thurau et al. in [4]. Each agent controlling a unit adds a trail at the last n positions visited by the unit, as well as the current position of the unit. The trail generates slightly repelling potentials and &#8220;pushes&#8221; the unit forward. Figure 11b shows how the trail pushes the unit (green) around the local optima (yellow path) and the unit are able to find a path to its destination.


Figure 11b: The trail (yellow) pushes the unit around a local optima.

Even with trails there is a risk that units get stuck in situations as shown in Figure 12a. This can be solved with convex filling of gaps (see Figure 12b).


Figure 12a: A unit (green) can get stuck in the gap in the mountain.



Figure 12b: Convex filling can solve this problem.

Summary
Below we list a number of criticisms against potential field based solutions and our point of view:

PF&#8217;s have issues like local optima that are difficult to solve. With the use of trails most local optima can be solved. PF&#8217;s still have problems in very complex terrain, but in those cases pathfinding based methods are better suited. The strength of PF&#8217;s are in large dynamic worlds with large open areas and less complicated terrain. This is the case for many RTS games of today.
PF based solutions use too much resources. We have in our work shown that PF based solutions can be implemented with the same or better resource efficiency as pathfinding based methods. More work in other environments has to be done to back up this statement. Efficiency can still be a problem, but that can often be the case in pathfinding based systems as well.
PF based solutions are difficult to implement and tune. PF&#8217;s can be implemented with very simple architectures. Tuning can be difficult and time consuming, but the relative importance between the fields is a great help here (i.e. is destroying a base more important than destroying units?). A graphical representation of the potential field view as the one shown in Figure 8 is also valuable. There is however a need for better tools and methodologies to aid in this matter.

After my talk on AIIDE 2008 I got some interesting comments and ideas. Brian Schwab pointed out the possibility of using the GPU to further improve the performance of field generation. I have not been able to investigate this in more detail mostly due to my lack of knowledge in GPU programming. If anyone knows about an easy framework for this feel free to contact me. Chris Darken came up with an idea of combining pathfinding and potential fields to benefit from both worlds. Pathfinding could for example be used to move units over large distances, while potential fields could be used when engaging the enemy. The idea sounds interesting and I hope I&#8217;ll be able to try it out soon.
We believe that potential field based solutions can be a successful option to more conventional pathfinding based solutions. After a mediocre ORTS tournament 2007, some tactical and technical problems were addressed and solved and a new bot version was created. In experiments this bot won over 99% of the games against the four top teams from 2007 years&#8217; ORTS tournament (see Table 1). The bot also won 98% of the games in 2008 years&#8217; tournament, but we must point out that the number of participants was very low. This was quite an improvement from ending at 6:th place of 9 participants in 2007.  The results from 2008 can be found on the tournament webpage.




OpponentTeam
Win %(100 games)
Avg units left(of 50)
Avg bases left(of 5)


NUS
100%
28.05
3.62


WarsawB
99%
31.82
3.21


UBC
98%
33.19
2.84


Uofa.06
100%
33.19
4.22


Average
99.25%
31.56
3.47



Table 1: Experiment results from our PF based bot against the four top teams from 2007 years&#8217; ORTS tournament. Our bot won 99.25% of the games with an average
of 31.56 units left after each game (both teams start with 50 units) and 3.47 bases (both teams start with 5 bases).

In a working paper we show that PF based bots can handle complex scenarios such as a full RTS game including fog-of-war, resource gathering, exploration, base building and a simple tech tree. The work might be a scope for a second part of this tutorial. We have also experimented with runtime difficulty scaling and tests conducted by human players.
We are interested in investigating PF based approaches in other RTS environments and we have done some initial testing on the Wargus platform. I gladly accept suggestions on other platforms.
References

Using Multi-agent Potential Fields in Real-time Strategy Games
Johan Hagelbauck and Stefan J. Johansson
International Conference on Autonomous Agents and Multi-agent Systems (AAMAS), 2008.
1. Download PDF


The Rise of Potential Fields in Real Time Strategy Bots
Johan Hagelbauck and Stefan J. Johansson.
Proceedings of Artificial Intelligence and Interactive Digital Entertainment (AIIDE), 2008.
2. Download PDF


A Multiagent Potential Field-Based Bot for Real-Time Strategy Games
Johan Hagelbauck and Stefan J. Johansson
International Journal of Computer Games Technology, 2009.
3. Download PDF


Learning Human-like Movement Behavior for Computer Games
C. Thurau, C. Bauckhage, and G. Sagerer
International Conference on the Simulation of Adaptive Behavior (SAB), 2004.
4. Download PDF

About the Author
Johan Hagelbauck is a Ph.D. student and lecturer in adaptive game AI at Blekinge Institute of Technology, Sweden. You can visit his webpage or contact him at jhg[at]bth.se.
Editor&#8217;s note: If you&#8217;d like to join Johan and myself (Alex J. Champandard) for a live online masterclass (public) on Wednesday, February 4th at 21:00 CET Europe, 15:00 East Coast, then go to live.aigamedev.com for more details.  You&#8217;ll not only learn about the practical details behind this article, but also how potential fields fit in with high-level AI strategy, dynamic navigation in crowds, and optimizing traditional pathfinding.  Similar sessions are run weekly as part of AiGameDev.com&#8217;s membership site, so don&#8217;t miss this free event.
Feel free to also post questions or feedback in the comments below.
</div></summary>
  </entry>

  <entry>
    <title></title>
    <link href="http://gutsdev.blogspot.com/2004/09/heres-doomguy-with-modified-head-in.html"/>
    <id>http://yoursite/article/?i=7dd2b2c4c626b58b7863d8bc3cb74478</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here's the doomguy with a modified head in a cut scene.  </div></summary>
  </entry>

  <entry>
    <title>Your own head in Doom 3</title>
    <link href="http://gutsdev.blogspot.com/2004/09/your-own-head-in-doom-3.html"/>
    <id>http://yoursite/article/?i=54baac6dcbbe20e226fe565e6ff553da</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here's something amusing to try: putting your own head on the Doom guy. Extract the file playerhead.tga from pak002.pak.  Take some digital pictures of your own head (or someone else's), straight from the front looking into the camera and from the side. Make sure you have good lighting, it's best if there are no shadows.

Now using these photographs, create a texture map that is aligned with the playerhead texture. Make sure the eye, mouth and ear are at the right place.  In Photoshop, the liquefy tool comes in very handy here and you can use the original texture as a semi-transparent layer for guidance. Of course, that's going to distort your features. Hopefully your head shape is not too dissimilar from the doom guy. Use the clone tool and smudge tool to fill in the gaps.

Now extract playerhead.dds from pak001.pak and paste your new texture in there. The DDS format supports mipmapping by including smaller versions of the image to use at greater viewing distances.  The smaller textures also need to be replaced.

Then put the modified playerhead.dds into pak001.pak. You may want to make a backup first. Extracting and inserting is perhaps easier if you temporarily rename the pak file to zip while you're doing this. You may also want to replace the playerhead.tga in pak002.pak, I think that's only used in ultra quality mode.

If you start the a new game you should be able to see your own head in the mirror in the bathroom near the kitchen and also in the cutscenes.


</div></summary>
  </entry>

  <entry>
    <title></title>
    <link href="http://gutsdev.blogspot.com/2004/09/scary-head.html"/>
    <id>http://yoursite/article/?i=924250d2428362bcd731e37d0c4e580e</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Scary head </div></summary>
  </entry>

  <entry>
    <title>Got Normal Mapping working...</title>
    <link href="http://gutsdev.blogspot.com/2004/09/got-normal-mapping-working.html"/>
    <id>http://yoursite/article/?i=0d1ae20670c1c7ba296025433f6a6aa1</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Writing and debugging GLSL programs is a lot harder than you might expect. A typical vertex or fragment program is only perhaps 10 or 20 lines, but it took me ages to get my normal mapping shader working correctly.

The C-like syntax is of course easy and the new keywords aren't that difficult to understand either. One thing that you need to be very aware of, though, is to keep track of which variables are in which space. Variables can be in object space (=modelling space), world space, eye space, clipping space and, when you're doing tangent-space Normal mapping, tangent-space (= surface space). For my normal mapper I needed the light position, eye position and vertex position in model space and then converted these to tangent-space via a TBN matrix.

And of course it's hard to debug these little programs. You can't step through them in a debugger and you can't insert printf statements, because they're all executed on the GPU. Here's a debugging tip: it's sometimes useful to output intermediate values via gl_FragColor. For example, the incoming texture maps to make sure you're passing the correct textures. Or the light vector to tell whether it's pointing to the light (and that it stays pointing to the light when your viewing angle changes).

But anyway, I've got the normal mapping working now for Doom 3 models. The texture with "_local" extension is used as the normal map and the "_d" texture is used as diffuse map.
Adding the specular map ("_s" extension) was a piece of cake.

Here is a shot of pinky which highlights the added detail that is not in the mesh itself.


Pinky under red specular lighting 

</div></summary>
  </entry>

  <entry>
    <title>GLSL support</title>
    <link href="http://gutsdev.blogspot.com/2004/09/glsl-support.html"/>
    <id>http://yoursite/article/?i=1e54f3daa3c5e34497da35cdf6e7d9f8</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been holding off vertex and pixel shader support for a long time.  I had already added materials, such as used in Quake 3.  These allow for texture blending, alpha testing, animated textures and lots of tricks.  But the technology du jour must surely be pixel shaders.  And for a lot of cool effects, pixel shaders (a.k.a. fragment shaders) are the way to go.

There are quite a few competing technologies for this at the moment: Cg, ATI's ARB extensions, HLSL, GLSL and some more.  No doubt, a few of these will be disappearing soon. I don't have experience with any of them, but GLSL looked the most attractive to me at this point.  It's vendor independent, it's very similar to C rather than to assembly and it's directed at OpenGL. In fact, it has been officially included in the OpenGL 2.0 standard, just a few days ago I believe.

Incorporating GLSL into an existing engine has been remarkably easy.  I can now run GLSL sample shaders after two evenings of coding.  The tutorials and code at clockworkcoders.com has been very useful. Both for understanding how to write (simple) shaders and providing samples as for demonstrating what (C++) code you need to make this work.  (Beware though for a terminology mixup in the code with regard to GLSL terminology: program objects are modeled by a class called ShaderObject and shader objects are called ShaderProgram). There are some good resources at ATI, Nvidia and 3dlabs.

From an engine user standpoint the shaders appear as an extension of the existing (Quake 3 like) materials technology.  Some new keywords were introduced which you can use in a material definition to load vertex and pixels shaders and set uniform variables. ("Uniform" variables, in GLSL jargon, are parameters that are passed from the application to the vertex or fragment shader. Another type, "varying" variables, are passed from the vertex shader to the fragment shader. Another type, "attributes", are passed from application to vertex shader per vertex)

I've now got a demo running with shaded teapots using all the shaders from the tutorials  at clockworkcoders.com except the multi-textured one (tut 8).  Adding multi-texturing shouldn't be so hard.  More challenging will be to add attributes, i.e. extra values which are passed for each vertex.  Specifically to do it in such a way you won't need to change the engine when you want a new effect.  Yet for Normal mapping, we'll be needing this feature because the application will need to provide a tangent (and perhaps a binormal) per vertex.



</div></summary>
  </entry>

  <entry>
    <title>Doom 3 models</title>
    <link href="http://gutsdev.blogspot.com/2004/09/doom-3-models.html"/>
    <id>http://yoursite/article/?i=ed38cf642b0a8445a6a28981a5fa4d22</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is an exciting point in the development of GUTS, my home-brew game engine.

Last week, I added support for the animated models in the Doom 3 file format (md5mesh and md5anim). I got most of the information I needed from the forums at doom3world.org and from looking at the files themselves. They're fairly similar to the Milkshape ascii format, which was already supported. I can now load the meshes and the animations, you don't even need to extract them from the .pk4 file. The addlibrary command can be used to add a zipped archives (which is what pk4 files are, just like the pak files in Quake) to the search path. I've added a short overview of the technology and a demo for download to the website.

What is not implemented yet is the Normal mapping, which gives Doom 3 models such extraordinary detail. But I'm working on it....
</div></summary>
  </entry>

  <entry>
    <title>My first blog....</title>
    <link href="http://gutsdev.blogspot.com/2004/09/my-first-blog.html"/>
    <id>http://yoursite/article/?i=f9555a3e1aef6b69f6dad6ffe51b0e15</id>
    <updated>2008-05-20T03:30:18-07:00</updated>
    <author>
      <name>http://gutsdev.blogspot.com/2004</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Alrighty... Let's see how this blog thing works.  I type in some rubbish here and pretty soon it will be for all the web to see. Ah, the advances of modern technology....
</div></summary>
  </entry>

  <entry>
    <title>Long time, no see</title>
    <link href="http://cliniq2d.blogspot.com/2008/08/long-time-no-see.html"/>
    <id>http://yoursite/article/?i=24a7d6424d5fe9e37013e146dd6c0c21</id>
    <updated>2008-08-06T14:00:32-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It's been quite a while since I posted an update on here, so I thought it was about time I tapped something in.I graduated a couple of weeks ago. I didn't get a first in the end, I was uncomfortably close. I did however win runner-up prize for best Computer Science dissertation with "Cliniq2D" (I got a cheque for £50 and a certificate from the British Computer Society), I got an overall mark of just over 86% in the end. Can't grumble.I've been at Zoe Mode a couple of months now, and I'm well settled in. Games programming as a career has turned out to be just as fun as doing it in my spare time. The hours work well for me: I get in at 7:30am, I'm out around 4pm and I usually get home before 5pm. I've been working on an unannounced title since I started, little else I can say about it, but it'll be great.Otherwise, home life is good, we moved to a house in Newhaven in May. Whilst not being in Brighton is a tad lame, having an entire house for us and the cat is rather good.Finally, our car has been a disaster. The brakes pretty much fell off whilst driving around visiting family in Essex weeks ago. The tire got a massive puncture whilst I was driving in the fast lane approaching the M23 (deflated down to the rim near instantly) on Friday. We got a the tire replaced, get to my wife's mum's road, and the rear exhaust bracket falls off. Rear silencer needed to be replaced, got it done. Then turns out that the front pipe needs to be replaced (being done on Saturday). All in all, owning a car is like throwing your money into a fire and then tossing a bucket of crap on it. Better than sitting on the bus though.</div></summary>
  </entry>

  <entry>
    <title>Satisfaction</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/satisfaction.html"/>
    <id>http://yoursite/article/?i=9d168f89f2af9bb5384fc6af18002f98</id>
    <updated>2008-05-20T04:00:22-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I feel a tiny bit of smugness this morning. After spending my free time on campus yesterday writing out loads of attempts at algebraically solving the collision resolution process in the engine I implemented what I'd got in C++. The real satisfaction came in it's derivation of valid maths and physics, I hadn't need to fake it through a hack, the process was mimicking the equations I read in some physics texts. This meant it took barely any time to implement at all.Currently, the behaviour isn't quite perfect, angular displacement and changes in velocity work out correctly when colliding with another freely moving object, but when colliding with an object of infinite mass and no moment of inertia, there isn't any proper exchange and so the colliding object rests on the vertex of collision (you can see this behaviour with the small box on the left in the image). This looks rather weird when a gravity generator is switched on, it's not "proper" physical behaviour. As far as I can see, this means it is necessary to implement tangent forces (i.e friction), which basically means I'm going to be throwing in what I thought would be extensions to the engine. So, that's tonight's task :) </div></summary>
  </entry>

  <entry>
    <title>The last hurdle?</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/last-hurdle.html"/>
    <id>http://yoursite/article/?i=1592115f8a80029670e730b5994095c2</id>
    <updated>2008-05-20T04:00:22-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I write this from the depths of Sussex campus... I've been sat trying to figure out the most efficient solution to collision resolution in the physics engine today... on paper. Eugh.As I've documented already, the collision detection is finished (there is the possibility of dropping more shapes in , but that's likely to be very easy) but, I've yet to settle on a method of resolving collisions. Previously, due to the limitations of the detection system, the response was limited to purely linear position and velocity changes. Now that the collision detection copes with orientated objects, angular position and velocity can finally be fully integrated.Thankfully I've already got a decent background in mathematics and physics, largely because, well, I took the pair of them as A-levels years ago. I understand how to find the total (linear + angular) separating velocity at the point of collision, but haven't come to a conclusion on how to split this between the objects involved in the collision. Attempts thus far have been less than satisfactory.Anyhow, my point? I'll have solved this problem by the end of Sunday... like the collision detection system, I feel the quickest solution will be by generalising the 2D problem into 3D, no harm though, I smell code reusability.</div></summary>
  </entry>

  <entry>
    <title>Goodbye Academia</title>
    <link href="http://cliniq2d.blogspot.com/2008/05/goodbye-academia.html"/>
    <id>http://yoursite/article/?i=45915ba458de2423c7bbb00492c42145</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As of last week the academic progression of Cliniq2D effectively ended. Overall, success. I think I've done fairly well, I'm hoping that I'm on track for a good first, but I'll have to wait for the marks to roll in. As I've stated before, I'm still working on the engine and I will be releasing it publicly in the future with support for OS X, iPhone (sometime after Apple lifts the NDA for people using the SDK [yes NDA for something freely available, makes all kinds of sense that :/]) &amp; Nintendo Wii (via devkitPro/PPC). Currently working on: heavily altering the underlying rendering, extending the maths (now with quaternions and matrices, tasty), new collision tests for convex polys.As of today I'm one quarter of the way through my final year exams. It's quite a relief to know that after the years of education I'm going straight into the games industry when I finish (I'm having a three day break between my last exam and starting). It has completely validated getting a degree in so many ways. This blog is likely to become a bit wider in scope now, I'm keeping it video game centred, but I'll be likely discussing things beyond physics and Cliniq2D. Last week I attended a workshop at Sussex Uni concerned with accessibility in games for people with disabilities. I've got plenty of concerns with accessibility and gameplay, alongside the technical details, so I was keen to attend. Whilst I'm really concerned with gender and age inclusive design (something that really made me interested in working at Zoe Mode), I hadn't often given thought to disabled gamers. It's great that the industry is trying to attract audiences that don't play games, but what about those who want to but can't? I was most impressed by what Barrie Ellis of www.oneswitch.org.uk had to show. What Barrie presented was interesting, demonstrating how games can be played with a large single switch. I don't think interfaces can get any simpler! More interestingly, I genuinely believe that many of the games Barrie presented were still fun to play. These switch interfaces seem to be fairly flexible, allowing combinations of switches to be customised to different controls. One thing that Barrie pointed out was how multiple switches can facilitate collaboration in playing games, a cool way of allowing people to play more complex titles. There's got to be a lot potential in this stuff.Some guys from local "Buzz" developers Relentless came along and talked about the games. Quite cool to see the progression they made with the controllers from prototype to final design. Unfortunately, I had to leave early into a session of the game, so I've STILL yet to play Buzz, ever. I really want to try it out, I remember when I worked in the depths of the entertainment desk at Brighton Marina Asda and Buzz sold way more then any other game on almost every shift I was there. There's got to be a good reason for that, surely?</div></summary>
  </entry>

  <entry>
    <title>Change of plan: Zoe Mode</title>
    <link href="http://cliniq2d.blogspot.com/2008/04/change-of-plan-zoe-mode.html"/>
    <id>http://yoursite/article/?i=44f41c5d331f4d37eebcba8eb345f253</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Erm, so this is a quick one really. I posted about my disappointment about not being able to take a job I was offered at Kuju's Brighton studio (Zoe Mode) because of the salary. Well, Kuju got back to me yesterday afternoon, and offered me a higher starting salary, which means I can afford to take the job! So now I just need to organise a start date. Hooray!Reminder: Cliniq2D Presentation - 6th MayI'll just mention it again: for anyone who's interested I'll be giving a 20 minute presentation on Cliniq2D on the 6th May. It's an open event, so any interested parties (not stag/hen nights, just to clarify for Becky) may attend. I encourage any locals to come along, just leave a comment if you feel like attending:6th May, 10:40amChichester 204/205 (Lab 3)University Of SussexFalmer, Brighton</div></summary>
  </entry>

  <entry>
    <title>Completed... Presentation (Surprises in </title>
    <link href="http://cliniq2d.blogspot.com/2008/04/completed-presentation-surprises-in.html"/>
    <id>http://yoursite/article/?i=65771a91ed9f6bd9879f4d4622d6f388</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">CompletedSo, today was the deadline for all informatics dissertations! A couple of days ago I completed and handed in my dissertation; with source code it's an alarming 117 pages. Printing and binding it cost a shocking amount! I'm rather proud of the success of it, but I'm not going to be ending development for it just because the academic bit is done with. Not at all. So I'll be working on my presentation for the project, and revising for exams over the coming weeks, but I'll be carrying on with development in my spare time.(Zoe Mode/Creative Jar)People who know me personally will know I've been pursuing a job in the games industry for some time. I was actually offered a position as a programmer at Zoe Mode in Brighton, I really regret to say I had to say no to the offer. Unfortunately, following negotiations Zoe Mode couldn't offer me a salary that met my financial requirements at this time. I'm gutted. I only needed an extra grand a year, which I'd hoped wasn't too large a figure. I understand why they decided not to offer me more, I only wish I could've proved to them I was worth it.After my exams I'm starting full time employment immediately as a C++ dev here in Brighton. I'll be working for Creative Jar Technology. The job involves coding away at cross-platform apps, on a Mac. So, I'll definitely be at home ;) Open Presentation - 6th MayFor anyone who's interested I'll be giving a 20 minute presentation on Cliniq2D on the 6th May. It's an open event, so any interested parties may attend. I encourage any locals to come along, just leave a comment if you feel like attending:6th May, 10:40amChichester 204/205 (Lab 3)University Of SussexFalmer, BrightonI'll be talking about the engine, the development process, difficulties, successes and the future. There'll be a demo of the engine and hopefully some surprises involving a certain home console and mobile phone.The Future of Cliniq2DI'll be posting a bit more information on what's going with the engine in the next few days, some information might be held back until after my presentation (hey you never know, someone might be excited enough to wait). Meanwhile, expect some new youtube videos in the next few days.</div></summary>
  </entry>

  <entry>
    <title>Gameplay as Simple as Drag and Drop...  </title>
    <link href="http://cliniq2d.blogspot.com/2008/04/gameplay-as-simple-as-drag-and-drop-how.html"/>
    <id>http://yoursite/article/?i=5ba53deff7ecd0213048ad0440cdfe78</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm coding away furiously, and back on pulling all-nighters (with only the cat to talk to whilst I make myself coffees) to make sure the code is as tight as possible for the project hand-in on the 24th. I'm really enjoying it though, so don't be tempted to feel sorry for me (ahem). Anyhow, I'm multi-tasking, as much of the code is really complete and I'm just ironing out wrinkles, so I thought a blog post would be worthwhile.In the accompanying gargantuan report for the project I've written a section on drag and drop game play and discussed with some detail how touch screens are a nice medium for interacting with in-game physical bodies. I'm fascinated with non-traditional interfaces for gaming (and judging by the success of the Wii over the past year and a half, so is everyone else). Near 1-to-1 physical mappings between your actions and what happens onscreen open up lots of exciting gameplay possibilities, which are rapidly being exploited throughout the industry. I've been considering how this kind of interactivity can lead to exciting creation of content and games by gamers themselves. If these input devices encourage a wider audience to participate, can they enable them to easily create? After all, with games like LittleBigPlanet on the horizon (which is drumming up a fair bit of interest due to its clever emphasis on user generated content), its likely that similar games will follow if its successful. LittleBigPlanet looks really lovely, and I'll certainly get round to purchasing a PS3 in time for its release, but I really think it's the kind of game that could've been enhanced even further by touch screen interaction or the Wiimote. How forgiving will the creative aspect be with the PS3 pad for non-gamers?So yes, I'm very into creativity in games via this medium, and I intend to explore it myself. I'm writing some stuff for my presentation about future steps for the engine, and one thing I've been considering is creating a release for programmers, and a release for gamers. Sure, there's plenty of drag and drop game making tools out there. They make the process of game development easier (and granted more limited), but not that easy. I'm liking the idea of aiming something not at programming novices, but at gaming novices. I like the idea that a child's parents could get into the games their children are playing by engaging in the creation of them, and the stuff this post rambles on about could facilitate that.Anyhow, you'll have to forgive me going on.How Bouncy is Cheese?I've largely got rid of many of the bugs in the engine, particularly on the physics and memory leak (thank you Boost!) sides. It's good fun to play around with the code for the demo game I'm going to be showing at the presentation, it's quite robust now and it feels right. I'm just struggling to find the right level of bounce for a block of cheese and cupcakes at the moment. Just how bouncy is real cheese?</div></summary>
  </entry>

  <entry>
    <title>Crunch!</title>
    <link href="http://cliniq2d.blogspot.com/2008/04/crunch.html"/>
    <id>http://yoursite/article/?i=93d7c775b3f82fcf40c886a044a08f87</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is a brief one really. It's been a fair bit of time since I last made a post. I've been extremely busy with finishing the written part of the project, I finally got past the 10000 word mark just over a week ago. Anyhow, as it stands, everything is behaving wonderfully. Most of the changes in the code are now adjusting initial attempts with better solutions, hacks leave a sour taste in my mouth, so where possible, they're being eradicated. On the whole, the engine code is shaping up nicely. Currently I'm busily finishing a simple game to demonstrate the engine's use. I'll be demoing this during the presentation for my project, sometime after 25th April. Hopefully I'll find time to bulk it up enough to make it fun and worth popping online after my exams, but we'll see :) I thought I'd provide a screen shot of what I'm working on, we're past the circle and square outlines.Moving ForwardAside from the simple game I've mentioned, I'm likely to open source the engine, but this might be a while after graduation. Currently, in our spare time, a friend and I are currently working at a racer, which should prove to be a nice distraction. I'm happy to say we're using the engine where it makes sense.A brief note, never tell a passenger that playing video games somehow helped you negotiate a corner when driving.</div></summary>
  </entry>

  <entry>
    <title>The iPhone SDK</title>
    <link href="http://cliniq2d.blogspot.com/2008/03/iphone-sdk.html"/>
    <id>http://yoursite/article/?i=3830e0dc41b34ed871eb6a0d1205d936</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A few posts ago I mumbled about how great programming something for the iPhone would be once the SDK got out. A few days ago, it got out. It also got installed on my Mac (along with an incremental update to Xcode, thanks Apple, somehow it screwed all the search paths in all my project, thanks again Apple). Hmm. Hmm is about as far as I got. See, it's very nice to fire up the iPhone simulator and get a feel for how interaction works with the phone (compared to my experience in Churchill Square's o2 store, it seemed accurate). Looking at some of the example code showed some great potential, multi-touch allowing me to move more than one object at once (fancypants!), but there was a nasty issue. The SDK supports embedded OpenGL, which seems like a nice enabling tool for the GUI side of games for me, unfortunately it doesn't work with the simulator. Clearly the simulator is lacking some of the features of the actual iPhone, shame. So any development on the iPhone is graphically on hold till: Apple somehow allows us to us GL with the simulator, or that pesky anonymous benefactor sends me an iPhone and the money for certification from Apple.In other news, I posted an image of some work I did for my generative creativity course to gamedev.net and it's now appearing on the front page of the site. Don't know if that's a major achievement or not, but I'm quite happy to see it there. See it here.</div></summary>
  </entry>

  <entry>
    <title>Doing away with pointers...</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/doing-away-with-pointers.html"/>
    <id>http://yoursite/article/?i=244503523f3265254e792f06d76a095f</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm considering reducing dependencies on pointers in the engine code, in a bid to improve its safety at runtime.As an example: I've read a lot of discussion on issues such as using pointers in STL containers, the general consensus: it's bad. Obviously there's sound logic there, none of the STL containers delete pointers when they're cleared. If you're aware of this, and you explicitly delete all pointers in a container, well, you're ok-ish (otherwise: "Hello memory leaks"). Yes, the problem is solved, but you're still on dangerous ground. Most notable issue? You delete the pointer, somewhere else: a copy of that pointer exists, it's derefrenced... What happens? Undefined behaviour, i.e. we've got no idea, but it'll likely cause a nasty error somewhere down the line.So, issues like this make me rethink things I've done. Most realistic action: I tighten up the code a bit more and try to eliminate pointers where not necessary and make a significant attempt at reducing their visibility to end-users.I'm quite glad really, I do feel this project has really refined my programming skills in many different ways.</div></summary>
  </entry>

  <entry>
    <title>Multi-threading</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/multi-threading.html"/>
    <id>http://yoursite/article/?i=1856a07e6989fb77dd90391141764919</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There comes a time in every programmer's coding that the features of boost tempt them to implement things into their code.I've not used boost for some time, but a few things have tempted me back:- serialization (perfect for saving and loading scenes into the engine, preferable to scripting for me)- lambda abstractions (which are one of the best things I discovered when I learnt Haskell last year)- threadsThe last one is likely to make the biggest impact, I'm thinking of adding multi-threaded solutions to some of the parts of the engine. I feel the biggest impact will come from making the physics engine thread-safe, so I'm going to give this a go over the weekend. If it causes an improvement, excellent, I'll create single- and multi-threaded versions. If it doesn't? Oh well.</div></summary>
  </entry>

  <entry>
    <title>Porting And C++ Discussion</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/porting-and-c-discussion.html"/>
    <id>http://yoursite/article/?i=e7c094a3f025dcf98fd64e4e65c3d15b</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you've been reading the blog for a while, you'll note that I've been trying to cram the engine onto the Nintendo DS (using homebrew toolkits like devkitPro) with limited success. By limited success I mean: the DS hates physics bad. This is kind of unfortunate, and mainly a result of the low power main CPU, lack of FPU, and little optimisation on my side. I'm determined to get something out of the codebase ported, but I don't know that it'll be anywhere near as complex.This is all a little bit of a shame... I feel the DS is one of those platforms that has the ideal interface: the touchscreen. Admittedly it's not that advanced, but it's potentially the most fun way of interacting with physics heavy games - very tactile! ...now, the iPhone, well that's an altogether different story. I've not talked much about Apple's pocket prodigy, but (predictably) I'm pretty sold on the device, interacting with it is amazing. I think the potential for a tactile physics-based game is pretty good on it, certainly more hopeful than on the DS. After all, the SDK is soon going to be available, and the hardware is several times more powerful than what the DS offers (with an FPU, "thank the gods!"). Plus, multi-touch gameplay... how can that not be exciting?! So, beyond the part of this that ends up getting submitted for my dissertation, I can see me porting the engine to the iPhone as soon as I can get my grubby little mitts on it (so basically, that's going to take my current mobile contract ending or an anonymous benefactor sending me one [go for it please!]).Why should I use the const in "float getBlah( void ) const { return blah; }"?I saw a post that asked a similar question on a forum sometime ago. Someone had been basically coding methods in their program using these kinds of declarations because they'd seen them elsewhere. They didn't know why they were using them, they didn't know why they got errors when they used them on functions that modified a variable. I have to say it's one of those cases where they got nothing much but abuse, rather than helpful comments, that's a real shame. People are all too negative when others have a query about something or don't fully understand something in a language, it's a pity. I don't think I know anyone who I'd call an expert in any particular programming language (maybe a couple of guys with solid knowledge of isolated features). I certainly feel I'm always learning (after all, the whole field of Computer Science is rooted in constant discovery and learning, isn't it?), we always get things wrong or misunderstand them and need help, and it's a damn sight easier for someone to explain the answer than read an obscure description from a text-book.That aside, I wanted to talk about use of const briefly (so switch off if C++ bores you, seriously). Most C++ programmers probably know that const is used when we want to maintain something as a constant in our code (could be a local integer definition for instance), it's much nicer looking than a #define as well. So why on earth use const before a function declaration? It's basically a nice way of saying that you're not going to alter any member data in a class (it's not exclusive to classes though, this is just an example). Why bother? Well, it gives a bit of reassurance really, as a matter of practice it's something to do with "getter" functions in your code, it promises the caller that you aren't going to mess things around. Similarly, when you don't need to alter an object that you pass by reference to a function you should pass it as const, this makes a similar kind of "promise".Obviously, when your function starts altering things, then this causes some errors in compilation because of the const, which is what happened to this forum poster. Anyone who's looked at any C++ compiler's sometimes bizarre error output could forgive them for not knowing why. You can't blame them for adding them everywhere though: it's a common thing. People see something done in a language by someone they perceive to be better than them, so they do it....... EVERYWHERE!Now, I've got a data mining app to finish.</div></summary>
  </entry>

  <entry>
    <title>Cliniq2D - On Paper...</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/cliniq2d-on-paper.html"/>
    <id>http://yoursite/article/?i=a1195b69886a4d1cdd38663af5f525f5</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Video post ahoy! This is me demoing the latest build of the engine on our lovely HD telly. Wonderful.</div></summary>
  </entry>

  <entry>
    <title>More on fixed timesteps...</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/more-on-fixed-timesteps.html"/>
    <id>http://yoursite/article/?i=9ee5559d2830b444960e6ca6b1dd851c</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is a follow-up to the last wordy post (read it here).I rambled on a bit about the issue of timesteps and how they have an impact on physics engines. I've since read a blog post from a while ago at Gaffer on Games. If you look at the post, it suggests a work-around that utilises fixed timesteps (this is fixed in the sense that they have a single static value, rather than "fixing" the problem as my post was titled). I wont detail it (click the link if you want to see it in its full glory), but I've found it's a sensible approach to the problem.So, my physics engine is now effectively fixed at a constant frequency of 100Hz. Nice. Even nicer result... this has pretty much killed off the problem of "tunnelling" in collision detection. I'm just now fine-tuning this so it doesn't go overboard when frame rates start to go really low (basically cheating by reducing the possible number of steps allowed).</div></summary>
  </entry>

  <entry>
    <title>Video Post</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/video-post.html"/>
    <id>http://yoursite/article/?i=92e88b4507500c38a2582dc67a74b8ba</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'll leave this largely to the video to explain. This shows some basic footage of object sleeping and use of epsilons in the engine to reduce workload, allowing more objects in play.</div></summary>
  </entry>

  <entry>
    <title>Fixing Long Time-steps</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/fixing-long-time-steps.html"/>
    <id>http://yoursite/article/?i=57c0a30a8f527fa2359e498ee91e9c51</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In any time-oriented system, like a physics engine, "time-steps" are significant. In the case of a physics engine, a time-step is important because it tells our system how many seconds/milliseconds/whatever to carry out certain process for, like integration. Integration is the most significant one here. As most will no doubt know, in many a multi-tasking OS, when your app loses focus, it often loses CPU time, and it could be quite some time before it gets a slice back. This can cause an issue because when control is returned, you might just find your latest time-step is something massive. This typically causes a lot of issues, as time-steps get bigger in physics simulations, things begin to really fall apart, suddenly bodies are whizzing around ridiculously, massive jumps in acceleration and velocities, contacts start to get missed. This is when you look at the screen and let out a deep sigh and wish you were working on a nice creative media application instead.There are solutions. A popular approach is to up the accuracy of your integration step from the basic secondary school understanding of things like:position(time) = position(lastTime) + velocity * timetoposition(time) = position(lastTime) + velocity * time + 0.5*acceleration(time^2)...which is all well and good, but honestly, it doesn't make much of a difference with the big time-steps; the points where each one falls apart are relatively close... shame.A lot of people throw around Runge-Kutta method as a good integrator (also referred to RK4; the 4 because it's 4th order), which is nice, but god it looks awkward (I've never implemented it to be honest, I always figure finding the simpler approach is often the best). I'll probably look into it in more detail, try and evaluate if it's really worth it.The approach I've been using (might be a bad one) is to have a threshold value, that represents the largest acceptable time-step. If a time-step occurs that is above this threshold, integration is split down and carried out as a series of equal steps. I've taken this approach because I feel it reduces complexity in the code when it's not needed. By carrying out a simpler integration step when it's safe too and only resorting to splitting it down when the time-step gets too large we can make sure we don't waste time when we don't need to, but we can fail gracefully. As ever, eventually it just wont cope and we need to look at fixing things elsewhere. :)</div></summary>
  </entry>

  <entry>
    <title>The less I know about myself the better</title>
    <link href="http://cliniq2d.blogspot.com/2008/02/less-i-know-about-myself-better.html"/>
    <id>http://yoursite/article/?i=8182784ad8633b5357bbd300602a23ad</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Decoupling game objects from the actions performed on them is a weird sounding topic. I recently read an article (or forum post, I can't remember for sure now) that suggested one rule of "good" C++ game programming (apart from avoiding the singleton pattern like the plague and realising the visitor pattern just shouldn't exist) practices was to make sure your central ["entity"/"game object"/whatever] class was decoupled from the biggest operations performed on it. More specifically, the article suggested that typical actions like integration over time (that's moving to you and I), render code, etc. should be separate. That "entity" (or what have you) should be a representation, an isolated datum, and nowt else.I guess this is a dull one for some, but I find it interesting that the originator made absolutely no justification as to why they thought this. OOP is all the rage these days, and (particularly for the younger of us, myself included) leaving it behind at points sometimes feels a little odd... this decoupling malarkey sounds like leaving the land of OOP. The thing is, this kind of approach isn't leaving the nice world of objects; the object-oriented approach lends itself to self-contained "objects" that retain information about themselves, usually nicely implemented with a variety of getter/setter methods... it doesn't on second thoughts make sense that the object should always be able to (and Becky'll have to forgive me for this one, if she got this far without falling asleep) manipulate itself.Still, I don't actually think the author was thinking like this at the end of the day. What they were writing was seemingly isolated to the weird world of games, and far far away from everyday programming. It would seem that the idea was much more based on that of optimisations, reducing calls to objects, trying to keep operations in a smaller space... it does benefit in that area, explicit inline commands for functions and so on suddenly become a possibility. You save a few nanoseconds of time off your code, and yeah, that's great... but at the end of the day, you also make stuff much nicer to read and better designed, so one day, someone else can more easily work with what you've done.Smaller And SmallerFollowing on from my discovery that smaller objects are more stable in game, I noticed a sweet spot whilst polishing some of my collision detection code off tonight. Single digit figures before the decimal point "FTW." Noticed this also reduces the load on the engine when there's no broad-phase collision detection on. Can't figure out why, but interesting nevertheless. I'll try to post a new video tomorrow.</div></summary>
  </entry>

  <entry>
    <title>Real numbers in C++ - large numbers cost</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/real-numbers-in-c-large-numbers-cost.html"/>
    <id>http://yoursite/article/?i=946bdbe955f238f8540ce9c3cf1848c0</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is just a minor one really. Something I guess I should have known. This was something I theorised on a rather quiet train journey back to Brighton from Guildford today. Turns out, my feeling was correct. Large real numbers (that's decimal point-"ed" numbers) represented by single or double precision floating point number (though mainly a problem with floats, doubles are somewhat more precise, obviously that extra 32-bits you sacrifice to the great memory-eating god is worth something) can very easily lead to severe problems with accuracy when smaller numbers become involved. Combining large floats with small floats is inherently inaccurate due to how they are handled mathematically (don't make me explain exponents, don't make me explain exponents, don't make me explain exponents).  Eugh, I'm not explaining this even remotely eloquently, but basically let me simplify this and apply to Cliniq2D (yes, I'm going to use the name more often, no I'm not going to use labels, I'm not a competent blogger):smaller objects are more stable The simplest bugs are so annoying! There's not as much satisfaction as when you solve something really hard... no "Aha!" moment, ack! So yes, smaller scale objects, much better behaved, stacks of objects now work much much much better... obviously that's aided by the sleep functionality that I added recently, but this is a big improvement... the picture I've posted is a great example of this. I am incredibly pleased. Though it's a shame I didn't get this worked a day earlier. Oh well. I'll post a new video in the next couple of days.On Polymorphism, it's nice "but, what does it cost?"I was advised on the cost of dynamic casts today, something I naively didn't think about. I should've, especially given that sometimes RTTI (run-time type information) isn't supported by a C++ compiler and what have you. In practice that advice made a noticeable difference to performance. </div></summary>
  </entry>

  <entry>
    <title>Optimisations</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/optimisations.html"/>
    <id>http://yoursite/article/?i=4d7c718851f7f5d89f38970da0dab3aa</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Just a quick post noting that I've made some minor optimisations (inspired by the annoyance of my new Mac's cpu time being eaten away by spotlight and all of it's meta-data compiling weird processes[it's oh so worth it when I want to search for a file at some later date]), mainly in the area of contact resolution. Basically I've invested in the idea of epsilon values, minimum values that something needs to be above for a particular process to continue. This is something I was already doing for object sleeping, but have now applied to interpenetration resolution and velocity resolution.Other than that, I've been tidying up the core codebase, making physics-joints (e.g. ropes, etc), and thinking about how best to express the relief that the physics is mostly done to requirements.I'm now partially playing the role of game designer in coming up with something neat to show this off.</div></summary>
  </entry>

  <entry>
    <title>Shocked  Delighted...</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/shocked-delighted.html"/>
    <id>http://yoursite/article/?i=2dbdb8831c4af1ba65fac5a98687cf6d</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Couple of bits really. Physics engine is largely finished to the point of satisfying primary requirements for my dissertation, so I'm now mainly working on extensions, optimisations and zapping bugs in the code.Added some useful features which I'll need to update the engine design to accommodate, but they're pretty necessary from the perspective I'm looking at all from now, which is in terms of developing a game and going beyond a tech demo. Main one is tightening up the facade pattern implementation. I had a dependancy on singleton classes in the code, which is never a good idea (the singleton design pattern sounds like the greatest idea in the world, but it encourages laziness in design that can lead to issues like memory leaks when outside the realm of garbage collected languages like Java), and I learnt that the hard way. Now everything is being managed centrally, which is much nicer to work with and easier to understand. Further to that, I've implemented some nice features like managed runtime deletion (to prevent crashes) of game objects, which means the game world can be depopulated nice, quick, and cleanly.Lastly, the latest Mac addition to the household arrived yesterday as I sold up my iMac and bought a MacBook. Whilst it's not a gaming machine and I'll not be playing TF2 for some time, it's a really nice little stop-gap machine that's more than enough for developing the engine.</div></summary>
  </entry>

  <entry>
    <title>Restitution  Friction... Done!</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/restitution-friction-done.html"/>
    <id>http://yoursite/article/?i=e790c9a7c0e36db127db99ca9fe94dd4</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Gordon Ramsay-esque?The title says it all really, they work, the only thing to do is just to get the resolution system to play them down a bit when contacts are at rest, other than that, they look nice when a few bodies are in a simulation. I'll post a new video in the next few days to demonstrate.Other than that, made some optimisations in the contact resolution code, bodies with an inverse mass of zero (equal to infinite mass, meaning no velocity, acceleration, force or torque will affect them) are now pulled out of the resolution code and replaced with a null pointer. This just means that the code only processes the data for the object that can move. Saves a bit of time, also means the sleep code is way more stable, now if you collide with terrain, you wont end up waking up every sleeping object that is sat on that particular piece of ground.Need to tighten up coarse-collision detection, this is the main bottleneck for the engine at the moment, and my quad-tree implementation didn't work as planned.</div></summary>
  </entry>

  <entry>
    <title>Cliniq2D - Contact Resolution Demo</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/cliniq2d-contact-resolution-demo.html"/>
    <id>http://yoursite/article/?i=c6622c7ba3cdc378c4296e9d1f57965b</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Video footage for you, finally... the first half is without external forces like gravity, the second half shows 2D gravity applied to all objects.This is a basic demo, just demonstrating the contact resolution of the engine's physics (hence the most basic of rendering). The demo is running at 640px x 400px resolution ( which is less than I usually test it at ) but unfortunately the only way I could make it small enough to film with my camcorder. Of note, I'm using the xbox 360 wired controller for the input, there's something nice about dropping objects at run-time with the control pad rather than typing and compiling lines of code.     Had a bit of a breakthrough with DS graphics, so hopefully will have some video footage of this demo hacked onto it soon.</div></summary>
  </entry>

  <entry>
    <title>Stability for resting contacts continued</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/stability-for-resting-contacts_17.html"/>
    <id>http://yoursite/article/?i=20093791296d71f2d7c0f06378b1d3ca</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A little bit more progress tonight, which feels very pleasant. I've implemented awake states for objects, this is a nifty way of optimising the physics engine so that objects in the game world that are completely at rest are largely ignored until a moving object collides with them. Simply, this means boxes are now stackable. Lovely stuff.Other than that, a very simple of bit of math, and I've now implemented tangent velocity resolution... that's friction in simpler terms. This is another great thing, I'm refactoring the game object class slightly so that each object can have a coefficient of friction and a coefficient of restitution so that each process can be modelled in the engine. That's not completely physically accurate, different combinations of materials can have varied coefficients of friction and restitution, but it does mean a feel for these physical phenomena can be modelled. As it stands, any object will have a maximum coefficient of 0.5 for friction and restitution; each object's coefficients will be added together to give totals for friction and restitution (with a maximum value of 1.0 for each total).Just as a reference point, the current build of the engine gives an unrestrained fps range of 166-250fps, I certainly think that's reasonable.</div></summary>
  </entry>

  <entry>
    <title>Stability for resting contacts</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/stability-for-resting-contacts.html"/>
    <id>http://yoursite/article/?i=c3370b41b5fe0f9db661d23095558abd</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Of note, since last posting I have revamped interpenetration resolution from linear projection to non-linear projection. This is good because overall a collection of game objects are now stable at rest as they are pushed out of each other in a more natural way. All in all, that's a good thing; whilst I'm not aiming for reality with the physics engine, this gives it a much nicer feel when playing around. </div></summary>
  </entry>

  <entry>
    <title>The simplest mistakes are the worst...</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/simplest-mistakes-are-worst.html"/>
    <id>http://yoursite/article/?i=8f34e45888d888e99009c08b463ad143</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the past few minutes I've had a bit of breakthrough with the collision resolution. Finally, I can see it's pretty much done. The thing that is a tad annoying though, is that I'd spent hours trying to solve the last niggling problem, and it was so bloody simple! The problem was related to calculating point velocity (for the contact point/point of collision between two objects).velocity_point = velocity_linear + ( velocity_angular x relativeCentreOfMass )This is vector math, I'm not going to explain vector mathematics, wikipedia can do that if this is too hard to follow. The formula basically states: the point velocity of an object is the sum of its linear velocity ( in 3D this is velocity along the x, y and z axes ) and the the cross product of its angular velocity ( this specifies rotation around each axes in radians per time unit ) and its centre of mass relative to the point of collision. That's a bit clumsily phrased, but still. Now, in order to resolve the velocity component of a collision, we have to calculate the relative velocity which is the point velocity of one object, minus the point velocity of the other.So where did I go wrong? Well, I went wrong in how I rcalculated the relative centre of mass, for some reason I calculated the point of collision in body space. This is completely wrong, and was the main cause of my problems.All in all, silly mistake, but it's fixed now.So....The physics engine is complete, apart from:optimisations - every extra second counts.tidy up quad-tree implementation that I'm using for coarse collision detection (though it's already made collision detection god knows how much faster).stability for resting contacts.allow more control over restitution.add tangent velocity calculations for friction.I think I'm targeting stability over everything else, this is essential, the other stuff are just nice extras.</div></summary>
  </entry>

  <entry>
    <title>Do you enjoy refactoring code?</title>
    <link href="http://cliniq2d.blogspot.com/2008/01/do-you-enjoy-refactoring-code.html"/>
    <id>http://yoursite/article/?i=4afb02bc16e23f7f64a67df8b9cc1f92</id>
    <updated>2008-05-20T04:00:21-07:00</updated>
    <author>
      <name>http://cliniq2d.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I had an interview, a while back, for a part-time job documenting code for a start-up. It didn't seem like the most exciting thing on Earth, no, but I thought it was a good opportunity to get some "real-world" experience with software engineering (even if I was just going to be sat down with a LaTeX editor and access to the company's source). Despite having programmed in various languages since I hit my teens (and beyond leaving them), I'd never done it "as a job." I knew it wasn't programming I'd be doing, but it was a step in the right direction.Anyhow, why am I mentioning this? Well, in the interview (after being told off for using C++ style comments (that is "//" as the start of a line) in a C function I had written to show I'd be able to read their codebase) they asked me the perplexing question: "do you enjoy code refactoring?"I was pretty surprised, my response was along the lines of "how do you enjoy it?" I didn't say this in a rude manner, but honestly, making code more readable or better structured isn't something you do for fun is it?Had they asked me: "do you find code refactoring necessary?" or "do the results please you?" Well, then I'd have said yes. Is refactoring worth the effort? Yes, it is, at least if you have the time and what you had written was pretty obscure or unreadable.What I'm getting to here is that I've been refactoring the code for the engine, and yes, I wanted to make this more interesting. Programming the engine is coming to an end now, and I'm keen to make sure it's all as readable as a possible for when I start building a game on it in the next few weeks.One other thing they asked me, which was another of many "black or white" questions: "do you like to get the job done or make your code easy to read?" I told them I didn't see why the two were mutually exclusive. I still don't.</div></summary>
  </entry>

  <entry>
    <title>Hammerfight (Hammerfall) Now Available o</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/zBGQK511B-g/"/>
    <id>http://yoursite/article/?i=976d291b437417073bc903bb12f789a7</id>
    <updated>2009-10-28T21:31:37-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/zBGQK</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Konstantin Koshutin&#8217;s amazing Hammerfight game&#8211;previously known as Hammerfall, is now available to purchase on Steam for $9.99.  Go get it, physics game fans!</div></summary>
  </entry>

  <entry>
    <title>Blurst Releases Downloadable Raptor Safa</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/00Ykk2YkPUs/"/>
    <id>http://yoursite/article/?i=ed96dc290f53d7262ae7d149223289de</id>
    <updated>2009-09-10T19:30:58-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/00Ykk</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Blurst, the game portal that I help run over at Flashbang Studios, just released downloadable versions of four of our games:

There&#8217;s some physics-based game goodness in the mix here, so check them out!  There&#8217;s a 4-game bundle available if you want to purchase them all for one sweet price.  Use coupon code FUNMOTION [...]</div></summary>
  </entry>

  <entry>
    <title>Follow Fun-Motion on Twitter and Faceboo</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/gxT8OeWs9-Y/"/>
    <id>http://yoursite/article/?i=9e196404c2476e59a4b670395fdd3b46</id>
    <updated>2009-08-02T17:30:41-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/gxT8O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Tired of waiting for front-page reviews to see what new physics games are available?   You should follow Fun-Motion on Twitter or become a Fan on Facebook!  I&#8217;ll keep these updated with URLs to the latest physics games (even if I won&#8217;t be doing a full video review).
 
I&#8217;ll occasionally run contests to [...]</div></summary>
  </entry>

  <entry>
    <title>Trio of Heroes Use Physics to Fight Unde</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/M2IRRQotwHk/"/>
    <id>http://yoursite/article/?i=5bc78225dd8826d6677d4cba6c7e7700</id>
    <updated>2009-08-02T15:00:47-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/M2IRR</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Trine is a physics-based platformer/brawler from independent Finnish developers Frozenbyte (best known for their Shadowgrounds series).  In Trine you instantly swap between three different characters, each with a unique means of manipulating your physical surroundings.  The wizard levitates objects and creates blocks/planks, the thief fires a grappling hook, and the knight tosses objects [...]</div></summary>
  </entry>

  <entry>
    <title>Trials HD Headed to Xbox 360</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/jDKbAEJY_7s/"/>
    <id>http://yoursite/article/?i=8a9fbf972d4860311e34ceaf071a9b3c</id>
    <updated>2009-07-28T13:00:40-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/jDKbA</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m a huge fan of the Trials series of games (Fun-Motion reviews:  Trials, Trials 2 SE), so it&#8217;s great to see the series headed even more into the mainstream with an August release of Trials HD for Xbox 360.  They&#8217;re launching the game as a part of the Summer of Arcade promotional program. [...]</div></summary>
  </entry>

  <entry>
    <title>Nimble Ninjas Face Ferocious Foes</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/IVtDUaK-GZQ/"/>
    <id>http://yoursite/article/?i=58b9cc63620e33f6f128d8e32d682eb3</id>
    <updated>2009-07-27T21:30:33-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/IVtDU</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Rubber Ninjas is the 3D follow-up to Matteo Guarnieri&#8217;s excellent Ragdoll Masters.  Ragdoll Masters is over 3 years old, now, and Rubber Ninjas does a great job of taking the simple ragdoll fighting system into a 3D space.  It adds some graphical polish without sacrificing the elegance that made the first game so [...]</div></summary>
  </entry>

  <entry>
    <title>Hammerfall Officially Emerges as Hammerf</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/wux1vbv3nfg/"/>
    <id>http://yoursite/article/?i=a2a4f66997a25b7199cc52bea2bf607b</id>
    <updated>2009-07-27T16:30:33-07:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/Fun-Motion/~3/wux1v</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The much-loved IGF finalist, Hammerfall, has finally officially re-emerged as Hammerfight.  The name change has been hinted at through Russian magazine scans and twice-translated forum posts, but this marks the first time something from Konstantin Koshutin himself has appeared online.
The new Koshutin.com website features new screenshots, game information, and a video trailer.  There&#8217;s [...]</div></summary>
  </entry>

  <entry>
    <title>Crayon Physics Deluxe is Out!</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/GU1-nTrICdk/"/>
    <id>http://yoursite/article/?i=3662ac362ee7a090db13457752e6554b</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As you may have already noticed&#8211;for the Internet is aflame with Crayon Physics fever&#8211;Petri&#8217;s Crayon Physics Deluxe is out.  Like, you-can-pay-$19.95-right-now out.  Go buy it!  It&#8217;ll be a fine game to return to reviewing with.  Stay tuned.

Crayon Physics Deluxe Page</div></summary>
  </entry>

  <entry>
    <title>Now Open:  Minotaur China Shop</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/t-r3nT4BEeo/"/>
    <id>http://yoursite/article/?i=db62d78446e235e79f4309a887dd8403</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We just released our newest game over at Blurst, Minotaur China Shop.  Help The Minotaur fulfill his dream of selling fine china to mythical creatures.  It won&#8217;t be easy; he&#8217;s plagued by a crippling case of Minotaur Rage, which makes it quite difficult to keep fragile stock on hand.  Fortunately he was [...]</div></summary>
  </entry>

  <entry>
    <title>Incredibots Goes Beta</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/rZpEt4bksR0/"/>
    <id>http://yoursite/article/?i=31bb0a1d87b76d3a1372c8cc06769bf8</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Incredibots, a neat Flash-based physics sandbox from the fine gentlemen at Grubby Games, just went live with a public beta.  It has a lot of potential, and they&#8217;re doing a great job of polishing it up.  Go check it out over at incredibots.com.
You can make your own replays with it, too, which I&#8217;m [...]</div></summary>
  </entry>

  <entry>
    <title>Unity Awards Audience Vote</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/NAbi_YRag1Y/"/>
    <id>http://yoursite/article/?i=45f99eb15a51f42c056bcd70f4176708</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Unity, the fantastic technology we use, is holding their second annual Unity Awards alongside their conference next week.  We won the first year&#8217;s contest with Splume, our physics-based bubble popper game.  We&#8217;ve entered all of our games to this year&#8217;s contest, including Off-Road Velociraptor Safari.
Go Vote Here</div></summary>
  </entry>

  <entry>
    <title>Rubber Ninjas Gameplay Teaser</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/bZQXXgiD25E/"/>
    <id>http://yoursite/article/?i=df42268ba7e5a04ea3faeaa44722cba0</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Matteo sends word that he&#8217;s released a teaser to his new game, Rubber Ninajas.  It looks a great 3D refresh and expansion of the gameplay he pioneered with Ragdoll Masters:</div></summary>
  </entry>

  <entry>
    <title>Wolfire Games Announces Overgrowth</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/dnYHge_1zfo/"/>
    <id>http://yoursite/article/?i=d74a33ac100ec2b3eeed2c2c03f7e82a</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Wolfire Games, the developers behind the excellent Lugaru, have announced that the long-awaited Lugaru 2 has been renamed to Overgrowth.  Wolfire recently transformed from the part-time efforts of David Rosen into a full-time team of five.  You can follow their progress and read introductions for the team members over at their development blog.

A [...]</div></summary>
  </entry>

  <entry>
    <title>World of Goo Goes Gold</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/AvD3ajpBJKY/"/>
    <id>http://yoursite/article/?i=91d9cb34ab33943885d7d5aed3d410df</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">2D Boy has announced that World of the Goo, the IGF award-winning physics construction game, has announced that the PC version of the game has gone gold.  The Wii version, with delightful co-operative multiplayer, is expected to be submitted to Nintendo for LotCheck later this month.  Congrats, Kyle and Ron!
World of Goo Trailer [...]</div></summary>
  </entry>

  <entry>
    <title>Trials 2SE Visual Upgrade, Same Great Ph</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/Z01zLKJnx0Q/"/>
    <id>http://yoursite/article/?i=0608562ef8c2aabba6aceee4e7d992f8</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The original RedLynx Trials game was one of the games that spurred me to create Fun-Motion.  Here was a game completely based on physics, with its own learning curve and style of play.  It was relatively obscure, though, as were many other physics games back then, so I decided to start a site [...]</div></summary>
  </entry>

  <entry>
    <title>Walaber Experiments with Ragdolls and Ae</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/iIhALj2U3Cc/"/>
    <id>http://yoursite/article/?i=e2965ff70eefc1a9e64e69fb269ca95c</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Walaber (Jello Car, Gymast), recently posted videos revealing he&#8217;s experimenting with a powered ragdoll.  The first video shows a ragdoll with constraint angles controlled via gamepad:

The second video reveals he&#8217;s developing the technology for a freestyle/aerial skiing game:</div></summary>
  </entry>

  <entry>
    <title>2D Boy Confirms World of Goo Wii Multipl</title>
    <link href="http://feedproxy.google.com/~r/Fun-Motion/~3/EOQXOHjTDiE/"/>
    <id>http://yoursite/article/?i=d7f9ccbe78e575c730fad376f2d65b22</id>
    <updated>2009-02-24T17:30:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">2D Boy has updated their blog with some World of Goo details, including this juicy tidbit:
There were some rumors, so just to confirm: Yes, the Wii version will have multiplayer co-op play in every single level. Additional players can join in or leave at any time. We have not tried (yet) on any child specimens, [...]</div></summary>
  </entry>

  <entry>
    <title>Crayon Physics Deluxe is Out!</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/505815355/"/>
    <id>http://yoursite/article/?i=896b22cc8f0a187196a1bd53cdad05b0</id>
    <updated>2009-01-07T19:30:29-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As you may have already noticed&#8211;for the Internet is aflame with Crayon Physics fever&#8211;Petri&#8217;s Crayon Physics Deluxe is out.  Like, you-can-pay-$19.95-right-now out.  Go buy it!  It&#8217;ll be a fine game to return to reviewing with.  Stay tuned.

Crayon Physics Deluxe Page</div></summary>
  </entry>

  <entry>
    <title>Now Open:  Minotaur China Shop</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/482197341/"/>
    <id>http://yoursite/article/?i=d6c470e8e18cfbb0b6ea2ee1fa1a0cd4</id>
    <updated>2008-12-11T18:00:36-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We just released our newest game over at Blurst, Minotaur China Shop.  Help The Minotaur fulfill his dream of selling fine china to mythical creatures.  It won&#8217;t be easy; he&#8217;s plagued by a crippling case of Minotaur Rage, which makes it quite difficult to keep fragile stock on hand.  Fortunately he was [...]</div></summary>
  </entry>

  <entry>
    <title>Incredibots Goes Beta</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/450114803/"/>
    <id>http://yoursite/article/?i=8da593f9b268605b5fda3c1c5e80a56a</id>
    <updated>2008-11-11T17:30:31-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Incredibots, a neat Flash-based physics sandbox from the fine gentlemen at Grubby Games, just went live with a public beta.  It has a lot of potential, and they&#8217;re doing a great job of polishing it up.  Go check it out over at incredibots.com.
You can make your own replays with it, too, which I&#8217;m [...]</div></summary>
  </entry>

  <entry>
    <title>Unity Awards Audience Vote</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/423084567/"/>
    <id>http://yoursite/article/?i=91cc358ee1d3992d078b7fccf2efa8a3</id>
    <updated>2008-10-16T15:00:25-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Unity, the fantastic technology we use, is holding their second annual Unity Awards alongside their conference next week.  We won the first year&#8217;s contest with Splume, our physics-based bubble popper game.  We&#8217;ve entered all of our games to this year&#8217;s contest, including Off-Road Velociraptor Safari.
Go Vote Here</div></summary>
  </entry>

  <entry>
    <title>Rubber Ninjas Gameplay Teaser</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/416211761/"/>
    <id>http://yoursite/article/?i=645d99c8c3a7300d7fb0074e75d0dac0</id>
    <updated>2008-10-09T17:00:56-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Matteo sends word that he&#8217;s released a teaser to his new game, Rubber Ninajas.  It looks a great 3D refresh and expansion of the gameplay he pioneered with Ragdoll Masters:</div></summary>
  </entry>

  <entry>
    <title>World of Goo 4-Player, LIVE!</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/405685292/"/>
    <id>http://yoursite/article/?i=906c616ddbe4fbe597889edcda68da77</id>
    <updated>2008-09-28T14:30:14-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The Wii version of World of Goo is currently being played at TIGJam, live:
Live Video streaming by Ustream</div></summary>
  </entry>

  <entry>
    <title>Wolfire Games Announces Overgrowth</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/395606089/"/>
    <id>http://yoursite/article/?i=642d5f274a13fdbc3ca535b06adb9428</id>
    <updated>2008-09-17T16:00:47-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Wolfire Games, the developers behind the excellent Lugaru, have announced that the long-awaited Lugaru 2 has been renamed to Overgrowth.  Wolfire recently transformed from the part-time efforts of David Rosen into a full-time team of five.  You can follow their progress and read introductions for the team members over at their development blog.

A [...]</div></summary>
  </entry>

  <entry>
    <title>World of Goo Goes Gold</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/391988591/"/>
    <id>http://yoursite/article/?i=66fab31ffea0aa35b395d3ea3b0e7a42</id>
    <updated>2008-09-13T20:00:27-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">2D Boy has announced that World of the Goo, the IGF award-winning physics construction game, has announced that the PC version of the game has gone gold.  The Wii version, with delightful co-operative multiplayer, is expected to be submitted to Nintendo for LotCheck later this month.  Congrats, Kyle and Ron!
World of Goo Trailer [...]</div></summary>
  </entry>

  <entry>
    <title>Trials 2SE Visual Upgrade, Same Great Ph</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/391788039/"/>
    <id>http://yoursite/article/?i=8460c6849ae65f83caaad55f540f3f5b</id>
    <updated>2008-09-13T13:30:26-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The original RedLynx Trials game was one of the games that spurred me to create Fun-Motion.  Here was a game completely based on physics, with its own learning curve and style of play.  It was relatively obscure, though, as were many other physics games back then, so I decided to start a site [...]</div></summary>
  </entry>

  <entry>
    <title>Walaber Experiments with Ragdolls and Ae</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/323342003/"/>
    <id>http://yoursite/article/?i=b7d9455f05f93583012b259fb54104ae</id>
    <updated>2008-06-30T10:30:15-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Walaber (Jello Car, Gymast), recently posted videos revealing he&#8217;s experimenting with a powered ragdoll.  The first video shows a ragdoll with constraint angles controlled via gamepad:

The second video reveals he&#8217;s developing the technology for a freestyle/aerial skiing game:</div></summary>
  </entry>

  <entry>
    <title>2D Boy Confirms World of Goo Wii Multipl</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/320068577/"/>
    <id>http://yoursite/article/?i=35189e6c1708e83b9d7f08ff96383ed9</id>
    <updated>2008-06-25T17:30:39-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">2D Boy has updated their blog with some World of Goo details, including this juicy tidbit:
There were some rumors, so just to confirm: Yes, the Wii version will have multiplayer co-op play in every single level. Additional players can join in or leave at any time. We have not tried (yet) on any child specimens, [...]</div></summary>
  </entry>

  <entry>
    <title>Beautiful, Frustrating Puzzle Physics</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/317851138/"/>
    <id>http://yoursite/article/?i=e055e1cde44c9d23cdc91cdd8111bc04</id>
    <updated>2008-06-22T23:00:19-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Obulis is the first PC release from IonFx, a longtime Pocket PC developer.  It?s actually the third installment in the series, with the first two titles out on Windows Mobile.  Obulis is a puzzle game in the truest, hardcore sense of the word.  I hope you like thinking!


Simple Rules
The goal in Obulis [...]</div></summary>
  </entry>

  <entry>
    <title>iPhone Physics Games Launch in July</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/308319497/"/>
    <id>http://yoursite/article/?i=d18cb022bc3072f2bc1906cd82c1da51</id>
    <updated>2008-06-09T16:00:33-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apple announced details for its new 3G iPhone at their WWDC event, as well as pricing and details for some initial game slated to launch on the new iTunes App Store for iPhone and iPod Touch owners.  Given that both devices feature a tilt sensor, and the hardware specs are pretty beefy, it&#8217;s likely [...]</div></summary>
  </entry>

  <entry>
    <title>Undercooked but Great as an Appetizer</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/289025913/"/>
    <id>http://yoursite/article/?i=2354244decbf471ce1720505743bd03c</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Soup du Jour is a small physics game from Digital Eel, an independent developer best known for their Infinite Space games.  It?s worth mentioning that, although it?s not a physics game, Weird Worlds: Return to Infinite Space is a fantastic experience.  I highly recommend it.  So how does their foray into physics-based [...]</div></summary>
  </entry>

  <entry>
    <title>Tantalizing Gish 2 Tech Video</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/272659740/"/>
    <id>http://yoursite/article/?i=e7dab0f5532ee0b795f043b2b171e50f</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Alex Austin has posted some details of the news physics for Gish 2 over at the Cryptic Sea development blog:
The new model is made up of 128 particles which move independently and have an attraction to each other. The trick has been wrangling the particles to move as one blob, it&#8217;s getting closer but still [...]</div></summary>
  </entry>

  <entry>
    <title>Walaber Releases Trailer for Gymnast</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/246373996/"/>
    <id>http://yoursite/article/?i=30c49e3bdbadcffeb9e034ac0ad707d9</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Update:  The game is out!  Grab it over at Walaber&#8217;s Gymnast page.
Walaber, game developer extraordinarre, has released a trailer for his next game, Gymnast.  It&#8217;s looking hot!

Make sure to check out his other games, Jello Car and Walaber&#8217;s Trampoline, as well as the other games on his site.  He has a [...]</div></summary>
  </entry>

  <entry>
    <title>Off-Road Velociraptor Safari Released!</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/226964376/"/>
    <id>http://yoursite/article/?i=d37ff0b71ec9a2c0d5f293940d3b5e32</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The game is out!  Play free online at:
Raptorsafari.com
And if you&#8217;re curious how I play, here&#8217;s the video of today&#8217;s #1 score:</div></summary>
  </entry>

  <entry>
    <title>A World Where Up Has No Meaning</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/223640390/"/>
    <id>http://yoursite/article/?i=1069f62caf02d3a9989ccf5ea9b7a52d</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">And Yet It Moves&#8230; is a conceptual game that won the 2007 Independent Games Festival Student Showcase. The first thing you?ll notice is the torn photo art, which is a fantastic way to pretty up the world without having to dedicate serious man-hours to artwork. Unfortunately the look might be my favorite part of the [...]</div></summary>
  </entry>

  <entry>
    <title>Off-Road Velociraptor Safari Trailer</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/219987760/"/>
    <id>http://yoursite/article/?i=afa7ad896f85e57ac3f2fde5c4e80d22</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">For my &#8220;day job&#8221; I run Flashbang Studios, an independent game development studio.  Our next title is Off-Road Velociraptor Safari, a game in which you hunt raptors in off-road jeeps.  We&#8217;ve been working on this for about 8 weeks; release is scheduled for next week.
Enjoy the trailer, and keep an eye on RaptorSafari.com [...]</div></summary>
  </entry>

  <entry>
    <title>The Question Mark is There for a Reason</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/219719245/"/>
    <id>http://yoursite/article/?i=feae1375f4d94c4349fb887294c862a1</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Occasionally, a game just sticks out. Sometimes for it&#8217;s cinematic polish, or it&#8217;s finely tuned gameplay&#8230;but every now and then you happen across a game that&#8217;s simply a labor of love - a game that conforms only to the unique creativity of the developers and not to market demands or existing conventions. Golf? (golfquestionmark), despite [...]</div></summary>
  </entry>

  <entry>
    <title>Slightly Miswired Robot Ragdolls Shuffle</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/210928626/"/>
    <id>http://yoursite/article/?i=b9b7f88b3241790d016c896619d67f18</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If Sumotori Dreams is a game about sumo wrestlers learning to walk, Kaneko&#8217;s NekoFight is a game about capoeiristas struggling with melancholy. NekoFight is a simple ragdoll fighting demo, but the participants seem to be as much victims of world-weariness as of a gravity simulation.


The Saddest Control Set
The game and documentation are in Japanese, but [...]</div></summary>
  </entry>

  <entry>
    <title>The Finest Power Shovel Simulator on the</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/209521813/"/>
    <id>http://yoursite/article/?i=c5024b2d5d2ffebf60b4a534a999ff39</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Power Shovel, developed by Taito and published by Acclaim, is a power shovel simulator released in 2001 for the Sony Playstation. The game is split up into various wacky game modes where players are given tasks ranging from digging holes to pouring spicy curry into bowls of rice. At first glance it seems like a [...]</div></summary>
  </entry>

  <entry>
    <title>This Made My Day</title>
    <link href="http://feeds.feedburner.com/~r/Fun-Motion/~3/189921223/"/>
    <id>http://yoursite/article/?i=33ad941c55eb9ada4cb2335006802783</id>
    <updated>2008-05-20T04:30:22-07:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/F</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Mocap technology Ive always wanted  inve</title>
    <link href="http://casuallyhardcore.com/blog/2009/05/04/mocap-technology-ive-always-wanted-invented-2-years-ago/"/>
    <id>http://yoursite/article/?i=04f366bca01bca7fb44258065d04e493</id>
    <updated>2009-12-20T19:01:09-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/05/04/mocap-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Imperceptible Photosensing Marker Tags for Location + Orientation + Incident Illumination + Reflectance + Unique Id Capture in Ambient Light at 500Hz, for inexpensive(
</div></summary>
  </entry>

  <entry>
    <title>Games Of 2020 (my entry)  This Is Your H</title>
    <link href="http://casuallyhardcore.com/blog/2009/03/06/games-of-2020-my-entry-this-is-your-house/"/>
    <id>http://yoursite/article/?i=6b10b3e5b55f3390df84520fb7801f5b</id>
    <updated>2009-12-20T19:01:09-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/03/06/games-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">On a whim, I submitted a quick-and-dirty home decorating game idea to Gamasutra / Mountain Dew&#8217;s Green Label Gaming contest. I didn&#8217;t win, but a friend did (congrats Jim) who wrote a humorous entry.  
I&#8217;m posting my entry here because I WANT somebody to implement this and it&#8217;s my stress-relief from prepping for GDC and I tend to openly share game concepts. Disclaimer: Would I play this game? No. On the other hand, I will never play Halo 3 and COD4. I&#8217;m neither a casual nor hardcore gamer. My mother would be addicted to this game.

This is Your House

Summary:
Home decorating show + game combination made possible with easy to use touch-displays and improved 3D graphics. The future will be a friendlier, nicer now.
What:
The most popular game in 2020 will be a home decorating show/game, This is Your House. 

Each week an exotic house is profiled and explored in the TV show section, but afterwards the viewer/player can re-arrange all the furniture + props + doors to score the optimal air-flow, light-flow, sound quality, etc. 
Gameplay:

Begin with empty room &#8211; similar to the one in the show.
Drag and drop (using finger) furniture from the right side of the screen to the room.
Press &#8220;score&#8221; to get a ratings for:

Air flow (prevent stuffy rooms with large furniture block air paths)
Uniform light (place windows + lamps optimally)
Colour/pattern variation (who wants to live in a grey room?)
Acoustic quality of room (is the room good for audio listening?)


Technology like fluid simulation, acoustic rendering, and final gathering will be used to score the player.  Complex algorithms implemented for mainstream uses.

The show/game will scan the objects in the house into 3D models for the player to use.  3D graphics should be powerful enough such that the 3D models will be nearly photoreal. Technology like this is beginning to pop up (see Mental Ray RealityServer):

Results can be shared online. Custom patterns for furniture, drapes, etc. can be created by placing a real object in front of the webcamera (all consoles and TVs will have one built in). 

Real pieces of furniture can be ordered in the game&#8230; so the game is part 3D IKEA catalogue, 3D game, 3D television show&#8230;. mixing passive entertainment (TV) with online sales (furniture catalogue) and world-building (game).

This is Your House is a better &#8220;virtual world&#8221; than Second Life &#8211; it will be accessible to grandmothers and children alike. There&#8217;s no Second Life porn, there&#8217;s no weird goth people flying through the world and there are weekly furniture updates. This is Your House takes the best part of The Sims (home decorating) and makes it accessible to PC illiterate and also provides near-photoreal results.
The Sims now:

This is Your House (circa 2020):

The second most popular game will be a spin-off of This is Your House &#8211; called This is Your Garden where players grow virtual gardens. Again, the interface will be the touch-sensitive LED display.
How:
In 2020 we should have paper-thin touch-sensitive displays that can be &#8220;taped&#8221; to any surface like a desk or wall. Homes will have a 8 feet by 4.5 feet display &#8220;taped&#8221; to a wall. 
Sony and Phillips low-power LED displays (now):

Like how LCDs replaced CRTs, low-power/thin LEDs will replace LCDs. These displays can be used as touch-sensitive input devices &#8211; no different from what you see in Star Trek and other Sci-Fi movies.

The games of the future will be less and less like hardcore games of today. 
The mainstream will be playing games without consciously &#8220;knowing it.&#8221; These &#8220;universal games&#8221; will be integrated with television shows as the display also acts like a touch-sensitive surface. A separate touch-sensitive LED display can be used as a remote/joystick if the player does not want to play standing upright.

Why home decorating:
In the future, gaming will become mainstream more than even the Wii has. The nature of gaming will change. Instead of hardcore violent fantasies we get reality-TV like fantasies of home decorating, gardening, fashion, being a celebrity, etc. that also act like marketing tools. Advergaming to the extreme made possible by technology that seamlessly blends into our normal life.
Why LED displays:
Time and time again, history has shown us it takes about 10 years for research or high-end technology to make it into mainstream.  High-definition digital video was available to visual effects production houses in the mid-to-late 90s. 3D graphics cards for the consumers appeared around 1996 after this technology had been available in high-end SGI workstations since 1982.

What is appearing now in 2009 is &#8220;digital paper&#8221; &#8211; low-power thin LED displays.  In about 10 years this technology will be cheap and plentiful.
Why other technologies will fail to arrive:
The state of the art now will be mainstream in 10+ years except at a lower-cost point. Holographic video, non-calibrated real-time motion capture, brain wave sensors are still all very primitive and even the state-of-the-art is not very reliable. In 10 years the results will improve, but few of these improvements will arrive at the consumer level.</div></summary>
  </entry>

  <entry>
    <title>Mocap technology Ive always wanted - inv</title>
    <link href="http://casuallyhardcore.com/blog/2009/05/04/mocap-technology-ive-always-wanted-invented-2-years-ago/"/>
    <id>http://yoursite/article/?i=a6085ab2f47d656555565a37d58a2d7c</id>
    <updated>2009-05-04T15:31:15-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/05/04/mocap-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Imperceptible Photosensing Marker Tags for Location + Orientation + Incident Illumination + Reflectance + Unique Id Capture in Ambient Light at 500Hz, for inexpensive(
</div></summary>
  </entry>

  <entry>
    <title>Characteristics of the Amateur Actor (wr</title>
    <link href="http://casuallyhardcore.com/blog/2009/04/04/characteristics-of-the-amateur-actor-written-in-1938/"/>
    <id>http://yoursite/article/?i=2bb3c75cb4a58f8bc12138adde06d850</id>
    <updated>2009-04-03T23:30:44-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/04/04/charac</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I stumbled upon an old article about amateur actors that can be applied to amateur game designers (I would classify myself as amateur) 70 years later. Being young and lacking in experience means that the art one creates is lacking in honesty. I can&#8217;t wait until game designers mature and begin to design/build games with the same emotional sophistication as award-winning plays + novels.
With these three possible methods in mind, let us turn to the amateur actor. Let us ask ourselves just what sort of material he is; of what he is capable and incapable; what he can be made to do.
The majority of amateur actors in the United States are young men and women of high-school and college age; the amateurs are made up largely of students. Their ages testify that they are likely to be immature mentally; their occupations as students, that they, perhaps, possess an intelligence above the average.
Indeed, upon examination, the amateur is found to possess a good mind and an amazing potpourri of information. He knows some history, literature, and science; perhaps a smattering of foreign language, though he is the exception if he can speak any language besides English. He reads magazines, current books, a few plays; he has picked up quite a bit of information and misinformation at the movies. His reasoning powers are not yet well developed; he has no philosophy of life that is his own (but he appropriates the latest philosophy he has heard or read for his immediate need, which is not great). His schooling has given him a fair power of concentration, an ability to listen and to under-stand what is said to him. And he has quick perception.
The amateur is weaker in imagination than in intelligence. Not that he possesses no imagination; he has one, but he is out of practice in using it. At a much younger age, his imagination provided him with many a grand adventure; but the public schools, which make a fetish of democracy, have geared his work for the majority, which means for the group below his capacity; and things other than the preservation and encouragement of the imagination are considered practical and important for the great lower groups. So he has taken on the habits of his companions and has used his imagination less and less until now he rarely exercises it at all.
He is still weaker in knowledge of and experience with the emotions. Of course, he is still young; he has, perhaps, lived a sheltered, uneventful life and has experienced no deep emotion. But the schools are partly to blame for this ignorance of emotional knowledge. The amateur has received no education in the emotions. Expression of feeling has been frowned upon by his teachers and laughed at by that &#8220;majority&#8221; among his companions of whom we have spoken. He has been permitted to experience sensations, shocks, thrills, but he knows little or nothing about the emotions of terror, pity, love&#8212;those emotions which he will be called upon to express on the stage. He is capable of understanding and feeling emotions, but he is without experience with them.
These observations constitute three general characteristics which our examination of a number of American amateurs (whose ages we have arbitrarily placed at eighteen or twenty) would be likely to reveal to us. Turning to the physical qualifications for acting, we would discover that our actors possess bodies that are well developed. Both the men and women have played strenuously as children and have continued to play in some form of athletics in school and college. Here and there one may be found who is awkward in the manipulation of his body, though, frequently, these young people handle their bodies reasonably well. They do not, however, use them with power or effete tiveness. Grace and rhythm of movement are usually lacking, and a strength and a sense of pride which give the body a theatrical effectiveness are unknown to most beginners.
The voices of our actors are found to be harsh and unpleasant, though there has been an improvement in vocal quality in recent years. Still, a full, resonant voice, which is a joy to hear, is seldom discovered. This matter of the cultivation of a good speaking voice has also been neglected in the schools. The actor, however, generally speaks the English language commendably, when we consider his training and his speech environment. Compared with the best standards, he speaks his language carelessly and incoherently; compared with the speech of the streets, he does remarkably well.
Perhaps, then, we are able to visualize this young actor sufficiently for a general characterization. He seems to be a keen, responsive, but immature, person whose imagination is dormant, whose emotional experiences and training have not been important; his body is adequately developed but untrained for acting; his speaking of his language is better than his vocal quality; and he does possess a capacity for accomplishment and development.</div></summary>
  </entry>

  <entry>
    <title>All I learnt at GDC</title>
    <link href="http://casuallyhardcore.com/blog/2009/04/04/all-i-learnt-at-gdc/"/>
    <id>http://yoursite/article/?i=44d4aa49fc6002b800c615ccd4716292</id>
    <updated>2009-04-03T23:30:44-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/04/04/all-i-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In lieu of a real post-GDC post, I offer you Mega64
</div></summary>
  </entry>

  <entry>
    <title>Looking for meat billboards @ GDC</title>
    <link href="http://casuallyhardcore.com/blog/2009/03/17/looking-for-meat-billboards-gdc/"/>
    <id>http://yoursite/article/?i=c48571ca764606e2744ed1d1015ad7ae</id>
    <updated>2009-03-17T14:00:35-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/03/17/lookin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;ve been making T-shirts for GDC and now need pieces of meat to slap them on - MUWAHAHAHA&#8230; I mean, I need willing and helpful and friendly volunteers to display The Supers artwork on.









</div></summary>
  </entry>

  <entry>
    <title>You know the game industry is insular.</title>
    <link href="http://casuallyhardcore.com/blog/2009/03/16/you-know-the-game-industry-is-insular/"/>
    <id>http://yoursite/article/?i=0fb4fa93963f236ab3e6819404dcc7da</id>
    <updated>2009-03-16T04:30:54-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/03/16/you-kn</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">When two of the most successful games in the past 3 years get no mainstream gaming press coverage. 


I was expecting GDC 2009 to be more open (appealing to a wider audience) but for most part it&#8217;s still 80% hardcore gamer focused with a small dabbling of the rest - mobile, virtual worlds, casual games, serious games, indie games.
Thankfully Habbo Hotel is getting press coverage, but that&#8217;s due to the developers speaking at conferences
</div></summary>
  </entry>

  <entry>
    <title>Games Of 2020 (my entry) - This Is Your </title>
    <link href="http://casuallyhardcore.com/blog/2009/03/06/games-of-2020-my-entry-this-is-your-house/"/>
    <id>http://yoursite/article/?i=d9ef9b89be9b92a2600373b309b0142e</id>
    <updated>2009-03-06T16:01:02-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/03/06/games-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">On a whim, I submitted a quick-and-dirty home decorating game idea to Gamasutra / Mountain Dew&#8217;s Green Label Gaming contest. I didn&#8217;t win, but a friend did (congrats Jim) who wrote a humorous entry.  
I&#8217;m posting my entry here because I WANT somebody to implement this and it&#8217;s my stress-relief from prepping for GDC and I tend to openly share game concepts. Disclaimer: Would I play this game? No. On the other hand, I will never play Halo 3 and COD4. I&#8217;m neither a casual nor hardcore gamer. My mother would be addicted to this game.

This is Your House

Summary:
Home decorating show + game combination made possible with easy to use touch-displays and improved 3D graphics. The future will be a friendlier, nicer now.
What:
The most popular game in 2020 will be a home decorating show/game, This is Your House. 

Each week an exotic house is profiled and explored in the TV show section, but afterwards the viewer/player can re-arrange all the furniture + props + doors to score the optimal air-flow, light-flow, sound quality, etc. 
Gameplay:

Begin with empty room &#8211; similar to the one in the show.
Drag and drop (using finger) furniture from the right side of the screen to the room.
Press &#8220;score&#8221; to get a ratings for:

Air flow (prevent stuffy rooms with large furniture block air paths)
Uniform light (place windows + lamps optimally)
Colour/pattern variation (who wants to live in a grey room?)
Acoustic quality of room (is the room good for audio listening?)


Technology like fluid simulation, acoustic rendering, and final gathering will be used to score the player.  Complex algorithms implemented for mainstream uses.

The show/game will scan the objects in the house into 3D models for the player to use.  3D graphics should be powerful enough such that the 3D models will be nearly photoreal. Technology like this is beginning to pop up (see Mental Ray RealityServer):

Results can be shared online. Custom patterns for furniture, drapes, etc. can be created by placing a real object in front of the webcamera (all consoles and TVs will have one built in). 

Real pieces of furniture can be ordered in the game&#8230; so the game is part 3D IKEA catalogue, 3D game, 3D television show&#8230;. mixing passive entertainment (TV) with online sales (furniture catalogue) and world-building (game).

This is Your House is a better &#8220;virtual world&#8221; than Second Life - it will be accessible to grandmothers and children alike. There&#8217;s no Second Life porn, there&#8217;s no weird goth people flying through the world and there are weekly furniture updates. This is Your House takes the best part of The Sims (home decorating) and makes it accessible to PC illiterate and also provides near-photoreal results.
The Sims now:

This is Your House (circa 2020):

The second most popular game will be a spin-off of This is Your House - called This is Your Garden where players grow virtual gardens. Again, the interface will be the touch-sensitive LED display.
How:
In 2020 we should have paper-thin touch-sensitive displays that can be &#8220;taped&#8221; to any surface like a desk or wall. Homes will have a 8 feet by 4.5 feet display &#8220;taped&#8221; to a wall. 
Sony and Phillips low-power LED displays (now):

Like how LCDs replaced CRTs, low-power/thin LEDs will replace LCDs. These displays can be used as touch-sensitive input devices - no different from what you see in Star Trek and other Sci-Fi movies.

The games of the future will be less and less like hardcore games of today. 
The mainstream will be playing games without consciously &#8220;knowing it.&#8221; These &#8220;universal games&#8221; will be integrated with television shows as the display also acts like a touch-sensitive surface. A separate touch-sensitive LED display can be used as a remote/joystick if the player does not want to play standing upright.

Why home decorating:
In the future, gaming will become mainstream more than even the Wii has. The nature of gaming will change. Instead of hardcore violent fantasies we get reality-TV like fantasies of home decorating, gardening, fashion, being a celebrity, etc. that also act like marketing tools. Advergaming to the extreme made possible by technology that seamlessly blends into our normal life.
Why LED displays:
Time and time again, history has shown us it takes about 10 years for research or high-end technology to make it into mainstream.  High-definition digital video was available to visual effects production houses in the mid-to-late 90s. 3D graphics cards for the consumers appeared around 1996 after this technology had been available in high-end SGI workstations since 1982.

What is appearing now in 2009 is &#8220;digital paper&#8221; - low-power thin LED displays.  In about 10 years this technology will be cheap and plentiful.
Why other technologies will fail to arrive:
The state of the art now will be mainstream in 10+ years except at a lower-cost point. Holographic video, non-calibrated real-time motion capture, brain wave sensors are still all very primitive and even the state-of-the-art is not very reliable. In 10 years the results will improve, but few of these improvements will arrive at the consumer level.</div></summary>
  </entry>

  <entry>
    <title>This is exactly what Ive experienced</title>
    <link href="http://casuallyhardcore.com/blog/2009/03/04/this-is-exactly-what-ive-experienced/"/>
    <id>http://yoursite/article/?i=ecb52a4dcdac9f8fcc3ad37782ba79cc</id>
    <updated>2009-03-04T04:00:43-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/03/04/this-i</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Today&#8217;s Gamasutra article mirror&#8217;s my personal experience. From concept to final animated game model is a series of COSTLY iterations which is why drawings and a game design document mean crap and why &#8220;lightweight&#8221; iteration is preferred over building &#8220;final-quality&#8221; models.


And as he says, &#8220;the problems are too varied and the expertise necessary to anticipate them belongs to too many people &#8212; animators and riggers, designers, engineers, as well as concept artists and modelers. There is no way to plan it all out on paper.&#8221;
&#8220;Treat the early models and rigs as tools for refining and proving the concept, not early jumpstarts on the grind of production. Even rapid prototyping can&#8217;t completely eliminate glitches, but it can help to insure that they are fewer in number and that they are less costly in terms of work wasted and time lost. &#8221;
Plan all you want&#8230; the answers (is it fun, is it practical, etc.) are in the prototype.</div></summary>
  </entry>

  <entry>
    <title>Gaming in 2020</title>
    <link href="http://casuallyhardcore.com/blog/2009/03/01/game-in-2020/"/>
    <id>http://yoursite/article/?i=83459cedae973d0136a9520c7ef3e970</id>
    <updated>2009-03-01T00:01:08-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/03/01/game-i</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This contest has got me thinking about the future in 11 years. I&#8217;m sure 90% of the applicants will choose some far fetch technology like holographic video. What&#8217;s been proven over time is that research takes about 10 years to enter the mainstream so what&#8217;s being published as state of the art now will be practical in 2019. 

All of this HD video stuff is old hat as I dealt with $250K D5 VTR (Video Tape Recorder) way back in 1998 that could record near film-quality (HD) digital video. It took 10 years to bring this technology to the mainstream.
So what about Holographic video? It&#8217;s still very primitive. I remember all the MIT research in the late-90s about it, but the technology to send out the interference patters (holograms) was crude back then and still is. Computer bandwidth is also a major concern. PCs can barely handle playback of a single stream uncompressed HD video&#8230; let alone the amount of data required for holograms.
What&#8217;s more plausible is haptic display surfaces like Microsoft Surface where the research is about 10 years old now (MIT Tangible Bits)</div></summary>
  </entry>

  <entry>
    <title>Yes, original IP games do sell!</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/27/yes-original-ip-games-do-sell/"/>
    <id>http://yoursite/article/?i=61666dad2472e7a37b5903b85bc1641f</id>
    <updated>2009-02-27T00:01:16-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog/2009/02/27/yes-or</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">De Blob on the Wii sells 700K units.</div></summary>
  </entry>

  <entry>
    <title>The Supers (prototype) update</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/20/the-supers-prototype-update/"/>
    <id>http://yoursite/article/?i=2fae19e7a7296f94342f53f474867cea</id>
    <updated>2009-02-19T23:30:28-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s been 8-9 months since I&#8217;ve posted any images on my project&#8230;. here are some short videos demo-ing the shaders + animation:
The Supers - Beetle turntable from Nelson Yu on Vimeo.
The Supers - Hero turntable from Nelson Yu on Vimeo.
And one demo-ing some early problems with physics:
The Supers - Physics FAIL from Nelson Yu on Vimeo.</div></summary>
  </entry>

  <entry>
    <title>Brain dump - What I learnt from GDC 2008</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/15/brain-dump-what-i-learnt-from-gdc-2008-one-year-later/"/>
    <id>http://yoursite/article/?i=9d28a875c876c209b559d4db5a835c80</id>
    <updated>2009-02-15T11:30:35-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here are notes I almost made right after attending GDC 2008 (last year) talk about finding angel investor funding for games. None of it makes sense raw so I&#8217;ll add comments at the end:
Lots of money
Angels for bridge
Tailwinds
Simple &#038; compelling
Pitch first
Team > Idea
Bootstrap!
Reputation!
Keiretsu
Gameplayholdings
http://www.garage.com/
10 Slides
20 Minutes
30 Font size
Unaccredited investors - BAD
Exit strategy
My comments:

Lots of money - Angels / VC have piles of cash seeking out worthy investments.

Angels for bridge - Angels (personal investors) are great for temp funding right after the bootstrap stage.

Tailwinds - Your project should have some relation to the current fads - MMO, Social networking, Web, advergaming, etc.

Simple &#038; compelling - The sales pitch must be understandable and convincing.

Pitch first - i.e. Try out your idea first to see if the response is positive rather than building something nobody wants.

Team > Idea - because investors pay nothing for an idea and want to see a solid team/management in place. &#8220;Success&#8221; in the end is related to the talent/experience of the team. Artistically this means &#8220;process&#8221; takes precedent over &#8220;ideas&#8221; and &#8220;creativity&#8221;

Bootstrap! - Build it because nobody will believe you can until you do and also nobody will fund you unless you are proven.

Reputation! - Build one from the start. Nothing screams failure than working on money-losing, late, canceled projects all your life. IMO this is good and bad advice. It&#8217;s great advice to steer away from poorly managed, low-success projects, but at the same time high-profile work can be emotionally/personally devoid.

Keiretsu - An organization of angel investors

Gameplayholdings - An advisory company.

http://www.garage.com/ - Guy Kawasaki&#8217;s company

Notes about game pitching - short and simple

10 Slides
20 Minutes
30 Font size
Unaccredited investors - BAD - because of SEC/US rules. You want accredited investors (net worth of a $1M?) to avoid lawsuits and because future investors often need to buyout previous ones. It&#8217;s complicated, but avoid taking large sums from friends and family if you are starting a potentially mid-to-large sized studio.
Exit strategy - All studios/projects have to pay out sometime, how?


To summarize - none of the above should concern independent developers! The above is for people wishing to form the next spin-off studio made up of ex-EA, ex-Sony, ex-Activision employees.</div></summary>
  </entry>

  <entry>
    <title>The game industry needs less Jon Blow an</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/15/the-game-industry-needs-less-jon-blow-and-more-paolo-pedercini/"/>
    <id>http://yoursite/article/?i=7778c3deb6768cc98c06136a562b8a6b</id>
    <updated>2009-02-15T10:00:49-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A few nights ago I attended a small gathering in Toronto by the Hand Eye Society - which is a new group dedicated to getting local indie developers together for a social rather than for professional reason (like IGDA).
The main speaker of the night was Paolo Pedercini who is infamous for his political games:


His games try to &#8220;make a difference&#8221; to the world - they are socially + politically relevant. I make games for pure entertainment sake (enjoyment). Paolo makes games because he wants to change the world or show the world its flaws - in an &#8220;entertaining&#8221; way rather than in an essay or article.
The world needs more Paolo Pedercini - well he does once in a while delve into uber-touchy subjects: Pedopriest


Once again the Church is in the midst of controversies for the sexual abuses committed by the priests. The Vatican created a task force to prevent sinners from being captured and put on trial according to the secular states&#8217; laws. You have to control the operations: estabilish a code of silence and hide the scandal until the media attention moves elsewhere!
</div></summary>
  </entry>

  <entry>
    <title>My twitter account</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/15/my-twitter-account/"/>
    <id>http://yoursite/article/?i=0bb5154bfde6c211cfa1e0c74c90d1e6</id>
    <updated>2009-02-15T10:00:49-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Where I post small development updates (rather on this blog):
http://twitter.com/sunnyleo</div></summary>
  </entry>

  <entry>
    <title>Kids these days</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/11/kids-these-days/"/>
    <id>http://yoursite/article/?i=74a73cdc2c61f1b7b6eb4b9da50ba6ac</id>
    <updated>2009-02-11T04:00:25-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">9-year old writes successful iPhone painting application

&#8220;Lim, who is fluent in six programing languages, started using the computer at the age of 2. He has since completed about 20 programing projects.&#8221;
When I was his age, I was copying BASIC programs from magazines. I stop after 3 I think. My brother continued on and ended up working for REALbasic.</div></summary>
  </entry>

  <entry>
    <title>Another ex co-worker success story</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/09/another-ex-co-worker-success-story/"/>
    <id>http://yoursite/article/?i=a7a4c0148ebd7dccc3d3f4dcb05f5d6b</id>
    <updated>2009-02-09T14:30:55-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In a different vein, I discovered another non-game developer ex co-worker (a mouthful there!) programmed a little game on his spare time which became commercially successful (I got direct figures, but I won&#8217;t quote them here) on this Sudoku game:
</div></summary>
  </entry>

  <entry>
    <title>Congrats to Mike Kasprzak / Sykhronics E</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/09/congrats-to-mike-kasprzak-sykhronics-entertainment/"/>
    <id>http://yoursite/article/?i=e7bf01dc5225f0e42fcdafcfd1e64a46</id>
    <updated>2009-02-09T14:30:55-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">An IGF 2009 mobile finalist (and ex co-worker of mine):
</div></summary>
  </entry>

  <entry>
    <title>Its all about gameplay! Its all about st</title>
    <link href="http://casuallyhardcore.com/blog/2009/02/06/its-all-about-gameplay-its-all-about-story/"/>
    <id>http://yoursite/article/?i=c5dc39e76fc9ed2abfccf5496386133f</id>
    <updated>2009-02-06T04:00:36-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s all a pile of BS. It&#8217;s true. Thousands of developers &#8220;claim&#8221; to focus on gameplay just like thousand of animators &#8220;claim&#8221; to focus on story&#8230; but in the end, I&#8217;ve always believed the final quality is related to the average skill/talent of the people who made the game/film no matter what the ideologies the people espouse. 
Ed Catmull (of Pixar fame) talks about how many studios &#8220;focus on stories just like Pixar&#8221; but fail to deliver quality storytelling &#8220;just like Pixar.&#8221; He believes it&#8217;s the people who contributed the most to Pixar&#8217;s success and so I do.
Catmull says, &#8220;If you give a good idea to incompetent people, they will ruin it. If you give a bad idea to a great team, they will fix it.&#8221;
Here&#8217;s his Stanford talk about Pixar and why it has been successful.
His main motto is: The difference in a successful company and a failed one is &#8220;the people.&#8221;</div></summary>
  </entry>

  <entry>
    <title>Indie is cool, but why?</title>
    <link href="http://casuallyhardcore.com/blog/2009/01/14/indie-is-cool-but-why/"/>
    <id>http://yoursite/article/?i=27bc1a95451d57d874ff3f1f0488e887</id>
    <updated>2009-01-14T05:30:26-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Indie game development has been the &#8220;it&#8221; thing to do for the past two years:

&#8230;following on the footsteps of indie music and film. A few developers I&#8217;ve met are more into the &#8220;idea of indie&#8221; rather than &#8220;being indie&#8221; - which to me is: to do the hell what you what regardless of commercial consequences.
Rarely do I digress into such pointless philosophical debates such as &#8220;indie vs. mainstream&#8221; and &#8220;what it means to be indie&#8221; because the end result is that indie game development isn&#8217;t much different than independent film. As they filmmakers say, &#8220;People knock Hollywood for their formulaic movies but the indie world is just as predictable.&#8221; I&#8217;d guess 95% of indie games are simply re-hashed old game ideas. Heck, my project started off as a bit of a re-hash and only developed its own style over time.

It&#8217;s no surprise that prominent indie game developers, like Jon Blow, have moved away from &#8220;innovation&#8221; and accepted some formula i.e either making a genre game or using existing ideas. I do believe indie games should be &#8220;artful&#8221; - in that they are works of expression by an artist (game developer) trying to evoke emotions or convey an idea. I don&#8217;t believe they should be crude pixelated junk like 
The Marriage

OR Passage

..because a piece of art is a sequence of well thought out decisions and I find in both games, the decisions to be weak.
The Marriage explains - &#8220;I wanted a game that the graphics and other elements took second stage. So for example Chess is a great game whether playing with stones or diamond encrusted ivory sculpted pieces. One should not assume the game is incomplete because of its graphical simplicity, I cheated a little here by using colour symbolism similar to painting. This is also the reason there is no sound to the game, any element I could remove that got in the way of the game itself I did. Sound and music is a very powerful medium in and of itself, I feared its inclusion would overwhelm the subtle message of the game.&#8221;
From playing The Marriage, I feel there might be two layers of meaning, but both are fairly superficial, need excessive explanation, and do not evoke any emotions from me. In storytelling, the hidden layers below the surface is called subtext. There doesn&#8217;t seem to be much subtext in The Marriage or it&#8217;s poorly conveyed.
To borrow a cliche - subtext is like &#8220;layers of an onion&#8221; - peel each one and another is revealed below.

I&#8217;m more intrigued by flOw and the Grow series of games than The Marriage. Heck, the original SimCity had artistic depth. 

i.e On the surface, you were a city planner, but complex emergent behavior arose from your actions. Will Wright is an artist, no doubt. He has an idea and set of emotions he wants to convey and executes them in a multi-layered experience via &#8220;a game.&#8221; 
OTOH, the overhyped BioShock is about as deep as Britney Spear&#8217;s music. You can not force subtext. It&#8217;s NEVER overtly spoken about.</div></summary>
  </entry>

  <entry>
    <title>XBLA sales - booms and busts</title>
    <link href="http://casuallyhardcore.com/blog/2009/01/05/xbla-sales-booms-and-busts/"/>
    <id>http://yoursite/article/?i=259bd8ed349799a4d5bc4a8f22a8b9c9</id>
    <updated>2009-01-05T19:30:35-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">For indie developers, XBLA (and PSN) seem to be viable platforms, but there are warning signs that all is not well. Here at the top 20 XBLA sellers.
From Major Nelson
Top Arcade Titles of 2008 (Full Versions purchased)
Note: Bolded are original games from indie studios.

Castle Crashers
Geometry Wars: Retro Evolved 2
Braid
A Kingdom for Keflings
UNO
Super Street Fighter II Turbo HD Remix
Fable II Pub Games
Duke Nukem 3D
Bionic Commando: Rearmed
Worms
SOULCALIBUR
Portal: Still Alive
DOOM
1942: Joint Strike
Bomberman Live
MEGA MAN 9
N+
Wolf of the Battlefield: Commando 3
Marble Blast Ultra
Ultimate Mortal Kombat 3

If you dig deeper using sales data from vgchartz have been some busts&#8230; either mediocre sales or outright big busts considering the cost of development + VMC testing and ESRB + PEGI ratings.
The following 50 games probably have lost money. I&#8217;d say sub-10,000 units is pretty pathetic (saleswise) and definitely very concerning. A few here are recent releases (Age of Booty, Vigilante 8 Arcade, etc.) that will likely recoup by the end of 2009. I do not believe in long-tail for XBLA games as new releases drastically push down sales figures of previous releases.
Note: Bolded are original games from indie studios.


Name
Price
Units LTD
Revenue LTD


CrazyMouse
$5.00
1,766
$8,832


Shotest Shogi
$10.00
2,412
$24,120


Shred Nebula
$10.00
2,861
$28,608


Double D Dodgeball
$10.00
3,504
$35,040


Beat &#8216;N Groovy
$10.00
4,090
$40,896


Frogger 2
$10.00
4,750
$47,496


Shadow Assault/Tenchu
$10.00
4,800
$48,000


Go! Go! Break Steady
$10.00
6,002
$60,024


Live Draft Tracker
$5.00
6,672
$33,360


Coffeetime Crosswords
$10.00
7,250
$72,504


RocketBowl
$10.00
7,608
$76,080


Pirates vs. Ninjas Dodgeball
$10.00
8,470
$84,696


RooGoo
$10.00
8,686
$86,864


MLB Stickball
$10.00
8,777
$87,768


Live Score Tracker
$1.00
9,638
$9,638


TiQal
$10.00
10,112
$101,116


Discs of Tron
$5.00
10,596
$52,978


War World
$10.00
10,714
$107,136


Penny Arcade Adventures 2
15
10,838
$162,576


Bliss Island
$5.00
10,876
$54,382


Elements of Destruction
$10.00
10,975
$109,752


Screwjumper!
$10.00
11,009
$110,093


Are You Smarter Than a 5th Grader
$15.00
11,465
$171,972


Shrek &#8216;N&#8217; Roll
$10.00
11,607
$116,069


Gin Rummy
$5.00
11,784
$58,920


Rocketmen: AoE
$10.00
11,925
$119,254


Tempest
$5.00
12,085
$60,425


Domino Master
$10.00
12,420
$124,200


StreetTrace: NYC
$10.00
13,344
$133,110


Rocky &amp; Bullwinkle
$10.00
13,444
$134,438


Warlords
$5.00
13,495
$67,476


Happy Tree Friends: FA
$10.00
13,661
$136,608


Geon: Emotions
$10.00
14,289
$142,890


Wits &amp; Wagers
$10.00
14,947
$149,472


Aces of the Galaxy
$10.00
15,154
$151,536


Sealife Safari
$19.00
15,154
$194,779


Vigilante 8 Arcade
$10.00
15,293
$152,928


Samurai Shodown 2
$10.00
15,379
$153,792


Lost Cities
$10.00
15,606
$156,055


Cyberball 2072
$5.00
15,934
$79,669


Battlezone
$5.00
16,002
$80,010


Schizoid
$10.00
17,148
$171,480


Spongebob Underpants Slam!
$10.00
19,489
$194,886


Space Giraffe
$5.00
19,934
$99,669


Age of Booty
$10.00
21,581
$215,808


Gripshift
$10.00
21,690
$216,897


Wing Commander: Arena
$10.00
22,970
$228,152


Ecco: The Dolphin
$5.00
23,677
$118,386


Yie Ar Kung Fu
$5.00
23,679
$118,395


Commanders: AotG
$10.00
25,053
$250,531



Again, considering cost of development is anywhere between $200K to $600K for a XBLA title, the above sales figures are horrible. </div></summary>
  </entry>

  <entry>
    <title>The Future is in Game Design houses.</title>
    <link href="http://casuallyhardcore.com/blog/2008/12/20/the-future-is-in-game-design-houses/"/>
    <id>http://yoursite/article/?i=c849c0fbfd9769af9c3825d58050203f</id>
    <updated>2008-12-20T17:30:48-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m seeing the separation from designer and implementator strongly in the animation/film business and believe that the game business will follow suit. What this means is we will have &#8220;game design houses&#8221; that specialize solely in creating new game ideas, mocking them up, and finally passing them on to development studios to fully implement.
So instead of publisher + developer we will have publisher + gameplay/art/sound design studios + developer (probably overseas)&#8230; a natural progression in our specialization crazy world.
For example, the ad business you have AKQA:

Why will this happen? Because of two reasons:

It&#8217;s cheaper to hire a developer overseas in Eastern Europe or Asia than one based in North America (for publishers it&#8217;s about the bottom line). The entire animation business went this route about 30 years ago and has never looked back.
Many North American development studios are horrible at game design even though they are fantastic at the implementation aspect(high polished art + amazing tech). Design has become as important as the implementation aspect. No longer can studios just be a collection of great artists and great programmers, there also needs to be great designers which are in short supply. In animation you can spend more time in pre-production than actual production due to the sheer volume of decisions that need to be made early on.

For indie game studios there are three paths to take:

Become cheaper than others so the shift overseas does not adversely affect you.
Produce higher-quality games - either better game design or better tech (or both)
Transform into one of the specialized game/art/sound design houses.
</div></summary>
  </entry>

  <entry>
    <title>Irradiance volumes</title>
    <link href="http://casuallyhardcore.com/blog/2008/11/13/irradiance-volumes/"/>
    <id>http://yoursite/article/?i=146d5d7d987e6fa9bbbf2b09571ebc79</id>
    <updated>2008-11-13T09:00:26-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">About 5 years ago, creating spherical harmonic values for irradiance volumes was painful. There were no tools, just a hodge-podge of code strung together with scripts. 
Turtle from Illuminate Labs now makes it trivial. 

You can bake everything from Ambient Occlusion to Radiosity Normal Maps to spherical harmonic coefficients with ease and full control (with Lua-based shaders). Amazing what art tools can do to increase productivity and quality.
BTW Turtle / Beast was used in Mirror&#8217;s Edge which looks like it was globally illluminated perfectly (see the cool sky mix with the warm sunlight).
</div></summary>
  </entry>

  <entry>
    <title>Multi-way / Bi-directional constraints i</title>
    <link href="http://casuallyhardcore.com/blog/2008/11/13/multi-way-bi-directional-constraints-in-maya-2008/"/>
    <id>http://yoursite/article/?i=244678e109b24b93d0d883f772f63d09</id>
    <updated>2008-11-13T07:30:24-08:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I spent some time learning about bi-directional constraints in Maya via this and have re-compiled and re-packaged the plugin for Maya 2008 (the version I own and use).


Here it is - BiDirectional_Maya2008.zip
Constraints are typically unidirectional which means if you want to hand be the &#8220;controller&#8221; (i.e pivot) of an arm then the shoulder can&#8217;t be the &#8220;controller&#8221; of the hand without a complex rig. The animator won&#8217;t notice a difference, but the rigging process is long and involved with such requirements.
With bi-directional constraints, this dual control scheme is much easier to implement and more importantly - NATURAL!</div></summary>
  </entry>

  <entry>
    <title>IndieLib competition</title>
    <link href="http://casuallyhardcore.com/blog/2008/10/30/indielib-competition/"/>
    <id>http://yoursite/article/?i=a5ce7ddf8020e28cdb37fe875b232f3b</id>
    <updated>2008-10-30T03:00:37-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">IndieLib - my favourite 2D engine is running a competition in November (1st to 30th)

IndieLib is also now LGPL (open source)</div></summary>
  </entry>

  <entry>
    <title>The Language of our Times</title>
    <link href="http://casuallyhardcore.com/blog/2008/10/04/the-language-of-our-times/"/>
    <id>http://yoursite/article/?i=0d8470d67e1bcb0a50a6b033b5e591f6</id>
    <updated>2008-10-04T21:00:30-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Nick Pugh in &#8220;Originality in Design&#8221; talks about creating an unique visual language, an iconography for your work. We copy and borrow from modern pop culture all the time, so it&#8217;s often difficult to create something truly &#8220;original&#8221; or &#8220;unique&#8221; - especially within a known genre. 
Nick himself, fights with creating original car designs - an area with very specific constraints.


How he approaches it is to free draw &#8220;garbage&#8221; for an hour or so. Writers will perform a similar task by free-writing for a dozen or so pages before attempting something specific. It loosens up the mind to be creative and effectively kills the inner critic.

There is a theory that creating anything original is impossible, because all the ideas have been thought of. Originality is not the goal in my opinion.
It&#8217;s all about creating an &#8220;iconography&#8221; which, to me, means something distinctive enough that others will copy it in the future. 
Often you&#8217;ll see the borrowing of iconography in advertising because they need to make an impact quickest - thus must &#8220;borrow&#8221; their style. 
Warhol has been cloned in ads (and he borrowed plenty himself). 
(Pepe Jeans)

(Levi Jeans)

Back in the mid-90s, his b&#038;w montage photos were also borrowed by Guess Jeans and were the first things you saw when you opened a copy of Rolling Stones (the magazine).
A cliche had to originate from somewhere (mostly that William guy!)&#8230; it wasn&#8217;t a cliche to start with, but became one from overuse. 
Modern/recent iconography:

Geometry Wars. It modernized the neon-geometric iconography of the early 80s.

Apple ads (many of these have become iconic):


Toy Story - Introduced the mainstream to plastic computer graphics rendering.

The Matrix - Bullet time and green symbol art.


The Matrix borrowed plenty of iconography itself: leather-bound fetish wear, Snowcrash and other cyberpunk novels&#8230;. but yet it was considered somewhat original. All because of bullet time + techno-art and how that film integrated those elements. 
Without a distinctive language, your game / novel / piece of art will get lost in the noise. The iconography acts as your best ad.</div></summary>
  </entry>

  <entry>
    <title>Lost in Translation</title>
    <link href="http://casuallyhardcore.com/blog/2008/10/02/lost-in-translation/"/>
    <id>http://yoursite/article/?i=3e7f603a6d2af6c180dccdd6d3adaea3</id>
    <updated>2008-10-02T04:00:15-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s been a tough month - I&#8217;ve been ill or away at weddings or random conferences. At least I&#8217;ve been awarded a Telefilm extension on the project!
Anyhow, I&#8217;ve had to let go some junior/intermediate artists unfortunately. There&#8217;s a well known axiom called &#8220;Cheap, Fast or Good - pick two&#8221; and I&#8217;ve encountered it.

I assumed most intermediate artists were pretty similar - given a detailed design (i.e concept art / model sheet) I could pick any 3D modeler and have a good final result. With programmers, I do not think this way. I prefer the most senior programmer over a dozen junior programmers, but with managing artists, I&#8217;m new to i. Well, junior/intermediate 3D modelers are typically cheap and try to be fast, but the end result is not very good. 
The problem is of translation - between design and 3D model. I&#8217;ll provide an example from &#8220;The Art of Game Characters&#8221; book. It has pages upon pages of concept art (and sometimes their final result in game).
Original:

Final result:

This is a pretty extreme example as the woman looks nothing like the design and the general is not even fat! The original designs exudes personality and had a distinctive style, but the final models are dull and generic. The modeler (or modeling supervisor) decided to go in a different direction or did not have the skill to execute the original design (which is quite challenging). I suspect the concepts were deemed too difficult and beyond the skill of the modelers so it was dumb down to traditional human proportions.
For The Supers, I performed a test - I gave 5 modelers - from junior to senior - the same building design and told them to try to match it but they were free to add to it if they feel it makes the model better. 
The result: 5 completely different models were returned - varying polygon counts, varying artistic consistency, closeness to design, etc. Being a non-artist, this really surprised me!  The original (2D) design was pretty well-defined to me, but each modeler took a slightly different direction&#8230; and best models were by senior artists who have that &#8220;artistic sense&#8221; lacking in the the ones by juniors. How did I define best? Lowest poly count (technical), pleases everybody who sees it (artistic), cleanest geometry (technical), matches the original design (artistic). With the non-best models, I and many others would say &#8220;there is something wrong&#8221; but be unable to pinpoint it.

So I let go all junior/intermediate artists and kept only the senior ones on-board. The past few months, I had major problems with the junior/intermediate artists failing to match the designs which I originally attributed to poor communication between the art director and them, but my tests proved me wrong. The junior/intermediate artists also botched rigging and other 3D tasks rather badly so I began to clue in earlier, but blamed other factors (again, poor communication).
Seniors are more expensive, but at least their work doesn&#8217;t need to be re-done! So I&#8217;ve chosen Fast and Good over Cheap.</div></summary>
  </entry>

  <entry>
    <title>Ralph Bakshi clip</title>
    <link href="http://casuallyhardcore.com/blog/2008/08/24/ralph-bakshi-clip/"/>
    <id>http://yoursite/article/?i=a45c0d637a5d9eb6b6f0fe23c67e1183</id>
    <updated>2008-08-24T05:30:09-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Wow. This will forever be immortalized.
</div></summary>
  </entry>

  <entry>
    <title>On prototyping</title>
    <link href="http://casuallyhardcore.com/blog/2008/08/24/on-prototyping/"/>
    <id>http://yoursite/article/?i=ab3e4b0e505508e4ac1c0c9f697c3244</id>
    <updated>2008-08-24T05:30:09-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Chris Hecker and Chaim Gingold spoke at GDC 2006 about prototyping and I&#8217;ve only recently discovered it. I wish I had read it before I began my prototype because they discuss some gnarly issues I&#8217;ve encountered.
The powerpoint slides and MP3 audio are available here, but I&#8217;ll summarize the juicy bits.
1) Game Design Documents are truly useless in answering questions about a game like &#8220;Will it be fun?&#8221;

And that&#8217;s why we always need to prototype - to answer some hard questions scientifically (rather based on hunches). I completely agree with I&#8217;ve tossed large parts of my original GDD away because the GDD was based on speculation on what would be fun/easy/simple/understandable - half of which was wrong.

2) All prototypes try to answer hard questions so those questions should have yes/no answers that can be falsifiable. There is no point in asking a question that can not have an answer.

- Can this cooking game mechanic be made compelling?
- Can the player control driving a car using a video camera (i.e can the player deal with video processing lag)?
One thing Hecker + Gingold emphasize is failing early. The prototype&#8217;s goal is to answer the question as quickly as possible. 
Quick == Cheap
Cheap is good!
3) Cost vs. Quantity&#8230; due to economics you can not just create a prototype will full-art and gameplay and in the end you DO NOT WANT TO. Hecker and Gingold talk about answering questions as CHEAPLY as possible - steal, use existing art tools, mock stuff up, etc&#8230; anything to avoid actually building a prototype with code + art.
Now, eventually you will need to program code and create art - the question is how much of each?
They say code is VERY EXPENSIVE and non-linear as you will need to build an engine, physics, rendering, input, etc. even before any &#8220;prototyping&#8221; begins. The cost of content is flat throughout the prototype (and game). It can contribute to answering the prototype&#8217;s question from the start.


They argue that content is preferred over code - that means trying stuff in Maya or Max or an art tool first. In my prototype, I&#8217;ve spent far too much time building tech and too little on the gameplay / asking-answering questions bit. Code is necessary in my specific case, but I should not be building scripting systems or anything that is more technology than necessary for the prototype:

The reason why you still need to code is to answer some technical questions like&#8230; Can I get 30fps with 1M polygons on the screen? 

Their rule is &#8220;Only spend code where you need understanding; throw content at the rest.&#8221;
In my prototype, I needed answers to some hard physics questions that could not be answered using Maya-based art mock ups. I also had some critical pipeline and schedule/timeframe questions that if the answers were negative would have killed the project immediately. Remember, fail early!</div></summary>
  </entry>

  <entry>
    <title>The Supers (working title) update</title>
    <link href="http://casuallyhardcore.com/blog/2008/08/03/the-supers-working-title-update/"/>
    <id>http://yoursite/article/?i=cbf005e3d30ba926818f160bc1d375ec</id>
    <updated>2008-08-03T11:30:21-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m about a month or so behind schedule so I might as well talk about why:
 Implementing deformable collision is HARD
My giant robots require skinned collision (collision geometry deforms while the bones are animating) for the superheroes to walk on. Most physics engines will not allow non-static collision meshes to deform/animate and not only will they not allow that they won&#8217;t calculate physics afterwards.
I&#8217;ve had to create a low-resolution collision mesh that deforms and matches the visible mesh. All of this was expected and planned. At every frame, I grabbed the skinned/deformed data from the graphics engine and update the collision mesh. Performance-wise this sucks. This wasn&#8217;t planned. Mesh-to-mesh collision is slow and expensive. The hero is a sphere/capsule and the robot is a mesh, there shouldn&#8217;t be any problems, right?
Wrong.
Mesh-to-mesh collision occurs when the robot interacts with the buildings of the city&#8230; this results in an immediate frame drop to 5fps or worse. The robot&#8217;s 50K polygons try to collide with 3000 polygons of a building The results are brutal.
There are multiple solutions to this problem, but none that pleasant:

Mirrored physics worlds with ultra-low resolution geometry

Pro: Speed, separation from main physics
Negative: Sync issues with duplicate physics world, adding complexity to the art pipeline

Extending the physics engine to accommodate for multi-resolution collision detection

Pro: One unified physics world, can make-do with procedurally generated collision meshes (requires no artist)
Negative: Very complicated to modify the design of physics engines (i.e BULLET)


My solution is a mix of the two. I&#8217;ve created ultra-low resolution collision geometry for the robots using a script and while I&#8217;m not extending the physics engine, I&#8217;m using its facilities to filter out collision between two classes of objects. It&#8217;s not ideal, because this filter is accomplished closer to the narrowphase level.
Designing vertex/fragment shaders is HARD
Months ago, I roughly mapped out the look and feel of the heroes and robots. I knew I wanted a GI look of spherical harmonics and to avoid lambert + blinn rounded white hilights + specular.
So I designed shaders to use BRDF textures. I started with one BRDF texture then two then three&#8230; each to control different viewer vs. light setups. The result is a shader that can emulate toon shading to satin - while avoiding the circular hilights of lambert. Every new feature I added (normal maps + hardware skinning) had to be properly integrated into the existing shader which was time consuming.


The worst part is taking these HLSL/Cg shaders and migrating them into your engine, because it&#8217;s not as easy as 1-2-3. Each engine has their own methods of binding lights/cameras/matrices to shaders. In OGRE the binding is accomplished in .program and .material files. Thankfully there&#8217;s a python-based script available for FX Composer that exports a basic .material file (40% of the work), but the rest requires a lengthy trial and error phase.

mul(M,V) is preferred in OGRE vs. mul(V,M) in HLSL/FXComposer
Y texture co-ordinate flipping
Global variables in HLSL/Cg are horrible and should never have been allowed, but all shaders use them.

.fx/.cgfx passes have to be manually re-coded.
The shaders from FXComposer are unoptimized for OGRE - also, sample OGRE shaders work in local/tangent space whereas the FXComposer shaders operate in world space.

I don&#8217;t recommend writing your own BRDF shader. I&#8217;d take an existing one and modify it:


Being a producer, lead developer and lead technical artist is HARD
I thought once the prototype ramped up, my managerial roles would diminish, but in fact they have increased. While I&#8217;m assigning work to 3rd party contractors (I understand I can&#8217;t do everything), I&#8217;m spending just as much time checking the work and fixing it as I am on my own work. The rigging has proved most complicated, but that&#8217;s a topic for another post.
Other tasks that have proved difficult:

Robot rigging (it&#8217;s not a simple character with a single rig)
Threading
Designing the city
Building destruction

More next time&#8230;</div></summary>
  </entry>

  <entry>
    <title>All TOJam 3 games posted!</title>
    <link href="http://casuallyhardcore.com/blog/2008/06/30/all-tojam-3-games-posted/"/>
    <id>http://yoursite/article/?i=94c389a1d3e34684ac1cd294626789f2</id>
    <updated>2008-06-30T02:00:19-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">All 34 games of goodness&#8230;

One of my favourites is Office Smash:

Save a tree! Go play a game now!</div></summary>
  </entry>

  <entry>
    <title>Its taken a loooong time</title>
    <link href="http://casuallyhardcore.com/blog/2008/06/27/its-taken-a-loooong-time/"/>
    <id>http://yoursite/article/?i=10802a159d47ebb1ce683a0a7759faf8</id>
    <updated>2008-06-27T03:00:43-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">But now the first robot has been properly rigged and joined together in game. Unlike most 3D characters, the robots in The Supers are merely a collection 12-15 parts that are stitched together using dynamic parenting.
The second robot, after much haggling, is almost through the rigging process. The time frame estimates per robot have been blown due to the unusual nature of rigging.
The hero is essentially ready for animation.
Oh yeah, Telefilm Canada is now an official financial participant on The Supers!
</div></summary>
  </entry>

  <entry>
    <title>Waterfall vs. SCRUMM vs. Who cares, git </title>
    <link href="http://casuallyhardcore.com/blog/2008/06/08/waterfall-vs-scrumm-vs-who-cares-git-er-done/"/>
    <id>http://yoursite/article/?i=ceeab508962ecda3677181e307d81ed9</id>
    <updated>2008-06-08T06:00:38-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">My first two robots in The Supers went from concept/design to hi-polygon modeling (waterfall method) which is a complete mistake because any future changes requires a massive re-working. I suspect AAA games have this problem. Once something has been decided and implemented, changes are hard + problematic + expensive.
So I&#8217;ve decided to use a more iterative approach since my deadlines are not as firm as others. I plan to rough model each robot, add a rig, insert it into the game and test out the gameplay before going into hi-polygon modeling. This is more of the &#8220;prototype first then implement&#8221; methodology and I suspect it will provide a better end result, but cause the project to take longer than expected. 
An expensive game with a large team probably would bleed money and get canceled if it tried this method but that is the beauty of indie games - experiment, refine, experiment, refine!</div></summary>
  </entry>

  <entry>
    <title>TOJam Arcade - Sweet-as!</title>
    <link href="http://casuallyhardcore.com/blog/2008/06/08/tojam-arcade-sweet-as/"/>
    <id>http://yoursite/article/?i=b41f117b35cc02f927dc24ecad1858be</id>
    <updated>2008-06-08T06:00:38-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">100+ people showed up Friday night to attend the &#8220;screening&#8221; of the games made at TOJam 3 - all of thanks to the hard work of Jim, Em, and Rob.

It was a lot of fun to see games projected onto giant screens and have people play (or fail to play) them instead of hiding our works in some obscure directory on a hard drive never to be seen again.
Photos of the third jam can be found here/ Pictures of the Arcade night should be up very shortly.</div></summary>
  </entry>

  <entry>
    <title>Lack of workflow management systems for </title>
    <link href="http://casuallyhardcore.com/blog/2008/06/08/lack-of-workflow-management-systems-for-games/"/>
    <id>http://yoursite/article/?i=10e454a5c21472b864189348efb22101</id>
    <updated>2008-06-08T06:00:38-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s amazing, two years ago I looked for a public implementation of workflow management system for small media projects (like games) and now I still haven&#8217;t found an easy/cheap one. 
I&#8217;m not talking about version control system like Perforce or Alienbrain. I&#8217;m talking about Flickr-like access to concept art, web-based access to changes + comments (think blog/Drupal), easy file upload and download (the version control part) and the ability to set and track the status of an asset (think approval levels). The justification behind all this overhead is the ability to share assets with offsite artists without resorting to FTP and E-mails. With FTP and e-mails there is version explosion and a lack of metadata (comments, history, requested changes, approval level, etc.) connected to it
The animation + visual effects business has Tactic but it&#8217;s not open and tailored towards those industries.</div></summary>
  </entry>

  <entry>
    <title>Havok now for free</title>
    <link href="http://casuallyhardcore.com/blog/2008/06/02/havok-now-for-free/"/>
    <id>http://yoursite/article/?i=586e8abaabcdf8e48dc1f93b326551f1</id>
    <updated>2008-06-02T05:30:21-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As promised, Havok is now free for PC developers who charge less than $10 per game(with certain exceptions).
 </div></summary>
  </entry>

  <entry>
    <title>Procedural cities - Procedural humans!</title>
    <link href="http://casuallyhardcore.com/blog/2008/06/02/procedural-cities-procedural-humans/"/>
    <id>http://yoursite/article/?i=e8722407d1d3252cb3a5765ee5794e6d</id>
    <updated>2008-06-02T05:30:21-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Quidam is a neat character creation tool that allows you to construct low-poly humans using an assortment of heads, body shapes, outfits, etc.

This is a great tool for creating low-poly city populations.</div></summary>
  </entry>

  <entry>
    <title>The Devils Puppetry</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/31/the-devils-puppetry/"/>
    <id>http://yoursite/article/?i=f10ac2141ab21898337223a24ed78bf4</id>
    <updated>2008-05-31T16:30:33-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m looking at using motion capture-based animation for the supehero for the simple fact that I can stick (presumably) any animation cycle I find on the web onto it as necessary. Ideally all animation cycles will be tweaked to match the &#8220;animation style&#8221; of the superhero. The reality is that using mocap data is painful and I&#8217;ll explain why. 
Here is my workflow:

Build Hero model with default mocap friendly rig (bone hierarchy - no constraints - no IK)
Install Maya-based BVH importer

Create new empty Maya scene
Import BVH into scene - creates bone hierarchy and applies animation
Import hero model in scene - character in T-pose with bone hierarchy
Transfer animation from mocap bone hierarchy to superhero bone hierarchy!

The last step has not worked at all even with two rigs (hero + mocap) having similar but different hierarchies and due to the suckiness of Maya Trax transferring animation has been a nightmare.
So I&#8217;m toying with the idea of using MotionBuilder. There is a FREE Learning Edition that works but does not export FBX files for you to use in your 3D app and is for non-commercial purposes (i.e learning!)
MotionBuilder has it&#8217;s own idea of what a rig should be. It wants a bones named in a certain way or you will have to manually map your bones to their bones.

This requires a few extra steps so the workflow to get mocap animation into a Maya-based character is as follows:

Export Maya character as FBX (bones + geometry)
Import FBX into MotionBuilder
Create character definition for Maya rig - maps maya bones to MotionBuilder bones
Import BVH/AMC (mocap data) into MotionBuilder
Create character definition for mocap rig - maps mocap bones to MotionBuilder bones
Transfer animation from mocap to Maya rig (pretty easy)
Export animation into FBX
Import FBX into Maya and onto the character

The hard part is still transferring the animation because of differences in the rig. Sometimes re-targeting is necessary, but if you have to do it&#8230; MotionBuilder seems to be one of the best tools for that task.</div></summary>
  </entry>

  <entry>
    <title>Free MoCap data</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/30/free-mocap-data/"/>
    <id>http://yoursite/article/?i=9fac21fc34bdfec9e6157627192be369</id>
    <updated>2008-05-30T21:00:19-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mocapdata.com is a Japanese website with free mocap data files (need to register first):

This is a great resource for indie game developers looking for some quick animations to use.</div></summary>
  </entry>

  <entry>
    <title>j2Play - The universal gamertag</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/29/j2play-the-universal-gamertag/"/>
    <id>http://yoursite/article/?i=e80c05a9c81ea8893b98275612d3ecbd</id>
    <updated>2008-05-29T16:30:09-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">At the recent Toronto GameCamp, j2Play presented their SDK/service for self publishing your game on social networking sites using their &#8220;universal gamertag&#8221; (that&#8217;s what I call it)

j2play is the not the publisher - they only provide the framework for you to connect your games to Facebook and other social networking sites. What do they get? A piece(15%) of the advertising revenue in exchange for the infrastructure they provide like Leaderboards, Badges, and Challenges - a great deal if you ask me because they ask for no money upfront. Details here.</div></summary>
  </entry>

  <entry>
    <title>Why pursue funding?</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/26/why-pursue-funding/"/>
    <id>http://yoursite/article/?i=6ab1ac5448b4e41a8a1bb9e46bb81b3e</id>
    <updated>2008-05-26T21:30:27-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As an indie game developer, you can take two viable (let&#8217;s assume) directions:

Self-fund and beg artists to work for free. Stay small and the game stays indie.
Sell out and get external funding. Grow to a small crew and the game goes tries to become commercial.


Well I&#8217;ve taken the second route, but I must admit the past few months have been as Alexander would say &#8220;Terrible, Horrible, No Good, Very Bad&#8221; due to the stress and uncertainty When a game requires more than one person to build, it stops progressing when others are not available - which is usually due to lack of funding to pay them or if they are working for free, spare time, because they need normal jobs to pay rent + food. Thankfully, I&#8217;ve recently acquired some significant funding.
If I had gone route No.1 like Petri then life would carefree and simple, right? At some point I&#8217;d run out of resources(time + money), of course and I&#8217;d have to return to the workforce.</div></summary>
  </entry>

  <entry>
    <title>CityEngine available tomorrow! (May 23rd</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/22/cityengine-available-tomorrow-may-23rd/"/>
    <id>http://yoursite/article/?i=3488229fdce6d6b9bb7a025a2fee0a46</id>
    <updated>2008-05-22T21:30:19-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Being able to generate cities procedurally is a big deal to me and now Procedural Inc. will release their city generation tool to the world tomorrow!


CityGen is a decent tool and free also:

But it&#8217;s not as full-featured as CityEngine.
Introversion has their own (internal) city generator for their upcoming game:
</div></summary>
  </entry>

  <entry>
    <title>VGNG - Video Game Name Generator</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/22/vgng-video-game-name-generator/"/>
    <id>http://yoursite/article/?i=27f0c22b1a0b4b18d4a1220a9a93cd4c</id>
    <updated>2008-05-22T20:00:30-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m very late to the party, but TIGSource had a game competition where developers created a game using a title generated by the &#8220;Video Game Name Generator&#8221;
Here&#8217;s what I got from the first few tries:

Neurotic Dentist Farmer
Black Ping Pong Gang
Chocolate Mahjong Boy 
Day of the Nuclear Story
Middle-Eastern Conga Melee 
Happy Vampire on the High Seas
Wrath of the Quantum of Love
Hip-Hop Bingo Princess 
Narcoleptic Bubblegum Championship
Unpleasant Train Oppression 
John Romero&#8217;s Indian Babies
Unstoppable Horse Racing of Death 
Erotic Graveyard 3D
Frisky Sudoku Special Edition 
Biblical Ninja Stars

I&#8217;ve modified it slightly to include new &#8220;inappropriate&#8221; words. Just download the SWF file and the text file to include VGNG on your website, but remember to credit the original author - lenocinor


For the original copyright notice, see this link.</div></summary>
  </entry>

  <entry>
    <title>My Seven Jeopardy Categories</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/22/my-seven-jeopardy-categories/"/>
    <id>http://yoursite/article/?i=97451be46b591b27c34863f0a975c8be</id>
    <updated>2008-05-22T20:00:30-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you&#8217;ve read Microserfs, you will understand what this post is about. I recently dug up some old e-mails lost on a CD and found my old Jeopardy categories when I was 18/19 (and obsessed with economics and how banking systems work).
Circa 1996 (university-era):
Programming Languages
IPOs and CEOs
Computer animations
The Fuck-ups of the Personal Computer industry
Stock and Currency Markets
Pop psychology
Failures of Economic and Government Policy

Now:
Game development.
3D computer graphics.
Children&#8217;s literature post-1980s.
American indie music.
Moder cartoons and artsy-fartsy animated shorts.
NHL hockey post-2006.
Mix tape of useless info: Motorcycles, Traveling, Animation pipelines.</div></summary>
  </entry>

  <entry>
    <title>Commercial games starting to develop art</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/17/commercial-games-starting-to-develop-art-styles/"/>
    <id>http://yoursite/article/?i=cea533b0a134a643e19fbfada8f7d802</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s rare to see commercial games deviate from the pixel-art / photo-real mode, but in the past few years you see more and more non-photoreal games with a distinctive art style like The Blob, Team Fortress 2, Paper Mario, Okami, No More Heroes, etc.
Madworld by Capcom (Sin City / line art style):

Two weekends ago, I played Team Fortress 2 for the first time as part of Steam&#8217;s free TF2 weekend. I think the global illumination-like lighting and illustrative shaders are amazing.







Team Fortress 2 screen grabs - part 1
Team Fortress 2 screen grabs - part 2</div></summary>
  </entry>

  <entry>
    <title>3D menus</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/17/3d-menus/"/>
    <id>http://yoursite/article/?i=47d61d2f26751a65d24a44d029040fcb</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Menus in AAA games have become as fancy as TV shows.
Colin McRae&#8217;s DIRT&#8217;s UI is out of this world:

GameTap has a nice 3D UI:

Psychonauts + Katamari + The Simpson&#8217;s movie game all have stylish menus.
Another approach is to get rid of menus altogether like Burnout Paradise and GTA IV and throw the player into the game using a montage:


Like films, I believe the first 5-10 minutes sets the tone for the entire game. If you plan the game to be exciting and fast, then throw the player into the game ASAP.</div></summary>
  </entry>

  <entry>
    <title>Well be stuck with UVs for another 10 ye</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/17/well-be-stuck-with-uvs-for-another-10-years/"/>
    <id>http://yoursite/article/?i=0b8892dcab66fb6a46cd78f25b760203</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After some back and forth with my modelers about PolyCube maps and how that influences their workflow, I&#8217;ve resigned myself to that fact that modelers will be using UVs (even though they hate them) for another 10 years for a couple of reasons:

UV mapping tools are now fantastic + cheap + widely available. See UVlayout, Unwrap3D, Unfold3D, built-in tools in Maya, 3DS Max, XSI, etc.
Smart UV mapping saves tons of texture space by intelligently mirroring / folding UVs - although this causes major problems with normal + light mapping where mirroring UV will cause normals to be flipped.

All modelers are taught how to UV map and have developed extensive UV mapping experience by now.

UV mappers / texture artists are so efficient at using texture space with UVs and understand all the normal + lighting mapping problems now. I doubt they&#8217;d be willing to move to a 3D projection paint + PolyCube methodology until we have more texture memory and Zbrush (or apps like it) becomes the standard modeling tool.</div></summary>
  </entry>

  <entry>
    <title>Heading to Pixar next week</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/16/heading-to-pixar-next-week/"/>
    <id>http://yoursite/article/?i=2ffbd47e49307f6f0b26ef6798caf2ff</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;m giving an internal presentation on 3D animation pipelines and how Pixar could possible improve theirs. Even the biggest studios in the world still struggle with managing all their assets. 
&#8220;Getting it done by whatever means necessary&#8221; is great philosophy when you are small, but after a certain size I&#8217;d call it the &#8220;disaster waiting to happen due to lack of formal process.&#8221;
Honestly, only the EAs and Pixars of the world need complex / formalized pipelines. Temerity Software builds a tool that gives us a glimpse of what many of these large internal studios try to build:

To provide software developers with an analogy, Temerity is like a art build process tool. Only large software development houses need complicated code build systems, just like only the biggest game and animation studios need Temerity-like art build systems. 
Sadly, the art build process is poorly understood due to the lack of developers who understand the 2D/3D art packages and industry art workflow (both domain-specific knowledge). Thankfully this is changing as I see many job postings for Pipeline developers.</div></summary>
  </entry>

  <entry>
    <title>Silliness with Euphoria/Endorphin</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/15/silliness-with-euphoriaendorphin/"/>
    <id>http://yoursite/article/?i=d17781092ecb1eba78869d3576d79acb</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I&#8217;ve been toying with Euphoria/Endorphin since GDC and discovered animators can get very bored and twist simple tech into bizarre nonsensical creations.




*Euphoria/Endorphin is fantastic animation system that works using bio-mechanical knowledge of the human body to properly animate it. It is currently used in GTA IV and upcoming Force Unleashed game.</div></summary>
  </entry>

  <entry>
    <title>TOJam #3 Post-mortem</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/13/tojam-3-post-mortem/"/>
    <id>http://yoursite/article/?i=8c9e91d6036c143a3b6499fc875d544e</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As a TOJam vet and past organizer (TOJam 1 &#038; 2), I&#8217;d have to say each year has been a completely different experience: New location, new jammers, new games. Each year has progressively gotten better in terms of size, quality and overall experience. 
This year, I actually enjoyed myself and at no point felt stressed or guilty that I wasn&#8217;t helping out with the organization of the event. In short, this was my favourite TOJam!
What went right:

I finished my game!
Finishing a game in three day is a big accomplishment if you&#8217;ve dared to try it. In last two jams I completed &#8220;rather half-assed so-called games&#8221; that I would probably not play ever again and I don&#8217;t recommend you do either. For one, the first jam game require DK Konga controllers and a GameCube USB adapters (good luck!) and the second require a microphone and the Microsoft Speech SDK installed OR Microsoft Office&#8230; that eliminated 50% of the world!

I pre-visualized how the music-to-waveform tech would work beforehand.
Cowgirl and Gospelboy relied on a weird piece of technology played a MP3 file and generated 2D collision geometry on the fly. If I had tried to implement this in 3 days I would have ran out of time. Instead I built a sample app a few weeks ago to test out whether FMOD could dynamically generate a 2D waveform that looked reasonable. I did not write any music to physics code until the start of the game as I felt like that was cheating.

I also had experience with Box2D, the physics engine used, so all technology was well understood (or so I thought).
I didn&#8217;t use a 3D engine to make a 2D game!
Last year, I used OGRE to build a 2D game and that was a mistake. OGRE is fine 3D graphics engine, but is too complicated for simple tasks like drawing sprites and rotating them! I choose IndieLib because it was the easiest/cleanest 2D game engine I&#8217;ve seen in a long time. My second choice would have been PlayFirst or PopCap, but those game engines are overloaded and rather complex.
The game is actually fun!
My first two games were about experimentation and toying with novel technology like Konga controllers and microphones. This year, I decided upfront that this jam had to have all technology developed and understood. I swore to myself that I&#8217;d spend all Sunday gameplay tuning - which I did.

I found as people played the game Sunday night (as part of the open house gaming session), I slowly refined it to a point where by 11:00pm it was becoming addictive. As I&#8217;ve mentioned in another post, C &#038; G was exactly the game I wanted to make in the first game jam, but I did not have the physics background then.

What went wrong:


IndieLib was missing features (or had features I thought were supported)
I didn&#8217;t realize IndieLib did not support joysticks nor TrueType fonts until the second day of the jam - I scrambled to include OIS support and made due with TWO fonts (big and small).
I also did not spend enough time with IndieLib before the jam and had to learn how it&#8217;s co-ordinate system worked when zoomed out and other quirks like issuing BeginScene(), EndScene(), RenderEntities2d calls.
The code was a disaster by Saturday night.
I was forced to refactor the codebase (took 3 hours) and add a state machine and migrate everything into classes because adding menus would have been impossible otherwise. The code was a mess of global variables due to how I just dove into making the game.
High-speed 2D physics creates major problems
There are some annoying bugs in the game and most of them are related to the wave moving at 150 units a second to give the player a sense of speed, but also causes the infamous &#8220;tunneling&#8221; problem. 
Early on, I decided to remove constraining the max and min height of the wave and let it grow as high as possible to give a sense of worldly height without resorting shifting the wave up/down (causes physics problems). 
The camera tries to keep the surfer in view, by zooming in and out and other tricks, but due to the high speed of action the player can slide out of view for a short period a time.
Some chosen songs were just not fun to play
The best songs to play are the ones with plenty of variation. Many radio-friendly pop songs keep an even keel with minor variations here and there, but not enough to keep interest for 4 minutes. Jill Barber&#8217;s &#8220;When I&#8217;m making love to you&#8221; is a fantastic song to surf to. It ebbs and flows like a bittersweet love song.
I did not provide clear art direction to the graphics floaters (artist)
The main characters needed to be re-designed THREE times during the jam due to my poor art direction. I told the artists to make &#8220;Stickin&#8217; around&#8221; like characters which they did, but I didn&#8217;t realize that meant the clean and straight lines. I was thinking more like &#8220;Stickfigure theatre&#8221; with more squiggly animated lines. Not the case.

</div></summary>
  </entry>

  <entry>
    <title>GTA IV (X360): Anti-review</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/13/gta-iv-x360-anti-review/"/>
    <id>http://yoursite/article/?i=25e33622084f10a0a32e316ad73e3c23</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">GTA IV has been universally acclaimed so I&#8217;m not about to stroke it&#8217;s ego by mentioning all the good things in it. This review is about the all POORLY IMPLEMENTED ASPECTS of GTA IV - my complaint list.
For a $100 million dollar project, it should be held to the highest standards of commercial art. So compared to an award winning commercial film, GTA IV&#8217;s story is about as deep as water in my toilet. The game is full of stock characters, on the nose dialogue, etc. It&#8217;s okay, just like the film &#8220;Dungeons &#038; Dragons&#8221; was okay.
For the record, I loved the first GTA III&#8230; it deserved all the accolades it won that year even with all its warts because it worked so well gameplay-wise.
Now for the GTA IV complaint list:
Camera system

Disorienting due to its &#8220;smart behaviors&#8221; during fast actions sequences.
Gets stuck in small areas and tends to zoom in and out unexpectedly.
Has automatic behaviors when driving that frustrate me so I try to keep it behind the vehicle at all times.
When driving is too low to the ground for me to see ahead (especially with the ambulence)
Generally bad, but you &#8220;learn&#8221; to make it behave.

Some videos on the camera problem:

http://www.youtube.com/watch?v=iRuaAlFN4y4
Walking

Press A to run? Analog stick please!
Constant glitches with automated actions like getting into a car and going to trigger point.
I&#8217;m always bumping/nicking into people on the street who just insult me. Walking is the least enjoyable part of GTA IV.


Combat/Shooting

Hand to hand is stupid. Why three buttons? I mash a single buttons anyways.
Gun targeting picks things behind a wall or dying or something I have no interest in.
Camera zooms in and out when targeting causing some disorientation.
Honestly, I hate FPSes and GTA IVs targeting system feels like a bad FPS. Most gun battles are set up that way (shooting gallery) and are not very free form.


Driving

Soft + squirrely (problem with controls and physics)
All cars drift WAY TOO MUCH causing the driving missions to be frustrating!!!
Have to drive slow to avoid the vehicles from drifting.
Player must always map read to navigate city.
Map zooms in and out causing &#8220;map-reading distance estimation&#8221; to be wrong
Cars feel too similar. Yeah the trucks are slower and less responsive than the SueprGT, but not 
Cars are weightless paper maiche toys when hit.
Cars get stuck in the highway dividers (that just fit) too easily.
I don&#8217;t like be ejected from the window when I nick the smallest collision object.
Too many small (pointless) corners and interferring props (lamp posts, mailboxes, etc.)
The motorcycles are HORRIBLE. Instead of 600-1000cc bikes they feel like 125cc GP&#8230; For the record, I&#8217;ve ridden both kinds in real life.
If you hit &#8220;Y&#8221; while in the helicopter you will be &#8220;ejected&#8221;&#8230; this is stupid because you can unintentially hit the button looking for the shoot button (which probably should be LB and not X or was it A?).



Police
Too aggressive overall.

They arrive immediately with helicopters and guns which is a bit unfair/unrealistic.

There are half a dozen cops (in cars/helis) sometimes yet you can out run them ALL if you just leave the tiny police search radius. I&#8217;d have then arrive slower, but force you to out run them for longer and farther.

Too sensitive. Sometimes a gun shot will trigger cops. Sometimes it won&#8217;t. Sometimes hitting a cop car will trigger a wanted level. Sometimes it won&#8217;t.

Inconsistent is how best to describe the police in GTA IV.

The police are too good at shooting. I had full health and armour and still died (I was switching weapons while standing next to my car).

City

Full of people and buildings, but NOTHING to do.
Darts + bowling + pool are fun ONCE.
Drinking + driving is fun ONCE.
Comedy clubs are fun ONCE.
Sex with hookers is fun ONCE. In GTA III it was always fun&#8230; nobody spoke or had some stupid comment to make.

Visuals

It&#8217;s too dark! Hard to see in alleyways and at night.
For a next-gen game, it almost looks PS2/Xbox like. Lots of popping artifacts and shadow aliasing.
Shadow aliasing is awful.
Texture aliasing is awful.
Reflections on the building windows are PS2 awful.
Draw distance is tiny.

Mobile phone

I can never remember the cell phone trigger - up or down? (habit)
I always use the analog stick first before the d-pad when the phone appears (habit)
It took a while before triggering the phone was almost natural - which means it was never a good design in the first place

Missions

I spent more time map reading/following than actual work like shooting.

GTA IV is about 70% driving (which sucks) and 15% action and 10% cut-scenes.

Story

While Niko and Roman are great, over half the secondary characters are merely over-the-top stereotypes.

Over half the dialogue is too &#8220;on the nose&#8221; and too often they merely reveal information (no subtext).

When driving + map reading, it&#8217;s kinda heard also to listen to conversation. It&#8217;s a great idea to use conversations to reveal the story of the game, but it&#8217;s hard to process the information while playing the game.


Relationships


Dating Michelle is fun for the first 3-4 times (same with screwing her).
Hanging with Little Jacob + Roman is nice change and fun for the first bit

Strip club is funny/sexy for the first time. Cops arrived immediately after I unintentionally stepped onto the stage.

Roman died swimming for no particular reason or I accidently hit him as I tried climbing out of the water. Made ZERO sense.


Certain things aren&#8217;t explained too well or at all in the game when you begin:


i.e why going to the airport immediately gives you a 5-star rating
i.e why going to the closed bridge immediately gives you a 5-star rating
i.e why swimming out too far immediately gives you a 5-star rating
</div></summary>
  </entry>

  <entry>
    <title>Weird quirks with the Visual C++ 2008 co</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/13/weird-quirks-with-the-visual-c-2008-compiler/"/>
    <id>http://yoursite/article/?i=39c62e0457ee58e264db5124d9de4ee9</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">1) If you have a bad character at top of file.. i.e Usually due to a typo / random key press
f/*****************************************************************************************
/* My comment
/*****************************************************************************************/
You will get this error:

c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(19) : error C2144: syntax error : &#8216;__w64 unsigned int&#8217; should be preceded by &#8216;;&#8217;
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(19) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
2) If you don&#8217;t include  when using STL strings in STL data structures (usually I assume  has been included somewhere in the libraries I use)&#8230; you get an assortment of errors:
error C2678: binary &#8216;!=&#8217; : no operator found which takes a left-hand operand of type &#8217;std::string&#8217; (or there is no acceptable conversion) could be &#8216;built-in C++ operator!=(const char [1], const char [1])&#8217; while trying to match the argument list &#8216;(std::string, const char [1])&#8217;
OR
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\functional(143) : error C2784: &#8216;bool std::operator  &#038;,const std::_Tree &#038;)&#8217; : could not deduce template argument for &#8216;const std::_Tree &#038;&#8217; from &#8216;const std::string&#8217;
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xtree(1466) : see declaration of &#8217;std::operator 
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\functional(142) : while compiling class template member function &#8216;bool std::less::operator ()(const _Ty &#038;,const _Ty &#038;) const&#8217;
1>        with
1>        [
1>            _Ty=std::string
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\map(68) : see reference to class template instantiation &#8217;std::less&#8216; being compiled
1>        with
1>        [
1>            _Ty=std::string
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xtree(22) : see reference to class template instantiation &#8217;std::_Tmap_traits&#8216; being compiled
1>        with
1>        [
1>            _Kty=std::string,
1>            _Ty=GameState *,
1>            _Pr=std::less,
1>            _Alloc=std::allocator>,
1>            _Mfl=false
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xtree(63) : see reference to class template instantiation &#8217;std::_Tree_nod&#8216; being compiled
1>        with
1>        [
1>            _Traits=std::_Tmap_traits,std::allocator>,false>
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xtree(89) : see reference to class template instantiation &#8217;std::_Tree_ptr&#8216; being compiled
1>        with
1>        [
1>            _Traits=std::_Tmap_traits,std::allocator>,false>
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xtree(107) : see reference to class template instantiation &#8217;std::_Tree_val&#8216; being compiled
1>        with
1>        [
1>            _Traits=std::_Tmap_traits,std::allocator>,false>
1>        ]
1>        C:\Program Files\Microsoft Visual Studio 9.0\VC\include\map(78) : see reference to class template instantiation &#8217;std::_Tree&#8216; being compiled
1>        with
1>        [
1>            _Traits=std::_Tmap_traits,std::allocator>,false>
1>        ]
1>        c:\documents and settings\hp_administrator\desktop\indielib_sdk\StateManager.h(52) : see reference to class template instantiation &#8217;std::map&#8216; being compiled
1>        with
1>        [
1>            _Kty=std::string,
1>            _Ty=GameState *,
1>            _Pr=std::less
1>        ]
Which are unhelpful in telling you about your mistake.</div></summary>
  </entry>

  <entry>
    <title>My TOJam #3 game: Cowgirl and Gospelboy</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/12/my-tojam-3-game-cowgirl-and-gospelboy/"/>
    <id>http://yoursite/article/?i=54a11a6da752418896be50065d623c7f</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Core idea: Line rider meets Audiosurf in the style of Vib Ribbon. It&#8217;s a game I&#8217;ve always wanted to make since the first jam, but never had the physics (implementation) understanding until the past year:

A public release will be forthcoming around the same time as the other TOJam #3 games
Technology: IndieLib, Box2D, FMOD, Visual Studio C++ 2008 Express Edition</div></summary>
  </entry>

  <entry>
    <title>Nvidia releases The Cg Tutorial book for</title>
    <link href="http://casuallyhardcore.com/blog/2008/05/08/nvidia-releases-the-cg-tutorial-for-free-online/"/>
    <id>http://yoursite/article/?i=9773268004fb757a2825bb2b55aa62f9</id>
    <updated>2008-05-20T05:00:14-07:00</updated>
    <author>
      <name>http://casuallyhardcore.com/blog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
A relatively old books (circa 2003) but very useful in learning the basics of high level shading languages for GPUs.</div></summary>
  </entry>

  <entry>
    <title>Tech Demo Video 2010</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3643238"/>
    <id>http://yoursite/article/?i=186e585e817138a6d019d0ccfed38d80</id>
    <updated>2010-05-04T05:30:45-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It's been many years since the release of the last video showcasing the seamless planetary engine, so I'm happy to release this new video. This is actually a video of the game client, but since there's little gameplay in it, I decided to label it as a "tec...</div></summary>
  </entry>

  <entry>
    <title>ASEToBin 1.0 release</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3537743"/>
    <id>http://yoursite/article/?i=a418d35b3ec6284afb6c1aabbc30ac5d</id>
    <updated>2009-10-07T03:01:31-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally, the long awaited ASEToBin 1.0 has been released !

ASEToBin is a tool that is part of the I-Novae engine ( Infinity's engine ). It allows contributors and artists to export their model from 3DS Max's .ASE file format and to visualize and p...</div></summary>
  </entry>

  <entry>
    <title>Tip of the day: logarithmic zbuffer arti</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3513134"/>
    <id>http://yoursite/article/?i=b2a9a66e5faa83752679f96b9b9f1a2e</id>
    <updated>2009-08-20T09:01:02-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Logarithmstic zbuffer artifacts fix

In cameni's Journal of Lethargic Programmers, I've been very interested by his idea about using a logarithm...</div></summary>
  </entry>

  <entry>
    <title>Seamless filtering across faces of dynam</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3512343"/>
    <id>http://yoursite/article/?i=4ac75832ddccf61d9686611443b38816</id>
    <updated>2009-08-19T07:03:53-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Tip of the day

Anybody who tried to render to a dynamic cube map probably has encountered the problem of filtering across the cube faces. Current hardware does not support filtering across different cube faces AFAIK, as it treats each cube ...</div></summary>
  </entry>

  <entry>
    <title>Audio engine and various updates</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3487455"/>
    <id>http://yoursite/article/?i=35409ab30be778430cad01c442228346</id>
    <updated>2009-07-08T08:30:28-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In this journal, no nice pictures, sorry :) But a lot to say about various "small" tasks ( depending &#111;n your definition of small. Most of them are &#111;n the weekly scale ). Including new developments &#111;n the audio engine and particle systems....</div></summary>
  </entry>

  <entry>
    <title>Galaxy generation</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3459535"/>
    <id>http://yoursite/article/?i=af4c9c0f6484fcfec2214a8fce6f1c71</id>
    <updated>2009-05-19T10:00:58-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the past weeks, I've been focusing my efforts &#111;n the server side. A lot of things are going &#111;n, especially &#111;n the cluster architecture. But &#111;ne particular area of interest is the procedural galaxy generator. In this journal, I wil...</div></summary>
  </entry>

  <entry>
    <title>Deferred lighting and instant radiosity</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3432126"/>
    <id>http://yoursite/article/?i=153376837e641694115435ca64b698e6</id>
    <updated>2009-04-03T09:01:03-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the past months, I've been wondering how to approach the problem of lighting inside hangars and &#111;n ship hulls. So far, I had &#111;nly been using a single directional light: the sun. The majority of older games precompute lighting into textures ( c...</div></summary>
  </entry>

  <entry>
    <title>Detail textures</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3422661"/>
    <id>http://yoursite/article/?i=9e4b5b797611ee4c859e1f3e71145c52</id>
    <updated>2009-03-18T12:30:38-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Many people have been worried by the lack of updates recently. No, we haven't got lazy, in fact quite the contrary :) We've been awfully busy at work.

In this journal I'm going to review some of the recent work, without going too far into details....</div></summary>
  </entry>

  <entry>
    <title>Some nice concept art</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3400204"/>
    <id>http://yoursite/article/?i=5d04a8d404a6fe612db3fe6aa53373c1</id>
    <updated>2009-02-12T14:26:53-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I don't usually post concept art, but this is particularly good.</div></summary>
  </entry>

  <entry>
    <title>2008 Retrospective and progress</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3378993"/>
    <id>http://yoursite/article/?i=cc35650950377897e8807711e7f4b1ab</id>
    <updated>2009-01-10T12:30:50-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">2008 Retrospective
First of all, Happy new year 2009 ! 

Looking back at 2008, I can't say I'm particularly happy about how things went. There has been some serious delays &#111;n what I intended to achieve, and it's not due to a singl...</div></summary>
  </entry>

  <entry>
    <title>Craters and normal maps</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3343431"/>
    <id>http://yoursite/article/?i=3801f347688ac2826ed6911036201e95</id>
    <updated>2008-11-02T15:30:40-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Normal maps &#111;n the GPU

In the last journal, I was explaining that &#111;ne of the main benefits of working &#111;n the GPU instead of the CPU is the ability to create normal maps. Of course, it would be technically possible to generate...</div></summary>
  </entry>

  <entry>
    <title>GPU Terrain generation, cell noise, rive</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3339086"/>
    <id>http://yoursite/article/?i=1c81e14abf0726316a41aba4233017d4</id>
    <updated>2008-10-25T15:00:40-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">GPU Planetary Generation

Motivation

Until now, the planetary generation algorithm was running &#111;n the CPU synchronously. This means that each time the camera zoomed in &#111;n the surface of the planet, each terrain node...</div></summary>
  </entry>

  <entry>
    <title>A bit of history</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3277209"/>
    <id>http://yoursite/article/?i=f0502d8aad22a48b3502ad91d6421933</id>
    <updated>2008-07-23T12:01:00-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">General progress

In the past weeks, I've been concentrating &#111;n the new website. Thanks to Amshai and Choub, the layout is pretty much finished, but a lot of components are still not yet integrated ( like the galleries, videos, forums, ...</div></summary>
  </entry>

  <entry>
    <title>Lava experiments</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3251852"/>
    <id>http://yoursite/article/?i=6ab1ae5a6a665b7bfad530a330cc6426</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">General progress

In the past two weeks, I've been working a lot &#111;n "polishing" the engine. This means investigating all sorts of bugs and problems that I had noticed, but didn't have the time to fix so far.

For example, I adde...</div></summary>
  </entry>

  <entry>
    <title>Descriptions generator</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3244747"/>
    <id>http://yoursite/article/?i=5d4dfe1f63bb23ed13c765059af2b5dc</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the past weeks, I've written a story/descriptions generator for players, NPCs or even locations. Steve Breslin, our storywriter, has helped to design the system, and so will be the &#111;ne to try to explain it in today's journal (in better english than...</div></summary>
  </entry>

  <entry>
    <title>Meta server system</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3216811"/>
    <id>http://yoursite/article/?i=2f7a6d12b6e2810b9101547acb360b90</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Meta-server

In the past 3 weeks, I've been busy working &#111;n the meta-server. The meta-server is the server &#111;n which the client is first connecting. It handles connections to the server clusters ( shards ), patches, authentication, ...</div></summary>
  </entry>

  <entry>
    <title>Tip of the day: bilinear filtering accur</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3203576"/>
    <id>http://yoursite/article/?i=355c4a18afd196715211ba2d3307784b</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Today's a short tip of the day aimed at graphics programmers.

Most people don't realize that bilinear filtering an RGBA8 ( fixed point, 8 bits per channel ) texture results in a fixed point value.

What I mean is extremely simple. RGB8/RGB...</div></summary>
  </entry>

  <entry>
    <title>Terrain texturing explained</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3198944"/>
    <id>http://yoursite/article/?i=e4f99db0f08a316e1f76dd83dd6952f8</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Many people have been asking me how the terrain texturing is implemented, so I'll make a special dev journal about it.

Sub-tiling

The whole technique is based &#111;n sub-tiling. The idea is to create a texture pack that contains N...</div></summary>
  </entry>

  <entry>
    <title>I waked up..</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3192748"/>
    <id>http://yoursite/article/?i=1b646d8ee404f1036a95366326c85014</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yesterday's news was obviously an April Fool's.. But like last year, a lot of people thought it was true. I must say, posting it in the 31th didn't help, but in the GMT timezone it was near midnight and I didn't want to wait another 12h to post it, ...</div></summary>
  </entry>

  <entry>
    <title>IBL: Incredibly Bad Luck (tm)</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3191515"/>
    <id>http://yoursite/article/?i=b5525e6886dc9c8c6cb476d32a7f76bb</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Unfortunately, I have a bad news to announce.

Sometimes, things that you thought would never happen, do happen. Today, I learned it the hard way.

I'm a pretty paranoid developer. I always keep 4 copies of my work, as backups, in case some...</div></summary>
  </entry>

  <entry>
    <title>Terrain texturing</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3189540"/>
    <id>http://yoursite/article/?i=61a30fb7bb9435b0421861376de312ab</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This journal will cover terrain texturing, and since I haven't taken new screenshots since the last time, it's probably going to lack nice images. But I'll explain a bit the approaches I took with terrain texturing so far, the algorithm I finally settled &amp;...</div></summary>
  </entry>

  <entry>
    <title>Two years of contributions: the mega thr</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3186467"/>
    <id>http://yoursite/article/?i=5089753b354adfaaa345376c557d7e6e</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">No way in hell I could have done that manually, so I asked OrangyTang from gamedev.net his python script to collect all pictures posted in gamedev.net's journals, and adapted it for the contributions forum.

The result is a mega thread of 25 pages,...</div></summary>
  </entry>

  <entry>
    <title>Terrain engine</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3183075"/>
    <id>http://yoursite/article/?i=10f4c7927d77e4d1d89412973c4aee93</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Nitpicking

- clouds don't have a coriolis effect
- no storm effect
- motion blur / bluriness in starfield
- clouds have patterns
- terrain too blue
- atmosphere too thick
- over saturation to white
- areas too sh...</div></summary>
  </entry>

  <entry>
    <title>Stormhawk and Bellerophon + space views</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3181765"/>
    <id>http://yoursite/article/?i=a86ca4bd44f989bc38bb5a248905f4da</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Anti-aliasing with multiple render targets

It took me months to figure out ( of course, not full time. Just a couple of hours here and there ), but I had a serious problem to combine anti-aliasing with multiple render targets.

Inn ...</div></summary>
  </entry>

  <entry>
    <title>Horizon culling</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3173799"/>
    <id>http://yoursite/article/?i=da041cbfb8e7aedffd6a626e3db9a184</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Status:

First of all, a little status check. I know I haven't posted a lot of dev journals in the past 2 months, but there's a good reason for that. And it's not because I've been inactive, quite the contrary. I easily spent 80+ hours of wo...</div></summary>
  </entry>

  <entry>
    <title>Asteroids</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3150300"/>
    <id>http://yoursite/article/?i=636481bb32ea7875b0df5d883b3911d3</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Construction and &#115;tyle of asteroids 

Which method ?

When making asteroids for a 3D game, an artist can spill out asteroids with three different methods. Simplest way is to model low poly asteroids and slam diffuse/bump ...</div></summary>
  </entry>

  <entry>
    <title>Parallax mapping</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3140527"/>
    <id>http://yoursite/article/?i=6639151fdf772870f3be44739e479c90</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally, an update ? Yes and no.. the "major" thing I've been working &#111;n recently, the planetary engine, is making good progress, and I have a lot to say about it, and pics to show but.. not yet. I prefer to make sure everything is 100% running as exp...</div></summary>
  </entry>

  <entry>
    <title>Bellerophon with SSAO</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=263350&amp;reply_id=3120244"/>
    <id>http://yoursite/article/?i=fff2ec8315be3c1fbb918a3080b5dcea</id>
    <updated>2008-07-03T06:00:30-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Screen-space ambient occlusion.

I've been experimenting a new idea for faster SSAO. To keep it short, it's a post-processing effect that &#111;nly requires the depth/distance buffer. The depth buffer is blurred in a smart way ( the amount o...</div></summary>
  </entry>

  <entry>
    <title>Splatting</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3700102"/>
    <id>http://yoursite/article/?i=2d3e6f15a6256aed9896e8fa86783b7d</id>
    <updated>2010-09-03T01:15:20-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Now that I've started tinkering with Archipelago again, it's a perfect time for me to experiment with a little idea I had some time ago, which I filed away. It has to do with eliminating, or at least hiding, the grid. Archipelago, like most of my games, is...</div></summary>
  </entry>

  <entry>
    <title>Top-down games</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3699162"/>
    <id>http://yoursite/article/?i=c1d411b593264681c4a98d0f146102e9</id>
    <updated>2010-08-31T14:29:31-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've always loved 2D games. Although lately I've been tinkering with Ogre3D, I still (and probably always will) have it in my head that 2D games are what I really want to do. Simpler asset creation pipelines, lower GPU capabilities, less complex physics an...</div></summary>
  </entry>

  <entry>
    <title>Pathfinding</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3696924"/>
    <id>http://yoursite/article/?i=92a2e27d7e778155b62d283e812b02ca</id>
    <updated>2010-08-26T01:51:26-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been climbing back in the saddle, getting quite a bit done lately. In the process, I've added another neat, free library to my "standard" load-out of libraries: Recast and Detour for navigation-...</div></summary>
  </entry>

  <entry>
    <title>Oh jeez</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3685611"/>
    <id>http://yoursite/article/?i=aad58f7f014413c8453d6167e9f6f38a</id>
    <updated>2010-08-02T01:02:56-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So, yeah, that neat little free program, Sculptris, that I raved about in my last couple journal entries? Turns out, it's been bought by ZBrush, along with the developer. I'm all for people...</div></summary>
  </entry>

  <entry>
    <title>Environment</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3674850"/>
    <id>http://yoursite/article/?i=5491afb360ee7ea98fb492cb9c526e4a</id>
    <updated>2010-07-10T02:50:06-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>More of the turtle dude</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3673756"/>
    <id>http://yoursite/article/?i=8bdc0fe8890ed41700427cb36a5d32c4</id>
    <updated>2010-07-07T14:47:36-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So I decided to take the time to flesh my little test dude out a bit more. I kinda like him now. I could see myself actually using him in a game. Here is a render from Blender of him; the &#111;ne in the background is the high-res version sculpted and pain...</div></summary>
  </entry>

  <entry>
    <title>Learning Modelling</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3673152"/>
    <id>http://yoursite/article/?i=c68c8babd51aaa2a48b5845f0bf0dc0c</id>
    <updated>2010-07-06T14:39:47-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'm not really a character artist, or any other kind of artist, for that matter. Sure, back in the day, I used to dabble a bit in painting, pastels, colored pencils, etc... but ask me to draw a picture of your dog now and I'll just stare blankly at you. I'...</div></summary>
  </entry>

  <entry>
    <title>Wang Tiles</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3662138"/>
    <id>http://yoursite/article/?i=02d37eb2d3394753937eb87d2fc60515</id>
    <updated>2010-06-14T15:07:59-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Wang Tiles!

Sounds kinda dirty, I know, but according to Wikipedia, Wang tiles are sets of tiles that can be used to seamlessly tile a plane, while reducing the visual artifacts of repetition. B...</div></summary>
  </entry>

  <entry>
    <title>Updating the Noise Library</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3659033"/>
    <id>http://yoursite/article/?i=d1a36e27d00db35793df25e0c0d18395</id>
    <updated>2010-06-07T14:41:06-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In light of the last post about seamless mappings of noise functions, I've begun yet another re-vamp of the noise library aspect of the Accidental Engine.

The new reorganization formalizes a few conventions that have slowly evolved as I've used th...</div></summary>
  </entry>

  <entry>
    <title>Seamless Noise</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3645283"/>
    <id>http://yoursite/article/?i=19ac4355faece349f87c43b13610d35b</id>
    <updated>2010-05-08T16:31:06-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been playing with various types of noise generation for quite awhile, and I use generated noise as an integral part of many of my various workflows: texture creation, level creation, etc... It's great stuff. But there has been something that has bugge...</div></summary>
  </entry>

  <entry>
    <title>Programmer Art: Creating isometric river</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3634235"/>
    <id>http://yoursite/article/?i=70cbe85e87cde38eabbab623ef5ef50d</id>
    <updated>2010-04-14T21:01:59-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Okay, okay, this technique isn't 100% procedural (although, with the use of a software renderer or raytracer it could be). However, it does make heavy use of procedural techniques, so in my opinion it does qualify as "programmer art". As always, we'll be u...</div></summary>
  </entry>

  <entry>
    <title>Black Triangle</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3578635"/>
    <id>http://yoursite/article/?i=108f1ca4ef55743cbb870f5e3ecf3fec</id>
    <updated>2009-12-25T17:30:55-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Jay Barnson talks about a concept he refers to as a "Black Triangle": that stage in a game development cycle when you have accomplished a milestone of sorts that &#111;n the surface doe...</div></summary>
  </entry>

  <entry>
    <title>Entity system</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3567882"/>
    <id>http://yoursite/article/?i=473cff7115a5434797aad4694a04923f</id>
    <updated>2009-12-05T07:00:58-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Like a lot of people who "grew up" with C++, I read a lot of books that taught you to program along the lines: "Circle is-a shape, which is-a Renderable which is-a BaseObject", and the whole idea of object-composition never really clicked &#111;n me. I've ...</div></summary>
  </entry>

  <entry>
    <title>Ogre</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3565493"/>
    <id>http://yoursite/article/?i=1f38a02ab3176500b003fb4d206aea24</id>
    <updated>2009-11-30T20:31:13-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Been away awhile.

Lately I've (yet again) started to get back into the swing of things. After a few days of munging through old code (old Golem stuff, the Accidental Library, etc...) I decided to take a different tack, and I downloaded the latest ...</div></summary>
  </entry>

  <entry>
    <title>Pyrotechnics</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3492514"/>
    <id>http://yoursite/article/?i=ab8611c314c54fa4353456dd9433ada3</id>
    <updated>2009-07-16T18:01:53-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Been playing with the explosion generator some more. (The reason is that I am working &#111;n a Flash-based game, and I need bitmap based special effects.) Combining a stretched sphere function with turbulence biased along a directional axis, I've created ...</div></summary>
  </entry>

  <entry>
    <title>Explody</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3489258"/>
    <id>http://yoursite/article/?i=2e9388ee5a91d1586937d7bac3bccef2</id>
    <updated>2009-07-11T16:01:12-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Did some tweaking to turbulence and intensity scaling, parameterized everything to be animated by curves, and slapped together a really quick layered test, and here is the result:


(N...</div></summary>
  </entry>

  <entry>
    <title>Explosions Redux</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3488885"/>
    <id>http://yoursite/article/?i=63c41a285ed7a3ccd9b3fa043f569048</id>
    <updated>2009-07-10T18:30:45-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Quite awhile back, in this and this journal en...</div></summary>
  </entry>

  <entry>
    <title>Research</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3456043"/>
    <id>http://yoursite/article/?i=443e38a0c6416a4c0cc0bc91d8648a51</id>
    <updated>2009-05-13T17:30:52-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So it's been an interesting three or four weeks. Before I elaborate, I would just like to comment &#111;n the massive motivational boost to &#111;ne's planning that can be granted by spending an entire night (as I did last night, and as I will again tonigh...</div></summary>
  </entry>

  <entry>
    <title>Wilderness Generator</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3438059"/>
    <id>http://yoursite/article/?i=454aa21b464061484643bd4b6cdce02f</id>
    <updated>2009-04-13T19:01:08-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've started &#111;n the generic wilderness sub-map generator for Archipelago. Although I might have to change the name, since the world generator still doesn't generate a system of islands, but rather...</div></summary>
  </entry>

  <entry>
    <title>Archipelago Again</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3433916"/>
    <id>http://yoursite/article/?i=db2fa4dfb0f29dc6afc887806b0ed10c</id>
    <updated>2009-04-06T19:00:58-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Work continues &#111;n the old school RPG. Following the example of several luminaries of the journal pages, I've started a separate blog. This blog is about my various Accidental stuff, including the current old school project. I'll try to confine any Acc...</div></summary>
  </entry>

  <entry>
    <title>Archipelago</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3424571"/>
    <id>http://yoursite/article/?i=31c2f3d17abc9bb34916923151e73cc3</id>
    <updated>2009-03-21T19:30:49-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community/forums/mod/journa</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Spent a few hours today tinkering around and came up with this:



It's a simple tilemap in the 'old skool' &#115;tyle, top down and cheesy. The map displayed is just a s...</div></summary>
  </entry>

  <entry>
    <title>Relief rivers</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3403944"/>
    <id>http://yoursite/article/?i=3d3facf8abeac160adbb991a7642d57c</id>
    <updated>2009-02-17T14:32:26-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Because relief maps are so much more interesting to look at.</div></summary>
  </entry>

  <entry>
    <title>Rivers</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3402142"/>
    <id>http://yoursite/article/?i=0d4d658a746833c880c350df1d2d8bac</id>
    <updated>2009-02-17T14:31:49-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been revisiting my island/continent generation stuff.</div></summary>
  </entry>

  <entry>
    <title>Plumbing</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3392235"/>
    <id>http://yoursite/article/?i=225fa1885859ba7c42ed46c9682e5f9b</id>
    <updated>2009-01-29T21:00:46-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Despite sworn oaths, I've gone back to plumbing. This post isn't about the goods/bads of that. It's about something I've been learning over the past several years, partly as a plumber, and partly as... well... everything else.

Confidence. I have a...</div></summary>
  </entry>

  <entry>
    <title>Programmer Art: HSV and You</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3354532"/>
    <id>http://yoursite/article/?i=1ba9cb6dd77d51403192c6022e235285</id>
    <updated>2008-11-24T16:00:44-08:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As programmers, we are accustomed to dealing with images in RGB format. It's the 'native tongue' of the hardware, after all; RGB is the format the graphics card uses to move pixels around. The actual pixels themselves are comprised of clusters of red, gree...</div></summary>
  </entry>

  <entry>
    <title>Still floored</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3341968"/>
    <id>http://yoursite/article/?i=6b441cbbfe8d78f297cf44b239209f2f</id>
    <updated>2008-10-30T15:30:15-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you want to eliminate the optical illusion that confuses the eye and makes the previous floors look like the mortar lines are outset, you need more realistic lighting than just bump-mapping. For this version, I simply imported the heightmap into Blender...</div></summary>
  </entry>

  <entry>
    <title>Back to the floor</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3338733"/>
    <id>http://yoursite/article/?i=63bb896557bf7cb811eff1b9b634a496</id>
    <updated>2008-10-24T17:30:47-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After posting the previous, I kept &#111;n tinkering and removed a few steps from the process. It didn't make sense that I kept having to bounce back and forth between the GIMP and the Accidental tool, so I proceduralized the entire thing, removing the GIM...</div></summary>
  </entry>

  <entry>
    <title>Programmer Art</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3337099"/>
    <id>http://yoursite/article/?i=3fa5528fe56bfc5f7b9088a6ff3ac92f</id>
    <updated>2008-10-21T22:30:38-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Making Programmer Art: Tiling Rough Stone Floors

Dungeon floors. You've seen 'em, I've seen 'em. We've all of us died &#111;n 'em at some point in our lives. Here is a fairly simple method I've come up with for creating a rough-stone paved ...</div></summary>
  </entry>

  <entry>
    <title>Back to the islands</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3284605"/>
    <id>http://yoursite/article/?i=f2be6acc94305bc9f86c3e55014b35cc</id>
    <updated>2008-08-01T19:00:35-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Getting back to the randomly generated island...

I had mentioned in a previous post that I was thinking about doing a Dragon Warrior-ish type of game, with a randomly generated world. You know, with an absurdly scaled player avatar wandering aroun...</div></summary>
  </entry>

  <entry>
    <title>More layouts</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3279671"/>
    <id>http://yoursite/article/?i=4d76de11e8856145f4ffa13e83212c16</id>
    <updated>2008-07-26T15:00:37-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After the last journal post, I got to thinking about how I tend to not like the layouts that accretion algorithm generates, especially with large numbers of boxes. There tends to develop a very tendril-like, tentacled appearance to the layouts, as later bo...</div></summary>
  </entry>

  <entry>
    <title>Layouts</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3277938"/>
    <id>http://yoursite/article/?i=898de07ccfeb4f59905cba634668b836</id>
    <updated>2008-07-24T08:30:40-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In the previous journal entry, I got into a bit of a discussion with Daerax about randomly generating dungeons. As I have described before, I typically use a system of progressive refinement, wherein I begin with a rough layout, and iteratively refine each...</div></summary>
  </entry>

  <entry>
    <title>Noise library</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3273805"/>
    <id>http://yoursite/article/?i=78ce5fe6faa798aaa64daa67f549a631</id>
    <updated>2008-07-19T13:30:18-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I still need to refactor a whole bunch of the noise library and associated source, but I'm uploading a zip of it anyway. Included is all source for the integrated Lua interpreter, based &#111;n the source for the official interpreter, with the noise librar...</div></summary>
  </entry>

  <entry>
    <title>More islands</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3271886"/>
    <id>http://yoursite/article/?i=7308873b9ed99b626272e66f530711a2</id>
    <updated>2008-07-16T23:00:21-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">


  Got the colormapping back up and running, and worked out a bug in the color curve as well. Tired now,...</div></summary>
  </entry>

  <entry>
    <title>Islands</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3270212"/>
    <id>http://yoursite/article/?i=080381f116d63f747a6e3724e905e875</id>
    <updated>2008-07-14T22:30:22-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">


For several years I've had it in my head to make an old-school Dragon Warrior &#115;tyle RPG, &#111;nly with...</div></summary>
  </entry>

  <entry>
    <title>Explody</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3097072"/>
    <id>http://yoursite/article/?i=c384f3b7fc275df1b45df6132db7d8da</id>
    <updated>2008-07-10T04:33:24-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I started tinkering with using noise to generate explosion sprites</div></summary>
  </entry>

  <entry>
    <title>More noise</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3265823"/>
    <id>http://yoursite/article/?i=ce412ca82a332e45e5021796bcaa5086</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">

Still tinkering away at the noise library, squashing a last few bugs and cleaning stuff up. The idea to allow a fractal to have any basis function for any layer was a good &#111;n...</div></summary>
  </entry>

  <entry>
    <title>More noise</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3258048"/>
    <id>http://yoursite/article/?i=1b371e0a40095f2771366af87efb0967</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've been revamping the noise library (again). Initially, it was modelled after libnoise, as a chained module system. It is still a chained module system, but I have redone things a bit differently. Before, the...</div></summary>
  </entry>

  <entry>
    <title>Back. And married.</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3252423"/>
    <id>http://yoursite/article/?i=5c9f843356ff0ee7a6fc3aa0072aa038</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Just got back from the honeymoon and assorted business. Good times were had by all. Got home yesterday and we settled down to the business of starting the new life together. This is the first time in over two weeks I've even been able to turn the computer ...</div></summary>
  </entry>

  <entry>
    <title>Erosion</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3232566"/>
    <id>http://yoursite/article/?i=a1ae8cdd962d3e985a4b6595ab5bf8cd</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally got off my lazy butt and implemented a hackish sort of terrain erosion in Accidental. Been playing with various somewhat-realistic hydrology-based models, but most either netted poor performance or poor results (due to ambiguous specifications in t...</div></summary>
  </entry>

  <entry>
    <title>Wireworld</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3231716"/>
    <id>http://yoursite/article/?i=1d774bcfa3e4a902838c4b890b534bbc</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Over the weekend I spent some time surfing through Googles of the usual set of topics, wrapping my head around the whole world of random generation again, and I stumbled upon Wireworld. I remember playi...</div></summary>
  </entry>

  <entry>
    <title>Holy impending doom, Batman!</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3226951"/>
    <id>http://yoursite/article/?i=6c9257867183c4a864e8ac58882af19f</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">So, I'm getting married in a couple weeks.

Oh, wait, forgot to say hi. Hi. Been a long time, I know.

Anyway, where was I? Oh, yeah. Marriage...

Kind of excited for it, actually. 33 years seems to me about the right length of time...</div></summary>
  </entry>

  <entry>
    <title>lol</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3170198"/>
    <id>http://yoursite/article/?i=391925c991bd2344cf8cebb077f32793</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>The year in detail...</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3133573"/>
    <id>http://yoursite/article/?i=bbc6b3cd6ca7a90526d84a7a12ef80e9</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Since recaps of 2007 seem to be in vogue, I figure I should jump &#111;n the bandwagon. This'll be short.

In 2007, I did...








Not a danged thing worth mentioning. Seriously, it was a pretty wasted year. Wo...</div></summary>
  </entry>

  <entry>
    <title>Hat</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3120371"/>
    <id>http://yoursite/article/?i=52b2c6ae35f72432dae262588aebd150</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">My hat is quite appropriate for the season now. Pblttt! to all those who told me I need to take it off. Pblttt, I say.</div></summary>
  </entry>

  <entry>
    <title>Wikipedia sucks</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3117144"/>
    <id>http://yoursite/article/?i=0c2efe8ebb6c0d6cdf646d2bd2cd4ec0</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">No, really, it does....

Also, there is some weirdness afoot &#111;n gamedev.net. For awhile now, occasionally when I am trying to load the site &#111;n my lappy, I get the message in the status bar about waiting for e.nvero.net, and Firefox hard-h...</div></summary>
  </entry>

  <entry>
    <title>Isometric art</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3112413"/>
    <id>http://yoursite/article/?i=ca46bb83dccbc08810a1a2eb94bfcd8e</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As a few of you know, in the past I've done a little bit regarding creating artwork for isometric games. I'm not really an artist; my background consists of high school art classes, and while I usually did well, art isn't my specialty. However, not being m...</div></summary>
  </entry>

  <entry>
    <title>Whoo hoo</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3105645"/>
    <id>http://yoursite/article/?i=ac14adfc5d1b9d3f9753fae9523b1cae</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here's something you don't see every day:



willystickman, you rock bro.</div></summary>
  </entry>

  <entry>
    <title>Iso</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3104237"/>
    <id>http://yoursite/article/?i=be3d594bced4682d9d33077f9559a01d</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Reading O-san and dbaumgart has really gotten me back in the isometric mood.</div></summary>
  </entry>

  <entry>
    <title>More explody</title>
    <link href="http://www.gamedev.net/community/forums/mod/journal/journal.asp?jn=259175&amp;reply_id=3102859"/>
    <id>http://yoursite/article/?i=a3406c32ffe66027b85027a1a00a9f0d</id>
    <updated>2008-07-10T04:30:11-07:00</updated>
    <author>
      <name>http://www.gamedev.net/community</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">EDIT: I hacked together a very quick and dirty little demo app to see the generated explosions in motion. You can download the zip here. It's crude, since I just pieced it toge...</div></summary>
  </entry>

  <entry>
    <title>blog:2010-aug-17 - L3DT release 2.9</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2010-aug-17"/>
    <id>http://yoursite/article/?i=14b835846e3bcf3afb25161f4d959a4c</id>
    <updated>2010-08-18T05:57:50-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  Release 2.9 of L3DT is now available for download. The focus for this update was on consolidation and refinement. Bugs have been fixed and existing features have been extended, but there are no radically new 'wow' features....</div></summary>
  </entry>

  <entry>
    <title>blog:2010-may-28 - Documentation</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2010-may-28"/>
    <id>http://yoursite/article/?i=4dc02c20ed59c4515d2b1eca1f4a8626</id>
    <updated>2010-05-27T15:31:31-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:201</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  With L3DT release 2.9 just around the corner, and the number of bugs found in the beta release mercifully few, I'm taking some time to update the user guide and other documentation. Fortunately, release 2.9 does not change much of the...</div></summary>
  </entry>

  <entry>
    <title>blog:2010-apr-27 - Windows 7 compatibili</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2010-apr-27"/>
    <id>http://yoursite/article/?i=1247b264a9948755f408ed28c8327868</id>
    <updated>2010-04-27T06:31:28-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:201</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  As you may know, there have been a few problems with running L3DT on Windows 7 using the Aero theme. I am pleased, and quite relieved, to announce that these problems should now be fixed in the latest developmental build of L3DT (v2.8 build...</div></summary>
  </entry>

  <entry>
    <title>blog:2010-jan-02 - User interface change</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2010-jan-02"/>
    <id>http://yoursite/article/?i=b4d9f47e9a814a9ec547dd290ef304af</id>
    <updated>2010-01-02T05:31:04-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:201</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  [Aside: Happy new year!]  Methinks it's time for a little clean-up of the L3DT user interface. Changes include:  The addition of icons for frequently-used menu options (see image below).  The Active map and Mouse tools menus have...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-dec-11 - ZeoScript compiler</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-dec-11"/>
    <id>http://yoursite/article/?i=b392457f246605384eb091381a7340f8</id>
    <updated>2009-12-11T05:01:15-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  In the latest build of L3DT Pro (v2.8 build 2, 10th of Dec '09), the ZeoScript plugin has been updated to use a just-in-time (JIT) compiler. The effect of this compiler is to increase the speed of loops in ZeoScript, and that it ...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-dec-03 - Compiler revisited</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-dec-03"/>
    <id>http://yoursite/article/?i=78efee1c56977f6a1a85325b1f405bff</id>
    <updated>2009-12-02T14:34:58-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  There are a number of features that I've been meaning to implement for several years, and every so often I pull one off the shelf and have another look at it. This week, it's the turn of just-in-time (JIT) compiling for scripts....</div></summary>
  </entry>

  <entry>
    <title>blog:2009-nov-26 - Importing Mars Terrai</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-nov-26"/>
    <id>http://yoursite/article/?i=5057ed2a5a6993d3c29617f0da74c4f8</id>
    <updated>2009-11-25T14:32:48-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  Following a user's recent request, I have added a plugin to import terrain from the Mars Orbiter Laser Altimeter (MOLA) mission. The plugin is called L3DTio_MOLA, and is available here. To use the plugin:  Download the MOLA &amp;lsqu...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-nov-19 - L3DT release 2.8</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-nov-19"/>
    <id>http://yoursite/article/?i=1f5025d3ad78d3fb88db285b03996d4a</id>
    <updated>2009-11-19T05:31:05-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  Release 2.8 of L3DT is finally available for download. The changes and improvements in this release were described previously in the v2.8 beta release announcement back in October. If you missed the announcement, or would enjoy reading...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-nov-03 - In the mean time...</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-nov-03"/>
    <id>http://yoursite/article/?i=37589d84a3db48380b93a4edb6792696</id>
    <updated>2009-11-03T03:01:53-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">With L3DT release 2.8 due in two weeks time, and hopefully all the debugging now sorted out with v2.8 beta 2, I now have some time to indulge in working on fun stuff for the next major release (v2.9). Just now I've been tinkering with the netw...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-oct-19 - L3DT release 2.8 beta</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-oct-19"/>
    <id>http://yoursite/article/?i=d5f986ff79c6c54cfd222d1bf5eb7a0c</id>
    <updated>2009-10-19T05:32:22-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  I am pleased to announce the availability of the first public beta release of L3DT version 2.8, the installers for which are on the downloads pages now.  Users of L3DT Standard Edition may download the update from the Standard Edition ...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-sept-18 - Update manager tweak</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-sept-18"/>
    <id>http://yoursite/article/?i=aefa91647bb3fa6d77f8d6e3f4c9aa1b</id>
    <updated>2009-10-18T15:02:19-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  There's been a little change to the update manager to more clearly indicate to owners of L3DT Pro licenses whether new updates are (or are not) included within the 18-month free update period of their license key.   I had found previo...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-aug-07 - Automatic loading of </title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-aug-07"/>
    <id>http://yoursite/article/?i=196116d80ac8e83b668192626bd2c20d</id>
    <updated>2009-08-06T16:31:09-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  The next release of L3DT will automatically scan the resources folder* on start-up, and load any new climates, materials or scripts found. This removes the requirement for the user to manually load each new file using the climate, material ...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-jul-03 - Plugins, scripts, and</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-jul-03"/>
    <id>http://yoursite/article/?i=c37f957b66281bb8f4305d469a00c511</id>
    <updated>2009-07-02T23:31:08-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  As I hope you are aware, L3DT includes extensive support for plugins and scripts, which allows users to add new features and otherwise make L3DT do what they want. However, most users are not programmers and few ever attempt to write their ...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-jun-28 - Plugin menu options</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-jun-28"/>
    <id>http://yoursite/article/?i=64b95d3b4c11d951361564eb099039d8</id>
    <updated>2009-07-02T23:31:08-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  The menu has been shuffled a little in the the latest developmental build of L3DT (v2.7 build 17, released today). Previously, plugins could only add items to the 'Extensions' menu in L3DT. In the latest developmental build...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-may-31 - Installing climates, </title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-may-31"/>
    <id>http://yoursite/article/?i=b14c01d398dc2c1f3caec428776b1531</id>
    <updated>2009-05-30T23:30:57-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  This is probably an instance of fixing something that ain't broke, but please bear with me...  If you find yourself downloading lots of 3rd party climates, materials, scripts, or extensions for L3DT, you may find it a chore to install...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-may-24 - Active map menu</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-may-24"/>
    <id>http://yoursite/article/?i=c3e4c6ac08d1bede8ce851610950b2f1</id>
    <updated>2009-05-24T05:30:51-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  For the next release I have re-sorted the menu to provide a new top-level menu called 'Active map'. This menu contains options that apply specifically to the current map layer displayed in the main window, including editing...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-mar-17 - Design map brush upda</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-mar-17"/>
    <id>http://yoursite/article/?i=649a5e912aa6cbb424b1556dd46113f6</id>
    <updated>2009-03-16T15:01:25-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  In the latest developmental build of L3DT Professional (v2.7.0.2, dated 16th of March 2009), I have re-designed the design map brush. In previous releases, it was a huge tool window containing no less than 28 controls, buttons, sliders...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-mar-09 - Version 2.7 dev build</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-mar-09"/>
    <id>http://yoursite/article/?i=c77b576545464df9ccfd4942ed8a8777</id>
    <updated>2009-03-09T04:00:56-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  The first new developmental build of L3DT Professional following release 2.7 is now available on the Pro downloads page1), and is entitled v2.7 dev build 1. This release includes some improvements to the Sapphire 3D renderer (UI tweaks, fas...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-mar-03 - Vale 'global' plugins</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-mar-03"/>
    <id>http://yoursite/article/?i=e34a17be369ed2cb923be6d0c16f9f7d</id>
    <updated>2009-03-03T02:31:05-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  Quite some time ago, a user requested an easy way to share plugins across different versions of L3DT. The idea was to make it possible to install a plugin once, and then use it thereafter in all subsequent versions of L3DT. Quite a reasonab...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-feb-28 - L3DT release 2.7</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-feb-28"/>
    <id>http://yoursite/article/?i=13053d9df5d11f3fa9399e1e5dd81361</id>
    <updated>2009-02-28T21:30:59-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/doku.php?id=blog:200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  I am delighted to announce that L3DT Release 2.7 is now available for download. Please read on to find out what's new, how to update, and what's coming next.   What's new?   As is traditional/habitual with release annoucements, the ful...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-feb-24 - Faster shadow casting</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-feb-24"/>
    <id>http://yoursite/article/?i=a3da546bf468c0a8ba2731c5b5dce07c</id>
    <updated>2009-02-24T04:00:44-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  With the final release version of L3DT v2.7 now 'in the bag' and awaiting imminent release*, I've turned my mind towards the vexed problem of shadow mapping. Put simply, L3DT's shadow mapper is painfully slow, a...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-feb-17 - Experiments with vide</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-feb-17"/>
    <id>http://yoursite/article/?i=81940c72379844fc845f6bdbfe3aa5bf</id>
    <updated>2009-02-16T07:30:37-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  I've started playing around with AVI recording in Sapphire. You can see some of my early handiwork in this panorama AVI [1.4MB], which is also on YouTube (see below), albeit with poorer quality.            A panorama recorded fro...</div></summary>
  </entry>

  <entry>
    <title>blog:2009-jan-28 - Writing and reading f</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2009-jan-28"/>
    <id>http://yoursite/article/?i=1ed92e8d37a2b4d2334591cc4399edf4</id>
    <updated>2009-01-28T06:00:53-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  In today's instalment of what may be the world's most sporadic weblog I'll discuss some of the new capabilities of L3DT's scripting language, ZeoScript. In particular, I'm going to show you how to use the new f...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-nov-20 - Undo</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-nov-20"/>
    <id>http://yoursite/article/?i=c235adf6f9d04144c28f537d1c2c92e8</id>
    <updated>2008-11-20T04:30:28-08:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A central feature of the upcoming L3DT v2.7 release will be 'undo' support, and it is now implemented and ready for testing in the latest developmental build (L3DT 2.6.0.6). Please drop by the downloads page to give it a try.  There are ...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-oct-28 - Helpful links</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-oct-28"/>
    <id>http://yoursite/article/?i=1e490a8c38500f3975b4e5e63bc28391</id>
    <updated>2008-10-28T04:30:31-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  In the next release of L3DT there will be an 'on-line help' link in every wizard that, when clicked, will take you to the appropriate page in the L3DT on-line userguide. The link will look a little something like this:     ...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-oct-25 - Changes to update man</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-oct-25"/>
    <id>http://yoursite/article/?i=f217bf82e203222805e2e6e80db72c71</id>
    <updated>2008-10-28T04:30:31-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  The first developmental build of L3DT Professional following release 2.6 is now available from the Pro downloads page. This build includes some improvements to the update manager, and changes to where some files are stored, as explaine...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-oct-18 - RIP: Old Atlas plugin</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-oct-18"/>
    <id>http://yoursite/article/?i=686f724a758747d2c47f38621ece59b7</id>
    <updated>2008-10-19T23:46:07-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  The old Atlas plugin for '3DT for Torque' is now officially retired, and won't be packaged with any future releases of L3DT (i.e. post v2.6). The new all-singing and all-dancing L3DTio_Atlas2 plugin is now installed ...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-oct-18_2 - L3DT release 2.6 Pr</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-oct-18_2"/>
    <id>http://yoursite/article/?i=b7a1d4c312fa93aa7443307c0cf7828d</id>
    <updated>2008-10-18T20:00:25-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  L3DT release 2.6 is now available for download in Professional and Pro for Torque flavours from here and GarageGames, respectively. In fact, it's been available for the last two or so weeks, but due to other commitments I'v...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-oct-16 - Duke Nukem Forever</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-oct-16"/>
    <id>http://yoursite/article/?i=0990ed1c0241b84e66396cf09963f2ea</id>
    <updated>2008-10-16T05:30:19-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I'll admit it; I am vaguely amused when people attempt to register for a trial license of L3DT Professional using an ostentatiously fake name like 'Duke Nukem'. Kudos for trying. No soup for you!  Cheerio, Aaron   PS: Release 2.6 o...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-oct-02 - It begins...</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-oct-02"/>
    <id>http://yoursite/article/?i=a60b290cae2f1d71cd9173cabfd69d9e</id>
    <updated>2008-10-02T07:31:06-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The launch of the v2.6 update to L3DT has begun, starting with the Standard edition (see release ann.) The Professional and L3DT for Torque editions will follow in a week or so, once I've finished writing their much lengthier release announcem...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-sept-18 - The worst thing abou</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-sept-18"/>
    <id>http://yoursite/article/?i=c42373ca374baa7af47d4037127968b6</id>
    <updated>2008-09-18T05:30:34-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">...is - without a doubt - tweaking the design/inflate heightfield algorithm. Every time I touch the code for design/inflate, or even think about touching the code, I instantly lose a week of my life.   Here's why: OK = zCalcHF_InflateMosaic&amp;...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-aug-29 - Light map calculation</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-aug-29"/>
    <id>http://yoursite/article/?i=64f3b9a563dee42ead00873d0236c58e</id>
    <updated>2008-08-28T23:30:25-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  Yesterday I posted some benchmark results comparing the speed of texture generation in with the current release (v2.5c) against the forthcoming release (v2.6). Today, I'm going to compare the speed of lightmap generation.   Benchmark ...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-aug-28 - Texture calculation b</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-aug-28"/>
    <id>http://yoursite/article/?i=9a44eb41db93ca037214e6bcb2058f16</id>
    <updated>2008-08-28T05:30:14-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  With L3DT release 2.6 only a few weeks away, I thought this might be a good time to run some head-to-head comparisons of the new release (v2.6) against the previous release (v2.5c). In particular, I'm going to show you just how far we...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-aug-27 - Tweaking the texture </title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-aug-27"/>
    <id>http://yoursite/article/?i=f2cfa59ffb01105819cbc9b63928fb61</id>
    <updated>2008-08-27T06:00:50-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  I spent a few hours tonight working on the texture generation algorithm. More specifically, I've been looking at reducing the &lsquo;overheads' from the mosaic system that make mosaic texture generation slower than generating no...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-aug-23 - L3DT version 2.6 beta</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-aug-23"/>
    <id>http://yoursite/article/?i=5b92addbda63a3783e7108fe69bb2a1b</id>
    <updated>2008-08-23T02:30:28-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  The beta release of L3DT version 2.6 is now available for download, in both Standard and Professional flavours. The expected release date for the final build of L3DT version 2.6 is nominally mid-September.   If you're not sure ho...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-aug-04 - Tabbed map view</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-aug-04"/>
    <id>http://yoursite/article/?i=27f3efdc0fb94a22f2ec078f095e2596</id>
    <updated>2008-08-03T16:00:46-07:00</updated>
    <author>
      <name>http://www.bundysoft.com/news/do</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  In case you were wondering, I have indeed been rather busy with new developments for the upcoming L3DT release 2.6. The latest developmental build (L3DT 2.5.4.14, 3rd of Aug 2008) includes several such improvements, which I'll be...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-mar-12 - Attributes map brush </title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-mar-12"/>
    <id>http://yoursite/article/?i=7dab8abd6b6b2c81e4903c9d0d4617e4</id>
    <updated>2008-07-14T15:09:05-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  In todays show-and-tell, I have for your perusal the new attributes map brush tool in the Sapphire 3D editor/renderer. This brush allows you to manually paint land types onto the attributes map, which will then be baked' onto t...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-jan-18 - Updates to Spring plu</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-jan-18"/>
    <id>http://yoursite/article/?i=2dc0c6fef3165f8335678d9deabd2e31</id>
    <updated>2008-07-14T15:07:04-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Everyone,  In the latest developmental build of L3DT Pro (v2.5.2.27, 17th of Jan 08) there have been some further updates to the Spring export/import plugins.   Spring SD7 format support   Firstly, the plugins now export directly to the co...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-jul-12 - Multi-core benchmarks</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-jul-12"/>
    <id>http://yoursite/article/?i=d959250a142383901c467a5d0bfc072e</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  I've been fixing and testing L3DT's mosaic system on multi-core processors, and I thought you might be interested to see some of the performance results.   The graph below shows the pixel throughput of the texture map calculatio...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-may-23 - Compiler upgrade</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-may-23"/>
    <id>http://yoursite/article/?i=843fe5b9af6e093e2ef5355bea51f253</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  I've finally taken the leap and upgraded my C++ compiler. Assuming nothing goes too far awry this time (unlike last time), the next release of L3DT will be built with MSVC9, along with any plugins that are upgraded between now and the...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-may-19 - Real-time texture pai</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-may-19"/>
    <id>http://yoursite/article/?i=0d69c232b9b7f1e174be1b0fd3b747e6</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  Today I've been experimenting with a texture painting brush in Sapphire. First things first, here's a screenshot:           Using the new texture brush to paint snow caps on mountains.       To paint the texture, this brush work...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-apr-13 - Recent happenings</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-apr-13"/>
    <id>http://yoursite/article/?i=8a2dd3c7d73d1ec30d56770339a6c673</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi All,  This is a quick rundown of recent events:  A new developmental build is available (L3DT 2.5c build 10.)  L3DT Pro now supports user mode in Vista.  The network communications plugins are coming along nicely (can send maps and run some calcu...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-apr-08 - Network transmission </title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-apr-08"/>
    <id>http://yoursite/article/?i=6de38fcb1ce97e8d7e2a5ce3fa10edfd</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After several frustrating hours of messing around, I've finally got L3DT's new (and unreleased) network server and network client plugins sending maps between one-another. This is the first step towards having a networked render-farm sys...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-apr-05 - Climate paths changed</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-apr-05"/>
    <id>http://yoursite/article/?i=31fe407101c6dbfd5fc4505eaf4991ef</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In a belated concession to Windows Vista, the directory that L3DT uses to store climates and materials will move from:  C:\Program files\Bundysoft\L3DT [version]\Resources\Climates\  to (WinVista):  C:\Users\[your username]\AppData\Roaming\Bundysoft...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-mar-22 - L3DT release 2.5c is </title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-mar-22"/>
    <id>http://yoursite/article/?i=28de7f13e404ad664c47e4f406ab6acb</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">L3DT release 2.5c is now available on the download pages in both Standard and Professional editions, and is also available for download via the GarageGames.com site for L3DT for Torque users.   Free update? (yes and no)   This is a free update for a...</div></summary>
  </entry>

  <entry>
    <title>blog:2008-mar-18 - Coming soon: Update M</title>
    <link href="http://www.bundysoft.com/news/doku.php?id=blog:2008-mar-18"/>
    <id>http://yoursite/article/?i=1fb46b2930bd73d3d29d296721173201</id>
    <updated>2008-07-14T15:04:11-07:00</updated>
    <author>
      <name>3e7a979da69b00bac9e79ddccef6a298</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Coming soon to a version of L3DT near you will be an update manager window, such as that shown below:     The purpose of this feature, as it explains itself (see text in window above), is to allow users to check for updates to L3DT or critical alert...</div></summary>
  </entry>

  <entry>
    <title>What if We Created CC Materials?</title>
    <link href="http://dejobaan.blogspot.com/2008/09/what-if-we-created-cc-materials.html"/>
    <id>http://yoursite/article/?i=64f1a700c8787026cb958694cc7d0243</id>
    <updated>2008-09-10T23:00:43-07:00</updated>
    <author>
      <name>http://dejobaan.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There's some freely available content for game developers out there. What if we made certain assets from our next game freely available to other developers, and used the proceeds from the game's sales to create more content that's freely available to them? Here's a chart to help obfuscate this process.</div></summary>
  </entry>

  <entry>
    <title>Galaxy Rage - The Voice Over the Phone</title>
    <link href="http://dejobaan.blogspot.com/2008/09/galaxy-rage-voice-over-phone.html"/>
    <id>http://yoursite/article/?i=2a91b2ce954c3d5e6a1449f5ec1c076d</id>
    <updated>2008-09-03T16:01:00-07:00</updated>
    <author>
      <name>http://dejobaan.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We've been mucking around with the Galaxy Rage soundtrack. The latest track is a (crude) demo called The Voice Over the Phone. It's intended to be played over something with (perhaps) shifting terrain.</div></summary>
  </entry>

  <entry>
    <title>Valve Publishes The Wonderful End of the</title>
    <link href="http://dejobaan.blogspot.com/2008/07/valve-publishes-wonderful-end-of-world.html"/>
    <id>http://yoursite/article/?i=4a1dfa8c6ab26cbb7fef68385c83e61c</id>
    <updated>2008-07-24T14:00:51-07:00</updated>
    <author>
      <name>http://dejobaan.blogspot.com/200</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Valve has published The Wonderful End of the World on their Steam platform. Three cheers for... well, everyone, really.</div></summary>
  </entry>

  <entry>
    <title>Galaxy/Inago 2 - Algorithmically Generat</title>
    <link href="http://dejobaan.blogspot.com/2008/07/galaxyinago-2-algorithmically-generated.html"/>
    <id>http://yoursite/article/?i=dedae2df0d9ca66a29dd2ac109292975</id>
    <updated>2008-07-22T03:38:52-07:00</updated>
    <author>
      <name>a66743d96595f746e33caa9f370be137</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Last year alone, game development studios spent twice the GDP of Sweden developing 3D models for FPS weaponry. Wouldn't it be nice if we could automate this process to some extent?Our intern, Eric, is working on a system to algorithmically model weapons for our upcoming shooter. It's all about modularity -- start with a base, and begin tacking things on. If this approach works, we'd like to extend it to enemies and, potentially, entire levels.</div></summary>
  </entry>

  <entry>
    <title>Galaxy/Inago 2 - Mockups</title>
    <link href="http://dejobaan.blogspot.com/2008/06/galaxyinago-2-mockups.html"/>
    <id>http://yoursite/article/?i=011248ab33e69d298d2f6702efdae218</id>
    <updated>2008-07-22T03:38:52-07:00</updated>
    <author>
      <name>a66743d96595f746e33caa9f370be137</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Two mockups for the project that is Galaxy/Inago 2. These are inventory/buy/sell screens. When you enter a round, you'll hop in with your personally selected arsenal of weapons, defenses, deployables (e.g., turrets), and other heaps of awesome.</div></summary>
  </entry>

  <entry>
    <title>Our Summer Projects</title>
    <link href="http://dejobaan.blogspot.com/2008/06/our-summer-projects.html"/>
    <id>http://yoursite/article/?i=b119ddd9cefbfd60053174371bcaab06</id>
    <updated>2008-07-22T03:38:52-07:00</updated>
    <author>
      <name>a66743d96595f746e33caa9f370be137</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"> Our 13th and 14th projects: Galaxy Rage (Inago Rage II) and The Wonderful End of the World II.</div></summary>
  </entry>

  <entry>
    <title>Improved volumetric clouds</title>
    <link href="http://unigine.com/devlog/66/"/>
    <id>http://yoursite/article/?i=4aef3bb2529e89d7c2fe14bf577e7a21</id>
    <updated>2009-07-11T22:49:07-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/66/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Recent changes:
New volumetric clouds, updated ObjectSky.

...</div></summary>
  </entry>

  <entry>
    <title>Bugs depopulation</title>
    <link href="http://unigine.com/devlog/65/"/>
    <id>http://yoursite/article/?i=eca8b3af04458cf5d4cf52d49543141e</id>
    <updated>2009-06-24T04:31:06-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/65/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

	Fixed crashes on OpenGL / NVIDIA.
	Fixed wrong collisions of a mesh with a convex hull.
	Fixed higlighting of sliders in GUI.
	No more stalls during grass generation.
	Clusters speedup.
	Optional warm start for particle systems.
	Multi-threaded update of world nodes.
	Reduced memory consumption by meshes (32 bytes for static mesh vertex, 48 bytes for skinned mesh one).
	Two-pass preprocessing of scripts for full collection of data on classes and prototypes.
	Added a new sample of selecting objects by mouse (data/samples/systems/selection_00).
	Added experimental Cg shaders for NVIDIA GPUs, that translate GLSL code into NVIDIA OpenGL assembler instructions (this approach provides 5-10% performance boost in OpenGL in comparison with high-level GLSL code).
	Added OpenCL wrapper.
	Saving of unique IDs of nodes into world/node files.
	Correct work of isVisible flag in nodes, besides that the list of visible nodes of a world is accessible now (engine.world.getVisibleNode(index)).
	Fixed a heap of minor bugs.



Also we have two more people in the team: Nadezhda Ovchinnikova (technical writer) and Kuat Eshengazin (lead QA engineer).


PS: No pictures today, sorry.
</div></summary>
  </entry>

  <entry>
    <title>World layers, editing of node references</title>
    <link href="http://unigine.com/devlog/64/"/>
    <id>http://yoursite/article/?i=7ca65d9644ec630c5315da6353dc721b</id>
    <updated>2009-06-15T10:31:58-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/64/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

	World layers support via new NodeLayer: they are stored in separate files, which is more convenient way for collaborative work on a project.
	In-place editing of NodeReference from the editor.
	Reduced memory consumption by NormalMapper and AmbientMapper.
	Fixed WorldCluster crashes.
	Fixed wrong texture coordinates in volumetric clouds.
	New flag for ImageDDS: -a allows to downsample a large source image into smaller one with preserving alpha-testing accuracy (don't use this for alpha-blending).
	Fixed buffer overflow in dynamic meshes.
	Correct playback of skinned mesh animation with negative speed.
	Optimized performance of sectors and portals.
	Added engine.editor.releaseNode() function, which removes a node from the editor list, but doesn't delete it.
	Aspect ratio for grass instead of separate width/height settings.
	Material of multi-layer paint (mesh_paint_base).
	Fixed editing of shapes and joints in UnigineEditor.
	Adjustable shadow offset for billboard leaves.



Here you can see the difference in alpha-testing with enhanced downsampling via ImageDDS:




Multi-layer paint material is good for car paint:











Some additional landscape improvements in our game in development (grass everywhere, massive tree arrays):





PS: We are also to announce the next major step forward, which we made recently, so stay tuned.
</div></summary>
  </entry>

  <entry>
    <title>Performance profiler for scripts, improv</title>
    <link href="http://unigine.com/devlog/63/"/>
    <id>http://yoursite/article/?i=11ade446b9fca55f40f92cbb4473d813</id>
    <updated>2009-05-26T09:30:58-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/63/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

	Performance analyzer for UnigineScript (in GProf style).
	Refactored grass (significantly improved performance, support of different shapes, more adjustable parameters).
	Improved render precision for distant areas.
	Postprocesses don't affect wireframe visualization now.
	Performance optimization of LightWorld.
	Recursive preprocessing of namespaces in UnigineScript, no more forward declarations.
	Warnings on wrong arguments for functions with arbitrary number of arguments in UnigineScript.
	Added billboard flag in ObjectGui.
	Support of OGA and OGV file extensions for audio and video files in OGG format.



To see the performance analyzer output, type "world_analyzer" (world script) or "system_analyzer" (system script) or "editor_analyzer" (editor script) in the console:



If you want to dump this output into a file, pass its name as an argument: "world_analyze logfile".
The perfomance analyzer works only with debug builds.
The following counters are available:

total seconds (this is the total number of seconds the interpreter spent executing this function)
self seconds (this is the number of seconds accounted for by this function alone, without internal calls of other functions)
calls (this is the total number of times the function was called)
total ms/call (this represents the average number of milliseconds spent in this function and its descendants per call)
self ms/call (this represents the average number of milliseconds spent in this function per call)

Output is sorted by "self seconds" field.


Updated grass can be seen in "Forest" demo, which is included into the Unigine SDK:








PS: There is also a component-based game framework almost ready, it will be soon delivered to our customers.


PPS: We have updated our public demos, Tropics 1.2 and Sanctuary 2.2 can be downloaded from our website.


PPPS: We are hiring talented people in Tomsk, Russia.
</div></summary>
  </entry>

  <entry>
    <title>Introducing LightProb and support of mas</title>
    <link href="http://unigine.com/devlog/62/"/>
    <id>http://yoursite/article/?i=75beea995efe37d5909d736f9ffefd4e</id>
    <updated>2009-05-13T07:00:59-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/62/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

	New type of lights: LightProb, which is suitable for simulation of global illumination for dynamic objects.
	Access to command line arguments from UnigineScript.
	Rendering of screenshots into HDR images.
	Fixed ObjectVolumeBox rasterization.
	Fixed ObjectMeshDynamic crashes.
	Spatial subdivision optimization.
	Faster world loading.
	Range of material priority has been extended to [-8;8].
	Easy registration of 3rd-party C++ functions as script class members via C++ API.
	Unique IDs for nodes, bodies, shapes and joints (repetitiveness is guaranteed for the same world on different machines).
	Eliminated position lag between world and visualizer.
	Dedicated spatial tree for clutter objects ("clutter" flag in nodes).
	Reduced memory consumption on scenes with large amount of objects.
	Additional impostor configuration parameters.
	WorldTransformExpression gained access to a parent node.
	Two-argument version of check() method for containers.
	Performance boost of UnigineScript with external classes.
	Added WorldCluster object.
	Added accumulation of profiler counters' values.
	Support of anti-aliasing in image grabber.
	NodeRef renamed into NodeReference (use scripts/Upgrade/upgrade.py to upgrade your data).
	New NodeDummy type of nodes for grouping (ObjectDummy is to be used for physical purposes now).
	Support of new postfixes by imagedds.py: dr, sr, nr, hr, ar, lr (raw textures).
	Specular reflection is modulated by Fresnel effect on all meshes.
	Transition to ATI1 format for all single-component textures (ambient and height maps require regeneration by means of imagedds).
	Enter/leave callbacks for WorldTriggers can be set via UnigineEditor now.
	NodeReferences store references to all required material and properties libraries.
	Support of public/private access level modifiers in UnigineScript's classes.
	Automatic inline of getSomething() functions in UnigineScript.
	Support of &lt;&lt; and &gt;&gt; bitwise operators in UnigineScript.
	Two-pass compilation of scripts, function and class prototypes aren't required now.
	Support of additional text for WidgetIcon.
	Switch and toggle types of parameters in properties.
	Support of multiple materials per shape in Maya plugins.
	Correct rendering of visualizer with HDR and other postprocesses.
	Group set of parameters for nodes in UnigineEditor.
	Group rename of nodes by a mask ("%d" and "%1d" formats are supported).
	Camera moved out of high-level Character system.
	Externs package has been integrated into the SDK.
	Fixed corruption of %PATH% on MS Vista in the installer.
	Updated reference manual.



Some notes regarding LightProb: it's a special type of light source, which is based on baked spherical harmonics.
They are intended to be used in large groups, providing some kind of global illumination.
LightProb can have ellipsoid shape.
Due to compact format (9 vec3 values per light) it's possible to bake series of presets for a light and interpolate between them, simulating dynamic change of environmental lighting.
Objects are rendered without instancing in LightProb rendering pass.


Here is an example of different types of lighting baked into LightProb:








WorldCluster is a smart container for a baked heap of NodeReferences.
Only visible NodeReferences from a WorldCluster are added to the world, so it's really fast.
To group some NodeReferences into a WorldCluster, you have to make it their parent in node hierarchy and press "create" button in the editor.
See new "Forest" demo as an example.


Due to severe changes in structure of the SDK, please uninstall previous version before switching to the current one.
Don't forget to run new version of upgrade.py also to upgrade your data (see documentation for more details).
</div></summary>
  </entry>

  <entry>
    <title>Screenshots from our forthcoming game</title>
    <link href="http://unigine.com/devlog/61/"/>
    <id>http://yoursite/article/?i=70f4b012ca147358ee8282d963876384</id>
    <updated>2009-04-23T10:01:24-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/61/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Unigine is also a heart of another game, which has been developing in our studio for 3 years.
We are still making some experiments with the gameplay, so it's hard to name genre of the project yet.
However, we can say for sure that the project will have eye-candy graphics.
Game world isn't very huge because we have limited resources of our content team, but it's large enough to prove that Unigine is capable to handle detailed worlds.


Eating our own dog food is a good idea, because we understand needs of our clients better by doing this.
The game is a great sandbox for the engine and tools, a lot of performance and scalability issues have been solved during the development.



The world has 64 km2 (8x8 km) terrain (it lacks plants at the moment, we are working on that):



Atrium in the city:



Fountain in the courtyard:



One of the characters:




Tuning physics of a car:



The same car wheeling through parking:



Nice hallway with sculptures:




All of the scenes from this screenshots run smoothly on ATI HD4850 / NVIDIA 8800GT, however we are still working on optimizations, so hardware requirements will be lower.


This is an independent project of our company developing without a publisher.
It seems that it would be the right time to make official announce of the project in May.
Release is planned for this year.


PS: We plan to provide access to working materials of the game for our clients in 2 weeks.
</div></summary>
  </entry>

  <entry>
    <title>Players refactoring, render speedup</title>
    <link href="http://unigine.com/devlog/60/"/>
    <id>http://yoursite/article/?i=86324d52443f83dfd5881fbb74c077ec</id>
    <updated>2009-04-16T10:31:07-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/60/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

	Various render performance optimizations.
	Improved rasterizing occluders.
	Decals from particles.
	ObjectMeshDynamic can be created from a mesh file.
	New type of occluders: WorldOccluderMesh, which can have arbitrary geometry.
	Added WorldTransform, WorldTransformBone and WorldTransformExpression node types for transformation of nodes by a spline, an animation and an expression.
	Added set of functions for easy manipulations with node transformations.
	Binary format of spline files.
	Callbacks for physics, triggers and GUI are moved to the appropriate classes.
	Inheritance of parent object's animation in skinned meshes (useful for attaching clothes to a character body).
	Added field for arbitrary user data in each node.
	Added reflection masks for lights.
	Updated spline exporter for 3dsMax.
	System profiler now accumulates values from counters with the same name.
	Optimization of shadow rendering for LightWorld.
	Fixed screenshot grabbing under Direct3D9.
	Heavily refactored players, now they are full-featured world nodes.
	NodeRef caching on load, it leads to faster world loading.
	Additional sorting of equidistant from the camera transparent surfaces by blend function.
	Improved camera for high-level Character system.
	New high-level controls system in UnigineScript (see data/scripts/input).
	Updated reference manual, added "Programming / High-Level Scripts / Character System" article.



Here is an animation tree scheme for new character sample, which is included in the SDK:




PS: We have updated Unigine development roadmap for this year, now you can see status of scheduled features.
</div></summary>
  </entry>

  <entry>
    <title>Cell support, animation tree</title>
    <link href="http://unigine.com/devlog/59/"/>
    <id>http://yoursite/article/?i=43b4f0bdf272caf047a4b40043d75004</id>
    <updated>2009-04-01T10:01:14-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/59/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

	Support of Linux on PlayStation 3 (with null render).
	New SPUShader class for work with SPU-based programs (works via libspe2 in Linux).
	Added Altivec optimizations for PowerPC CPUs.
	Full support of little and big endian platforms.
	CUDA framework.
	Added compact profiler mode ("show_profiler 1" console command, full view is "show_profiler 2").
	World spatial subdivision optimizations.
	Mesh intersection speedup.
	Fixed engine crashes, which were caused by memory corruption.
	Added set()/get() functions for indexed access to all containers in UnigineScript.
	Billboard-based material for foliage (an option of mesh_leaf_base material).
	Plugins for Maya 2008 (9.0).
	Fixed texture path issue in UnigineExport script for 3dsMax.
	Fixed plugins for 3dsMax (mesh export with applied modifier).
	Simple framework for software rendering.
	Updated shadow biases for all supported hardware.
	Mesh-based water use UV coordinates for waves (keep it in mind for old content).
	UnigineScript: call() and thread() functions can accept an array as second argument.
	Changed format of decals storing (run upgrade.py script to upgrade data, see more in the documentation).
	Improved high-level character system with full-featured animation tree (see "character" demo in the SDK).
	New detailed tutorial in documentation: Content Creation -&gt; How to... -&gt; Setup Sky and Water.



Unigine seems to be running fine on PS3 in home-brew mode (with Linux), however there is no access to GPU, so it supports only null render or simple software render for physics debug.
Due to well-designed Unigine's framework the porting to this point was quite easy.


This is a screenshot from new "character" demo:



Since March, 13 a new great book of ShaderX series is available: "ShaderX7: Advanced Rendering Techniques", edited by Wolfgang Engel.
Section 4 (Shadows) of the book contains an article "Practical Cascaded Shadow Maps" by Fan Zhang, Alexander Zaprjagaev (CTO of Unigine Corp.), Allan Bentham. The described shadowing technique is used in the Unigine engine, providing fine shadows with arbitrary scene geometry.




PS: Networking module is slightly delayed due to some unsolved issues with physics synchronization.


PPS: There is also a non-official Unigine crew blog started recently, where you can find some more info about our social life.
</div></summary>
  </entry>

  <entry>
    <title>Animation buffers, new memory manager</title>
    <link href="http://unigine.com/devlog/58/"/>
    <id>http://yoursite/article/?i=eaa11872a89098edefa0a67b10ef4329</id>
    <updated>2009-04-01T10:01:14-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/58/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

	New memory allocator, which can show memory fragmentation.
	New memory_dump console command for displaying memory fragmentation (numbers means allocations count in some point, 'x' means more than 16 allocations).
	New garbage collector (ref-counter based) which eliminates stalls (old one was called only each 32nd frame).
	Fixed bug in animation export plugins, which occured with large number of weights per point.
	New global "light distance" parameter in render settings.
	Added support of Object and ObjectMeshDynamic into C++ API (see API examples).
	GL_vertex_array_object extension is required now, please update your video drivers.
	Support of binary XML files for release version (they loads faster, consumes less memory and causes less fragmentation).
	New "xmltree" tool for compilation/decompilation XML files into/from binary format.
	Fixed Fresnel refraction on NV40 / OpenGL.
	Fixed streaming-related crashes under OpenGL.
	New global "light distance" parameter in render settings.
	"render_manager_reload mesh" reloads only meshes, "render_manager_reload texture" reloads all textures.
	Support of inplace array creation inside foreach structure of UnigineScript: foreach(int i; (0,1,2,3)).
	Added system of animation buffers.
	Correct font wrapping for RichText.
	Force set of WidgetGridBox proportion, columns are of fixed size.
	Added sample of integration RakNet (a high-level networking library) into Unigine (see source/samples/Network/RakNet), which is still in the development.



New allocation policy: by default there are two memory pools (128Mb each), one of them is used for allocations less than 32Kb, another one is for the rest (so by default the engine requires 300+Mb).
If these pools are already full, the engine allocates additional 128Mb pool.
Plus there are fixed allocators for 2n memory pieces, up to 128Kb.
Memory manager also performs bound checking for allocated memory.
Use memory_dump to see current fragmentation map:




Skinned mesh animation system now operates by tempararily buffers of bone transformations.
One can apply different operations to them (copy, invertion, interpolation, multiplication).
So these buffers allow creation of complex animation trees.
Animation layer can be treated as a CPU ALU and buffers are like CPU registers.


PS: There is a new interview with our customers, who is creating an "Afterfall" post-apocalyptic cRPG basing on Unigine (Polish only, sorry).
</div></summary>
  </entry>

  <entry>
    <title>Annimation buffers, new memory manager</title>
    <link href="http://unigine.com/devlog/58/"/>
    <id>http://yoursite/article/?i=e0c79ee99b577aecccd00662aa41d675</id>
    <updated>2009-03-05T04:30:52-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/58/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

	New memory allocator, which can show memory fragmentation.
	New memory_dump console command for displaying memory fragmentation (numbers means allocations count in some point, 'x' means more than 16 allocations).
	New garbage collector (ref-counter based) which eliminates stalls (old one was called only each 32nd frame).
	Fixed bug in animation export plugins, which occured with large number of weights per point.
	New global "light distance" parameter in render settings.
	Added support of Object and ObjectMeshDynamic into C++ API (see API examples).
	GL_vertex_array_object extension is required now, please update your video drivers.
	Support of binary XML files for release version (they loads faster, consumes less memory and causes less fragmentation).
	New "xmltree" tool for compilation/decompilation XML files into/from binary format.
	Fixed Fresnel refraction on NV40 / OpenGL.
	Fixed streaming-related crashes under OpenGL.
	New global "light distance" parameter in render settings.
	"render_manager_reload mesh" reloads only meshes, "render_manager_reload texture" reloads all textures.
	Support of inplace array creation inside foreach structure of UnigineScript: foreach(int i; (0,1,2,3)).
	Added system of animation buffers.
	Correct font wrapping for RichText.
	Force set of WidgetGridBox proportion, columns are of fixed size.
	Added sample of integration RakNet (a high-level networking library) into Unigine (see source/samples/Network/RakNet), which is still in the development.



New allocation policy: by default there are two memory pools (128Mb each), one of them is used for allocations less than 32Kb, another one is for the rest (so by default the engine requires 300+Mb).
If these pools are already full, the engine allocates additional 128Mb pool.
Plus there are fixed allocators for 2n memory pieces, up to 128Kb.
Memory manager also performs bound checking for allocated memory.
Use memory_dump to see current fragmentation map:




Skinned mesh animation system now operates by tempararily buffers of bone transformations.
One can apply different operations to them (copy, invertion, interpolation, multiplication).
So these buffers allow creation of complex animation trees.
Animation layer can be treated as a CPU ALU and buffers are like CPU registers.
</div></summary>
  </entry>

  <entry>
    <title>Improved data streaming, KeyLine and new</title>
    <link href="http://unigine.com/devlog/57/"/>
    <id>http://yoursite/article/?i=718d6d340191449ac00b87bcb13b50a3</id>
    <updated>2009-02-21T09:00:45-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/57/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

	Smart data streaming: textures shows 64x64 mipmap (those miniatures are always loaded in memory) before fully loaded, meshes are rendered when loaded.
	Separate thread for data loading, which allows smoother data loading in the background without stalls.
	Loading queue can be controlled by a set of filesystem_* console variables.
	Improved warming up of shaders on world loading.
	manager_preload_* console variables renamed to render_manager_load_*.
	New formats of meshes: static meshes store their boundings for faster preload, plus there is a more effective data compression for both static and skinned meshes (warning: you must convert your data in order to work with this version, see notes about upgrade system below).
	meshupgrade console tool for converting all meshes into new formats.
	Fixed light masks for LightSpot sources.
	Refactoring of mathlib, some Fast* functions removed.
	Correct interpolation for negative frames in MeshSkinned (also added getFrameCurrent() function).
	Per-bone weight normalization for animation.
	New framework for plugins.
	MeshSkinned import plugins for 3dsMax and Maya.
	Contact toggle for WorldTrigger.
	Added array.find() function with two arguments in UnigineScript, returns second argument if nothing found.
	engine.splash.renderSplash() function renamed to engine.splash.renderInterface().
	Added addLayer() function for MeshSkinned without flushing data on other layers.
	Added engine.memory.* set of functions in UnigineScript library.
	Static 2D reflections (reflection_dynamic state in water_base and mesh_reflection_2d materials, static by default).
	MeshViewer shows basis and name for bones.
	Removed support of Intel compiler and MinGW.
	Quadratic exposure mode for HDR (set render_hdr console variable to "2").
	Improved class casting in UnigineScript, Foo(input).function() syntax is supported now.
	Support of Linux 64 bit with cross-compilation (use "scons cross=x86" or "scons cross=x64" depending on base platform).
	Versions of XML data (world, node, mat, prop, ui) can be different from this moment.
	New data upgrade system.
	New KeyLine system for key sequences, see "Programming / UnigineScript / Scripts / KeyLine Script" section of the manual for more information.
	Updated C++ API documentation and reference manual.



KeyLine system handles arbitrary key sequences and takes care of interpolation between key values, providing GUI for data manipulation as well.
It is a somewhat data-driven system, meta-information is stored in the XML format.
Licensees can see how this system is used in new version of Tropics demo for dynamic environment control.




We also introduce a new one-button upgrade system, see 'scripts/Upgrade' directory in the SDK.
Please note that it requires updated Unigine_Externs package installed and 'Unigine_Externs/bin' in your system's PATH variable.
To perform batch meshes upgrade you should simply run "upgrade.py --target=PATH-TO-YOUR-PROJECT" from the command line.


PS: Don't forget to update your video drivers to recent ones (but be aware about some bugs in OpenGL with ATI), previous version from NVIDIA was very buggy.
</div></summary>
  </entry>

  <entry>
    <title>Animation changes, external GUI</title>
    <link href="http://unigine.com/devlog/56/"/>
    <id>http://yoursite/article/?i=5750f3bccdba71e311695639e1174461</id>
    <updated>2009-02-04T09:30:42-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/56/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Changes of this month:

 External GUI via wxWidgets (for new editor) through C++ API in progress.
 Physical contacts are accessible from PlayerSpectator and PlayerPersecutor.
 StreamRead and StreamWrite are merged into Stream class, which can be used to transfer File and Stream objects into C++ part.
 Image class added to C++ API.
 Controls are now accessible via C++ API.
 setUpdate()/setUpdate functions in C++ API, which controls whether the application will be updating when the window is hidden.
 User-defined classes can be used as keys of maps in UnigineScript.
 Alpha testing is available for mesh materials with detail.
 C++ like scoping for derived classes in UnigineScript (search inside itself, search inside parent class, search its own namespace, search inside parent namespace).
 Reduced number of allocations in call() operator of UnigineScript.
 Simple ImageView tool for viewing of all supported texture formats.
 Improved new() operator now supports the following statements: new("Foo"), new("File","file.txt","wb") in UnigineScript for objects construction of user-defined and extern classes.
 Support of dual quaternion skinning with uniform bone scaling (optional, controlled by render_use_dual_quaternions console variable, disabled by default).
 setFrameBoneTransform() / getFrameBoneTransform() members of ObjectMeshSkinned work in local space.
 Increase of bones per surface limit to 96 (non-uniform scaling isn't supported anymore, be aware).
 New format of skinned meshes (use ResourceEditor for upgrading; don't forget to update plugins), which treats all bone transformations in local space.
 Heavily refactored WidgetListBox and WidgetTreeBox widgets.
 Added multiple re-parenting for nodes in the editor.
 WorldTrigger can be activated by a contact.
 Access to a parent widget in GUI.
 Fixed FOV in camera export script for 3dsMax.
 Animation export plugin for 3dsMax supports compact sanim format.
 High-level scripts are moved into data/scripts directory.
 No more seams on splatting terrain with DX9.0 hardware.
 MeshViewer shows bones hierarchy.
 Optional support of dual quaternions in MeshViewer.
 Shaders performance optimization.
 Support of warming shaders after loading of the world (render_manager_warm_shaders console variable, disabled by default).
 SCons 1.2.0 is supported, it's highly recommended to upgrade to this version.



Here is an example of external GUI for Unigine (it will be used for new version of UnigineEditor, which is scheduled for this year):




Compare results of ordinary animation (note skinning distortion due to large twist angle):



...with dual quaternions one, which provides better quality:




PS: Unigine has celebrated 5th anniversary recently, it's quite a long run, wow.
</div></summary>
  </entry>

  <entry>
    <title>Happy New Year!</title>
    <link href="http://unigine.com/devlog/55/"/>
    <id>http://yoursite/article/?i=28365a5fd2ea4330b52ab621a75f720f</id>
    <updated>2008-12-31T05:30:43-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/55/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Changes of this week:

 Added access to collision contacts of Players.
 Fixed minor bug in UnigineScript with namespaces and user-defined classes.
 Refactored Actor system.
 LightSpot performance optimization.
 User classes in UnigineScript can be stored as keys in maps.
 Character class divided into Character, CharacterParticipant, and CharacterNpc.
 Fixed missing Windows SDK issue in install.py script.
 Updated reference manual (Console, UnigineScript library).



Current Unigine codebase statistics:

engine            6611 Kb  672 files  237312 lines
shaders           1148 Kb  288 files   41467 lines
scripts            162 Kb   15 files    5862 lines
editor            1221 Kb   96 files   42125 lines
tools              765 Kb   61 files   27704 lines
app main            62 Kb   28 files    2238 lines
app samples        238 Kb   62 files    9871 lines
build system        39 Kb   29 files    1770 lines
build scripts       59 Kb   91 files    1736 lines
docs scripts        30 Kb    7 files     963 lines
total            10339 Kb 1349 files  371048 lines






Happy New Year!
</div></summary>
  </entry>

  <entry>
    <title>Cinematic DoF and fast lights</title>
    <link href="http://unigine.com/devlog/54/"/>
    <id>http://yoursite/article/?i=300ba43d27cc1dca1ff43f01844fc3f1</id>
    <updated>2008-12-23T10:30:30-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/54/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Programmer news:

 Dedicated shaders for non-shadowed surfaces, huge speedup on high quality shader profile.
 Severe renaming of shader constants due to refactoring.
 Added set of functions for access to packed files (engine.filesystem.getNumUngPackageFiles and others).
 Per-node storing of properties and materials (use this feature carefully with materials because it can affect performance).
 More verbose scripts parser: filename for #warning and #error, added __FILE__ and __LINE__ defines, more informative asserts and breakpoints.
 Fixed PSD saving code.
 More samples with lights.




Artist news:

 New LightSpot object: very fast omni light without shadows, which can group by 4 sources and render at once.
 Adjustable diffuse scale for all light sources.
 Independent LOD system for lights, there are three new parameters: light distance (after this distance light starts fading), shadow distance (after this distance shadow starts fading), fade distance.
 The same LOD model for particle systems with visible and fade distances.
 Corrected ambient color calculation for water.
 LightCube R.I.P., LightOmni now can be modulated by a cubemap, if needed.
 ObjectMeshMorph support removed.
 Fixed lack of accuracy in color dialog (HSV colorspace).
 Adjustable background color of the scene (useful for blue/green screen composing systems).
 Bokeh filter, available in DirectX10 and OpenGL with geometry shaders (it can be turned on by "render_dof 2 &amp;&amp; render_restart" console command).



Bokeh filter is disscussed in blogs for a while, for example in Vincent Scheib's one, "Beautiful Pixels".
Here are examples of Bokeh filter usage in Unigine:






Ordinary DoF
Bokeh filter






Ordinary DoF
Bokeh filter




That's how multiple LightSpots can improve a look of the scene, where it's hard to use that many LightOmni:






LightSpot disabled
LightSpot enabled






LightSpot disabled
LightSpot enabled




Resulting image quality of LightSpot + lightmaps mixture is very good for night modes, especially taking into the account nice performance (the screenshot is taken from an unnounced Unigine-based game, developing by our content department):




We're also pleased to note that two more game developers joined our crew, Alexey "FadeToBlack" Egorov (developer) and Stanislav "brrrrr" Zagniy (3D artist), welcome aboard!
They shipped a funny game "Sumotoha" recently and now are working on our internal projects.
</div></summary>
  </entry>

  <entry>
    <title>New sound system is completed</title>
    <link href="http://unigine.com/devlog/53/"/>
    <id>http://yoursite/article/?i=45e5d1235f4624156a5a4829017796f6</id>
    <updated>2008-12-10T07:00:52-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/53/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Programmer news:

 OpenAL-based (with EFX extensions) sound module is done.
 Sound renderer can handle virtually unlimited number of sound sources with occlusion and supports single and multiple reverberation zones.
 More robust loading of WAV files.
 Updated sound samples.
 Shader constants s_ilight_radius and s_ilight_shadow_radius are renamed into s_light_iradius and s_light_shadow_iradius. Render speedup due to more effective shader caching.
 Fixed rare flickering of transparent surfaces.
 Fixed bug with recursive call of script functions through C++ API.
 Added support of operator== and operator!= for user classes in UnigineScript.
 Added data/core/scripts/math.h to simplify 3D math works.
 New character system with adjustable camera presets, see data/core/scripts/character.h and "actor_04" sample.
 Updated reference manual.




Artist news:

 Faster and better Depth of Field implementation, you'll have to re-adjust settings a little.
 Box occluders.
 New random type of particle emitters.
 Visualization of sounds and reverberation zones.
 Independent tuning of specular power and specular scale for light sources.
 Even more settings in scattering, independent adjusting of ray/mie colors.
 Added color scale for reflections.






New version of OpenAL works well in Linux finally, so it's the right time to introduce our new sound system.
There is also a pretty nice software implementation of OpenAL, which supports EFX extensions with a single reverberation zone.


By the way, recently AMD has issued a Unigine-related press-release: "Momentum for Microsoft(R) DirectX(R) 10.1 Grows with Major Game Titles, Next-Generation 3D Game Engines, and Windows(R) 7 API".
There is also an interesting press-release regarding a Unigine-based project: First production stage of "Magus ex Machina" is completed:




PS: We have introduced a more affordable pricing scheme prior to January 1, 2009: indie developers can get a binary license starting with $4990 (or even just $1985 per month during 3 months). Take a look at "Licensing &amp; Prices" page for more info.
Moreover, full licenses are now with lifetime updates access.


PPS: Here is a photo of our new development studio's hall (yesterday TV reporters were here, so now one can see a story about Unigine via local TV network):


</div></summary>
  </entry>

  <entry>
    <title>Optimizations and very verbose scripts</title>
    <link href="http://unigine.com/devlog/52/"/>
    <id>http://yoursite/article/?i=def501d951207ea4d177002f32c7cc91</id>
    <updated>2008-11-27T09:30:45-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/52/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

 Instancing of skinned and dynamic meshes.
 Much faster stereo rendering due to shadows optimization.
 Terrain speedup.
 Alpha-channel of specular textures is no longer responsible for reflections, it modulates specular power (glossiness) now.
 Square brush in TerrainEditor.
 Manager has been renamed to RenderManager.
 Adjustable number of splits for WorldLights.
 Fixed material preview bug.
 Fixed flickering of water reflections.
 Added initial angle and velocity scale for particles.
 Visualization of occulsion query primitives in UnigineEditor.
 Added terrain sample with unique texturing (terrain_01).
 Intersection masks, engine.world.getIntersection() functions get a mask as third parameter.
 New order of arguments for initialization: Engine::init(UNIGINE_VERSION,argc,argv,project,password), where 'password' is a password for encrypted file packs.
 Script and shader preprocessor accepts only angle brackets for #include directive.
 Warnings on unused variables and arrays in scripts.
 More verbose script interpreter output on errors, including file name and line number.



Some notes on instancing follows.
There is a pool for 64 bones drawed in once, so there is a huge speedup on skinned meshes with simple skeletons.
Cloned ObjectMeshDymamic are also instanced, they are drawn by 32 in a batch.
Plus there are some performance improvements in instancing of static meshes.


Here is a pic for today, particle-based fountains from our unannounced game:




</div></summary>
  </entry>

  <entry>
    <title>Tropics 1.1, auxiliary buffer, NULL rend</title>
    <link href="http://unigine.com/devlog/51/"/>
    <id>http://yoursite/article/?i=1736931f53ee73edd8d3935ad7ab5e3c</id>
    <updated>2008-11-05T07:30:41-08:00</updated>
    <author>
      <name>http://unigine.com/devlog/51/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
There is an updated version of Tropics demo 1.1 available now, main changes are performanse boost, added procedural grass and support of DirectX 10.1 multisampling features.
Our web-server is experiencing heavy overload due to the fact, so please be patient while downloading the demo.


Recent changes:

 New Auxiliary buffer (RGBA8) for different effects (e.g. you can store some object's masks there), it can be accessed from a postprocessing shader.
 Fixed HDR bug with some rare configurations.
 Pixel Shader Model 3.0 support is required now, so minimal supported hardware is ATI Radeon X1xxx / NVIDIA GeForce 6xxx from now on.
 No more is*Available() functions in the render.
 New console variable d3d10_render_use_alpha_test_level_1 for DirectX 10.1 AA.
 2D_Array textures are supported by Image class now.
 Fixed terrain tool crashes on heavy meshes.
 Fixed terrain seams.
 Terrain speedup.
 Restored clipmap material with unique material for the terrain (see below).
 A new format of the terrain palette without borders, "palette" tool R.I.P.
 Fixed too dark clouds in DirectX 10.
 Correct detection of NVIDIA GTX 2xx series.
 NULL render, which doesn't render anything (useful for server purposes).
 New Terminal class to work with a text console.
 Removed FMOD and xaudio2 support.
 Translucence flag is splitted into two options for casting and receiving (it allows to avoid biases adjusting).
 Fixed translucency in shadowed regions.
 A function for setting composite material, default one is render_composite.
 Foliage noise is reverted back on low shader profile.
 Fixed enabling of disabled NodeRef's after reloading of a world.
 Access to the list of filesystem's files.



Due to multiple requests we've got back old terrain material (with unique mapping) in addition to a new one, so now one can choose between them.
Thus now there are two different materials available (if there is a mask, so it's a splattering material, if there is a diffuse clipmap, but no mask, so it's a climpaped one).
</div></summary>
  </entry>

  <entry>
    <title>MegaUpdate (c) Frustum</title>
    <link href="http://unigine.com/devlog/41/"/>
    <id>http://yoursite/article/?i=438e31b5ee76e6504fef7f1bcb7d78fe</id>
    <updated>2008-10-21T06:30:13-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/41/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Basing on customers feature requests, there are a lot of hot updates in Unigine!


Recent changes:

 Fonts outlining.
 UnigineScript debugger (GDB style): call stack, stack dump, disassemble, view variable and array info (add breakpoints to your script and look into the system console).
 New NodeRef node type, which refers to nodes from external node files.
 Improved 'forloop' and 'foreach' operators in UnigineScript.
 Added 'switch' operator into UnigineScript for faster branching.
 WidgetEditText allows per-line editing now.
 Holes support for terrain (first LOD only).
 Added more settings for ResourceEditor: camera speed, FOV, wireframe color.
 Inheritance of user-defined classes with virtual functions support in UnigineScript.
 Context menu for nodes in UnigineEditor (Alt + right mouse button to activate).
 Full undo/redo support for nodes and materials in UnigineEditor.
 Updated documentation on Unigine library.
 Heap of minor fixes.



Finally, a new Catalyst 8.6 has solved the problem with soft shadows!
It's highly recommended to upgrade to it for all ATI card owners.


Here is the context menu for nodes in UnigineEditor:




New TerrainEditor can add holes:




Terrain upgrade guide: save height map into DDS format by old TerrainEditor, create a new terrain by new TerrainEditor, import old height map.
</div></summary>
  </entry>

  <entry>
    <title>Bugs hunting</title>
    <link href="http://unigine.com/devlog/42/"/>
    <id>http://yoursite/article/?i=b8ab9975f05fa8f21a750f5ca9acce71</id>
    <updated>2008-10-21T06:30:13-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/42/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Fixed bugs:

 More accurate parallax mapping on 'high' profile.
 Fixed ObjectWater polygons doubling after cloning.
 Fixed match() for patterns with '*'.
 Fixed call of user class methods with arguments in UnigineScript.
 Correct work of garbage collector with inherited classes in UnigineScript.
 Correct work of 'hidden' flag for all types of GUI containers.
 No more artifacts of ObjectWater in underwater mode.
 Fixed handling of '(' ')' '{' '}' symbols in UnigineScript.
 Fixed node cloning dialog in UnigineEditor.

New features:

 Saving debugger's history between sessions.
 Added xml-&gt;isChild() function in UnigineScript.
 ObjectTerrain can be edited and saved by means of scripts.
 Improved brushes window in TerrainEditor.
 Introduced 'Pair' and 'Triple' containers in UnigineScript.
 Clean-up of UnigineEditor.
 Removed alpha channel support from NormalCombiner.
 Cubic filtering for lightmaps on 'high' setting profile.
 New strget() and strset() functions in UnigineScript.
 Updated a lot of articles in reference manual, added UnigineScript debugger documentation (see 'Programming / UnigineScript / Script Debugging').
 Added WorlTrigger support in UnigineEditor.
 Improved editing of vec3/vec4/mask parameters in material editor of UnigineEditor (double-click on them to edit).
 Added 'Place here' (move to the camera) and 'Place manually' (place on a surface, right-click switch normal binding, mouse scroll adjusts height) buttons in Nodes window of UnigineEditor.
 Support of material's parameters copy-paste in UnigineEditor.
 Dynamical node info visualization feature in UnigineEditor (Tools -&gt; Interface -&gt; Dynamic info).



The hunting was fruitful, almost all of the bugs were discovered during work on our internal Unigine-based projects, which are a kind of sandbox for us.
</div></summary>
  </entry>

  <entry>
    <title>Introducing hierarchy of node properties</title>
    <link href="http://unigine.com/devlog/43/"/>
    <id>http://yoursite/article/?i=d7c038262541395f9f4d433cf3947f12</id>
    <updated>2008-10-21T06:30:13-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/43/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

 Hierarchy of node properties (read more below).
 Underlaying material for reflections.
 Console commands now can be created by means of UnigineScript.
 Variables content can be accessed via [] operator, there are new __set__ and __get__ class memebers to be overloaded for [] access.
 Adjustable precision of mesh data for 3dsMax export plugin (snap to grid).
 Friction and restitution parameters are moved into base properties library.
 Filesystem speedup.
 A file inside 'data' directory can be access very fast now, if its name doesn't contain 'data/' prefix.
 Fixed LWO format loader.
 New format of world files: material name should be in 'material' attribute of 'surface' tag (old format will be supported for some time still; re-save world to update its format).
 Removed 'deprecate.mat' material library, there is no more mesh_detail_base (use mesh_base instead of it).
 Great speedup of scripts compling (it is almost 4 times faster now).
 Fixed reflection masks.
 Cube filtering of ambient maps.
 Stereo launchers dynamically load DirectX libraries now.
 Removed FreeBSD building rules due to very low demand on FreeBSD support.
 Automatic generation of focus cycling order for UI.
 reflection_adjust parameter for cube reflection for fine tuning.
 Almost all memory leaks are eliminated, there are only 3 unfreed pointers left.
 Added time.h (for correct sun position according to a given time) to the core scripts set.
 Added sun movement into 'water' demo.
 WorldTrigger can work with predefined set of nodes (if the list is empty, all nodes are taken into account).
 Correct work of tabbing in WidgetEditText.
 Simple syntax highlight in built-in text editor.
 New ALIGN_BACKGROUND flag for separating widgets by rendering order (work only for WidgetVBox).
 WidgetManipulator takes care about step of snap.
 New icons in UnigineEditor.
 Fixed annoying 'invalid operation' error in OpenGL.
 Snap to grid for moving and rotating objects (set grid step in 'Tools' window).



Node properties is a general purpose mechanism for adding some custom properties to objects (like game-specific parameters and so on), they can be set per-surface.
Properties set can be flexibly adjusted for a project, see data/core/properties/unigine.prop as an example, the system is very similar to our visual materials.
Use 'o' hotkey to access properties window in UnigineEditor.


Some notes regarding changes in development environment:

	Unigine_Externs pack is updated, all 3rd-party code is moved there
	All .lib files provided with Unigine_Externs are for Visual Studio 2008, older ones can be found in 'vs2005' subfolders
	Recommended SCons version is 0.97

</div></summary>
  </entry>

  <entry>
    <title>Impostors</title>
    <link href="http://unigine.com/devlog/44/"/>
    <id>http://yoursite/article/?i=ea732594cfa15fd5cfad12bea0696303</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/44/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

 Smart dynamic impostors.
 Capability of rendering of a single object in WidgetSpriteObject.
 Fixed 3dsMax plugins (wrong alignments for skinned mesh).
 setCastShadow/setReceiveShadow methods for surfaces, which allow fine tuning.
 Support of password-protected built-in data packs.
 Fixed selection of NodeRef by double-click.
 New render_show_textures console variable for visualization of dynamical textures.
 *.pak files are treated as *.zip ones by filesystem.
 Increased precision of ObjectWater and ObjectSky on far distances.
 Filesystem loads files in alphabetical order now.
 A file, which is referenced by NodeRef, can be replaced by another one via UnigineEditor now.
 An object is belong to a sector according to its bounding box.
 Materials and properties can be set for all nodes of a multiple selection.
 Updated Unigine_Externs pack.
 Updated docs, added "Content Creation / Materials Overview / Optimization Tips" and "Content Creation / Level Design" articles.
 


Impostor is a fake 2D sprite object, which replaces a real 3D object at far distances.
The engine render impostors automatically, the only thing you should do is to enable 'Impostor' flag in the node properties.
There is also an 'Impostor distance' setting in UnigineEditor (see rendering settings window).
It's recommended to set that parameter equal to shadow off distance or even greater to avoid artifacts.
Approximate estimations of memory consumption by impostors can be found in "Content Creation / Level Design" article.


9 000 000+ polygons, 613 DIPs, 16 FPS (on 8800GT):



2 000 000+ polygons, 235 DIPs, 31 FPS (the same hardware):



FPS is doubled, resulting image is the same - this is a power of impostors!




Dynamic decals are on the way.
</div></summary>
  </entry>

  <entry>
    <title>Decals and isolation mode in editor</title>
    <link href="http://unigine.com/devlog/45/"/>
    <id>http://yoursite/article/?i=1b8e9c4a8ae4dcc5f5756fd1392fbdbc</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/45/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Recent changes:

 Projected, orthographic and omni decals.
 Masks and offsets for decals.
 Added decal samples.
 Isolation mode in UnigineEditor.
 New "back shadow" flag for all light sources.
 New default names for 32/64 bit libraries.
 Spatial settings for sky material.
 Fixed water shaders.
 Impostors speedup.
 MenuBox supports another MenuBoxes as children.
 New WidgetSpinBox.
 Fixed calling of script functions through the C++ API with external classes passed into them.
 SDK launcher for Windows with HTML-based interface.
 


Our art department is reworking an old draft of tropical demo, it should be ready in September:



Ocean waves look completely real in dynamics, unfortunately a static image can't show it:




By the way, recently OpenGL 3.0 specification has been released, and we found that Unigine already supports its features, like geometry shaders, texture arrays and so on.


PS: There are up to 40% discounts in August for licensing Unigine technologies, so use the chance.
</div></summary>
  </entry>

  <entry>
    <title>Tropics demo released!</title>
    <link href="http://unigine.com/devlog/46/"/>
    <id>http://yoursite/article/?i=4f793c27cbb4bcb61b8978e876f5255f</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/46/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
First of all, we have released a new demo, it took a month to create it by our small content department.
"Tropics" demo has funny crabs and gulls inside, check it out!




We have updated "Sanctuary" demo also (improved shadows quality, increased textures resolution, added more stereo 3D modes and "candle weapon" camera mode).
Screenshots gallery is updated as well.


What's new in the engine and tools:

 Password mode for WidgetEditLine.
 Automatic placement of WidgetSpinBox if it's attached to WidgetEditLine.
 Fixed font wrapping on labels and buttons.
 Fixed color codes for WidgetEditText.
 Correct localization for complex widgets.
 Fixed ObjectWaterMesh and volume fog.
 Support of double precision vectors in math library.
 Automatical approximation of meshes by convex hulls for BodyRigid.
 Auto-update of decals on change of their parameters.
 Optional Phong shading for foliage material.
 Added Xml::removeChild() into UnigineScript.
 Fixed spline exporters for 3dsMax.
 Automatical installer of plugins for 3D editors.
 Improved default look of the Sun.
 Correct import of RGB normalmaps in ResourceEditor.
 Template of WiX-based installer for Windows.
 Fixed impostors overlighting.
 More supported video modes.
 Added getFTime() function for detection of precise frame time.
 Support of password-protected zip packs.
 "Soft mouse" mode support.



There are a lot of "automatic" words in here :)


PS: Due to the popularity of indie developers support program it was decided to continue it, so small independent studios have a chance to license Unigine technologies by low prices, starting from $15k. Please see licensing page for more information.
</div></summary>
  </entry>

  <entry>
    <title>Improved terrain, grass and news on mult</title>
    <link href="http://unigine.com/devlog/47/"/>
    <id>http://yoursite/article/?i=3cc23bef2f915e1d531d1175e02dc580</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/47/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
New procedural grass in action (it moves in dynamics):







Recent changes:

 Splatting shaders for terrain with 16 texture slots available.
 Improved terrain editing in ResourceEditor (editing of splatting maps; automatical conversion of textures and clipmaps; 'g' hotkey resets pivot point, like in UnigineEditor).
 Fixed terrain tesselation.
 New "Clipmap" tool for converting textures into clipmaps and vice versa.
 Optimized polygon count in the sky.
 Image class can load multi-channel PSD textures as 3D ones.
 BASE particles renamed to BILLBOARD.
 No more PhongRim shading and color noise on vegetation with low shaders profile.
 Correct detection of AMD videocards in Linux.
 unigine.mat is splitted into several material libraries.
 Updated generator of project files for Visual Studio.
 Handling of NumLock, CapsLock and ScrollLock buttons.
 Support of streams (Stream is a base class for File and Socket now) for save/restore system.
 FileBase class renamed to Stream.
 Access to world nodes via C++ API.
 It's possible to transfer classes with inheritance through the C++ API now.
 Fixed bug with members of inherited classes in UnigineScript.
 More strict accordance to Vista UAC (all user-writable data is stored inside user's home directory, use "project" argument during Engine initialization to override the location).
 More correct FPS calculation.
 Full control of mouse and keyboard events by means of UnigineScript.
 "reference" field in widgets for external references.
 NOW font wrapping is working.
 Smart language switching for GUI L10n, one only needs to call ui.update() after changing locale.
 Hotkey bindings for UnigineEditor can be altered from the editor itself.
 New procedural ObjectGrass: 2 LODs, fast geometry generation by CPU, support of density masks and a lot of other adjustable parameters.
 Added ObjectGrass sample.



It was decided to revert back to terrain splatting instead of huge clipmaps, which are too unconvenient for editing by artists.


There are also important news regarding network support.
Right now we have syncronization of world nodes over the network almost ready, it will be available as a sample in Unigine SDK soon.
We use a 3rd-party software for transport layer now, later it will be replaced by our in-house module.
At the moment a dedicated developer (Anna "ANet" Ishina) is working on our networking issues, a lot of research work has already done, so we plan to complete our multiplayer solution in 5-6 months.
</div></summary>
  </entry>

  <entry>
    <title>More render optimizations and 1% per day</title>
    <link href="http://unigine.com/devlog/48/"/>
    <id>http://yoursite/article/?i=b0ed3eb381b70e5ba861837025c2b142</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/48/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
First of all, here is an another screenshot from our unannounced Unigine-based project, which is the main concern of our art department these days (by the way, it contains 64 square kilometers of terrain):




What's new:

 Terrain optimizations.
 No performance drop if there is an invisible water in the scene.
 Occlusion queries for smart culling.
 Fixed overlighting of impostors and reflections.
 Alpha-testing + anti-aliasing now works correctly on DirectX 10.1 capable hardware.
 Added anti-aliasing support for scattering pass for DirectX 10 hardware.
 Removed Oren-Nayar shaders due to increased compexity of material system.
 Support of mouse scroll in EditLine and SpinBox widgets.
 LODs for particles (particle count reduces with the distance).
 Optimized light scattering.
 A special "destroy" method of containers in UnigineScript for memory cleanup without direct call of a destructor.
 Fixed Image crashes on float and half images in rare cases.
 Grass performance optimizations.
 Fixed crash of ResourceEditor if config file missing.
 UnigineEditor now works more intelligent with textures, there is no need in ImageDDS tool for ordinary cases.
 Scene validator in UnigineEditor.
 Added "How to..." section in the manual, which will be useful for artists.



You can see antialiasing improvement by yourself: No AA, 4xAA on DX 10.0, and 4xAA on DX 10.1.



We have launched a "1% per day" discount campaign: every single day before November, 30 gives you 1% discount on licensing Unigine (or you lose 1%, if you are waiting), so you can get a fully-capable license with 60% discount, if you are on time!
</div></summary>
  </entry>

  <entry>
    <title>Hotfixes</title>
    <link href="http://unigine.com/devlog/49/"/>
    <id>http://yoursite/article/?i=159a23bde44f56d83808d1ffd234cefe</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/49/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
Game Connection Europe (Lyon, France) is coming, so we decided to take a week for additional stabilization of Unigine in order to help our licensees to prepare builds for the exhibition.


News of this week:

 Unloading of corresponding libraries (material and property ones) on the world unloading.
 Fixed triangle visualizer.
 Access to Body, Shape, and internal Dummy object of a PlayerActor.
 Correct linear interpolation for float point images.
 Fixed D3D9 crash if a mesh is missing.
 "float" validator supports inf/-inf now.
 No anisotropy for point-filtered textures in D3D9.
 Clamp sampling of grass textures.
 Fixed 3dsMax export script, now it works with filenames containing spaces.
 Hidden objects are skipped now during export from 3dsMax.
 New "palette" tool for terrain palette conversion.
 Minor fix of normals treating in ResourceEditor.
 Fixed terrain_base_texture_scale in UnigineEditor.
 All selected objects show their wireframe in multiple selection mode, if "mesh wireframe" option is on.
 Input filters for numeric fields in UnigineEditor.
 Two more articles in "How to..." section of the manual: "Create a Blank Terrain Based on a Mesh or a Height Map" and "Use Terrain Palettes".

</div></summary>
  </entry>

  <entry>
    <title>Multithreading changes and more bugfixes</title>
    <link href="http://unigine.com/devlog/50/"/>
    <id>http://yoursite/article/?i=9c42906183f0b3d48312458c070a13dd</id>
    <updated>2008-10-21T06:30:12-07:00</updated>
    <author>
      <name>http://unigine.com/devlog/50/</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
What's new:

 Faster sorting of render surfaces.
 New console functions: isVariable() and isCommand().
 No more HDR artifacts caused by the vignette.
 HDR calculation now performs with 4 frames delay.
 "physics_multithreaded" renamed to "physics_num_threads".
 All thread controls moved to EngineThreads, node update can work in multithreading mode, this can get a performance boost for particle systems.
 Number of supported callback arguments was increased to 8.
 Log file name can be specified by new "-engine_log" CLI option.
 Preview works only for images smaller than 4 Mb.
 Shaders has unique id's for easy sorting.
 Fixed selection of objects under terrain holes.
 Terrain holes disappear starting only from 4th LOD.
 Shadows from grass bushes.
 Support of GL_ARB_draw_instanced extension for better ATI compatibility in addition to existing GL_EXT_draw_instanced.
 No more stack errors while calling UnigineScript functions from the C++ API.
 Fixed major stack bug in UnigineScript.
 Update of benchmarking scripts.
 More tutorials on terrain creation.



We have also successfully integrated a third-party networking solution with Unigine, now we are performing different performance tests to ensure that it was a right choice of the technology.
If the testing will be successfull, our customers have a chance to get networking ready out-of-the box even sooner than it was expected.
</div></summary>
  </entry>

  <entry>
    <title>Amoebaxs first final version released!</title>
    <link href="http://www.emma-soft.com/eblog/2007/08/09/amoebaxs-first-final-version-released/"/>
    <id>http://yoursite/article/?i=4aa4d70191162ac7fadc5d148f0b4b02</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally!! After almost eleven months of developing, testing, cursing, drawing, and making musics we arrived at our first stable version of Amoebax: version 0.2.0!
This version has a lot of improvements from the previous version, but that is because during this version we focused in polishing the whole game, and this is an almost never ending process.
Since this is a final / stable version, we thought that is time for the game to have a proper web page so our non-programmers users can get the game easily.  So besides our trac page (which sometimes is confusing) we created a new page for Amoebax at http://www.emma-soft.com/games/amoebax/.
I hope everyone enjoys playing Amoebax as much or even more than we did while making it </div></summary>
  </entry>

  <entry>
    <title>AdSense for Games</title>
    <link href="http://www.emma-soft.com/eblog/2007/07/19/adsense-for-games/"/>
    <id>http://yoursite/article/?i=45db863276bf843108a9cd11db79526d</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apparently Google is going go launch a new ad system for games that will help smaller developers in putting ads in their games.  Google didn&#8217;t give an estimate of when the system will be available, but ?is ready to start talking with game publishers and developers about using the system?.
Now, that is interesting </div></summary>
  </entry>

  <entry>
    <title>Indie Games for Wii</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/29/indie-games-for-wii/"/>
    <id>http://yoursite/article/?i=973ecd93dc985a9c343e6ccdff603b9e</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apparently Nintendo, in early 2008, will open a new service called WiiWare.  From what I understood this new service will give a way for independent game developers to develop and distribute games for the Wii like the Xbox-360&#8217;s Live Arcade does.
According to the announcement this service ?[...]provides game creators a simple method by which they can get their games to the public. This approach, combined with the remarkable motion controls of the Wii Remote? and Nunchuk?, will give birth to fresh takes on established genres, as well as original ideas that currently exist only in developers&#8217; minds.?  So I guess the reverse engineered drivers will not be the only way to play with the WiiMote </div></summary>
  </entry>

  <entry>
    <title>Operating Systems Logo Guidelines</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/19/operating-systems-logo-guidelines/"/>
    <id>http://yoursite/article/?i=84e9c2317a0d6886856b42ea9979326d</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Recently I have seen some indie and free (as in free-speech) games&#8217; pages that uses the Windows, Mac OS X, and Linux logos to represent the platform the game can run on. Since I&#8217;m in the process of making the new web site for Amoebax I though I could use those logos to represent which platforms it can run on, but first I looked up the logos&#8217; usage guidelines.
As I expected, I have no problem in using the Linux logo in my web page provided I credit the author.  But in the case of Windows&#8217; logo and Mac OS X Universal&#8217;s logo the situation is different, which is not a surprise.
If I understood correctly those guidelines, in the Mac OS X Universal logo program I need to send them a written and signed license agreement to Apple in order for them to approve or not the use of their universal logo in my ?product&#8217;s?.  This is not really a problem, but I would like to avoid it  
Even worse is the Windows logo guidelines.  All I could find is that if I want to use a Windows logo to identify this platform as a supported platform I need to enroll to a Microsoft Logo Program and then I could only use one of these logos (the ?Works for Windows? logo in my case.) Worse still, to be able to apply for a ?Works for Windows? logo I need a VeriSign Organizational Certificate which costs US$99 ?thanks? to a partnership of Microsoft and VeriSign.
After seeing this I decided to scratch the idea of using operating systems logos in my web page and do like the Mozilla Foundation do on their home page: just put the name of the operating system.</div></summary>
  </entry>

  <entry>
    <title>Flash Game Design Competition</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/15/flash-game-design-competition/"/>
    <id>http://yoursite/article/?i=e0e1cb240ce6e73b3d8b363187088b1f</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The guys at Casual Gameplay are holding its 3rd flash game design competition.  The rules are easy: write a flash game in flash which incorporates the ?replay? theme by July 15th.
The prizes are worth the effort:

1st place: $1,000 and 1 Flash CS3 Professional license.
2ns place: $500 and 1 Flash CS2 Professional license.
audience award: at least $200.

In addition, there is the possibility to receive a bid from ArcadeTown for publishing your game.
For more information see the contest&#8217;s information page at Casual Gameplay.</div></summary>
  </entry>

  <entry>
    <title>Bryce 5.5: Free</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/15/bryce-55-free/"/>
    <id>http://yoursite/article/?i=72b18b45530610c2be9bb6840a3f5477</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">lionheart_LH told us at indiegamer&#8217;s forum that Bryce 5.5 is now available for free.  Bryce is a very good 3D rendering software and is also available for Mac OS X users, although Intel-based Mac users need to upgrade to 6.1 (which is not free, but pretty cheap: $19.98) to get an universal binary.
You can get the free Bryce 5.5 at download.com.</div></summary>
  </entry>

  <entry>
    <title>Why Do You Make Games?</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/12/why-do-you-make-games/"/>
    <id>http://yoursite/article/?i=1ec8173a223ee597845c5d4d780a91da</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you read any game development forums you will see that there are countless people wanting to get into the development of computer games.  Have you ever wandered why there is so many people wanting to start writing games?
I&#8217;ve met people in the past that thought that making games is ?cool? because, hey, games are cool!! They quickly believed that they could do the next Quake and get rich and famous (at that time MMORPGs were not so widely known, but I guess if I met them today they would believe that they could make the new WoW). They learned a cruel truth: developing a game is very hard work.
Still there are a lot of people that resists the temptation of giving up, put a lot of effort and makes beautiful games.  Why is this?  What do these people have that makes them spend a lot of time in front of a computer in order to have little creatures move around the screen? Surely there are a lot of reasons, but my guess is that the top reasons is a passionate love for games.
Now, there is a little dirty secret of mine: although I do love making games, I do not like to play them that much.  All games, not only my games ;-).  Then why I love making games?  Because I like a lot watching others playing games! Yes, it is weird, but I like it.
Here is a little story: At early stages of Amoebax&#8217;s development (we didn&#8217;t released any version yet) I used to met a person on the train to home.  Not a friend, but someone that was very pleasant to talk about almost everything.   One day she discovered that we were doing a game, because I bought my GP2X to show how well the game were running on it to Ferran, one of the project&#8217;s contributors.   From that day on almost every day she spent the whole trip playing the game, sometimes giving some funny comments about the amoebas&#8217; faces, others moving the console when the falling amoebas were going to step on a bad place (a curious instinct, as if moving the console would affect the amoeba&#8217;s position&#8230;).
While she was playing at it I just felt an extreme happiness because she was playing my game, and better yet she was having fun with it.  I think the most accurate way to put it in words is by using the japanese sentence: ?shiawase ga afuredasu? (roughtly ?the happiness overflew? if my japanese is not so bad). I remember thinking: &#8220;Now, I understand why I spent all this time making it&#8230;?.
So, it seems that my motivation in making games is just to see my users playing it and most of all having fun with them. And I feel good because I know that the effort I put in making it was worth, even if it was only for another person to have fun for thirty minutes.
If you make games, what is your motivation in doing so?</div></summary>
  </entry>

  <entry>
    <title>Why Not Making Multiplatform Games?</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/11/why-not-making-multiplatform-games/"/>
    <id>http://yoursite/article/?i=ca5e78cf32d9c43637dcd28f5cf8f0f7</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Last Friday I bought Bullet Candy through Gibbage.co.uk. Why? Because it was one of the few Mac games available there (and because it was cheap enough for me&#8230;) While browsing the good games available at Gibbage.co.uk I though to myself: ?Why there&#8217;s so little indie games available for other platforms than Windows??
The first cause that came to my mind was that since Windows is the most used desktop operating system most developers don&#8217;t want to ?waste? time with less crowded systems. Although I can see some truth behind this statement, why do not use a cross-platform library like SDL, ClanLib, Allegro, etc. which abstracts the developer from the actual platform and lets concentrate with the actual gameplay. Heck, you can even use Java like developers of Tribal Trouble did with an impressive result!
I think most developers did spend a lot of effort into learning Windows-only API/libraries like DirectX and now they do not want to ?waste? time into learning yet another API/library. Frankly, I could never understand the COM architecture used in DirectX so I found a lot easier to learn SDL, which is my favorite library when dealing with multimedia and graphics applications.  Of course not everyone is so limited as I am, fortunately.
I also though about the possibility that some developers perhaps don&#8217;t want to lose some features of the platform specific library by using ?general? libraries. Perhaps this is true in some big companies doing AAA titles, but most indies won&#8217;t use that much of the library not because they are not technically able, but because most games done by indie developers do not need these features.
So what remains as a roadblock to build multiplatform games? The only think left I can think of is that most developers do not have access to any platform but Windows. Why? Well, as I said before Windows is the most common so it is easier to get the hands on it.  Also, if the other platforms are less known there must be some reason, isn&#8217;t it?  Even if it is a social instead of a technical reason.  And I think this is a shame, because as I see it the indie game industry could shine in an environment where the big ones do not want to enter, for now.
What is true is that the developers behind Democracy, Determinance, Gibbage, Jets&#8217;n'Guns, Kudos, Naked War, New Star Soccer 3, Steam Brigade, and War On Folvos did not get my money even though all of them are listed at Gibbage.co.uk just for a single reason: they did not make a Mac version of their games and I do not have a Windows machine at home!
A truly shame for they and also for me, since I can not enjoy any these fantastic games.
Edit 2007-06-16: Jets&#8217;n'Guns actually ships a Mac OS X version, so I also bought it.</div></summary>
  </entry>

  <entry>
    <title>Are Indie Developers Doomed to Clones On</title>
    <link href="http://www.emma-soft.com/eblog/2007/06/07/are-indie-developers-doomed-to-clones-only/"/>
    <id>http://yoursite/article/?i=be9762730b4a7a54aa7c803a27c7d78b</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Last Friday&#8217;s night I was at an Irish-style bar and having a fun time with a couple of friends of mine who also like the place.  From time to time there are some local bands that play their repertoire there, but I noticed that most of the time the songs they play are just a version of a well known song or even the original song unchanged.  That fact, and perhaps too much beer, made me think if all indie groups, whatever their domain, are doomed to ?copy? well known creations.
This also can be applied to indie game developpers.  If you take a look at major games portal&#8217;s lists of ?top 10? games, you&#8217;ll see that most of them are are clone of well known games, and most of these clones are match-3 games.
Don&#8217;t get me wrong now, all these games are really professional and well made, and I do not have any doubt that all these developers have put a lot of effort making them. I just feel that is a shame that so many great developers spend time to develop yet another match-3 game when they could be creating a new creative gameplay. Some of them do it, others do not.
Perhaps the problem is not that these developers do not want to make creative games but people don&#8217;t want to play games that have a very different structure of what they are used to. After all, all these games are the Top 10 for some reason&#8230;
Of couse, I&#8217;m do not have the right to point others and say ?you all have no creativity&#8230;? since I don&#8217;t even follow my own advice with my games :-P.  But I think this is something we should take into account when planning a new game.</div></summary>
  </entry>

  <entry>
    <title>VMware Fusion shows how the big boys do </title>
    <link href="http://www.emma-soft.com/eblog/2007/06/07/vmware-fusion-shows-how-the-big-boys-do-it/"/>
    <id>http://yoursite/article/?i=0b0902564d76cf8b5c9cea54caccbc17</id>
    <updated>2008-09-23T06:20:38-07:00</updated>
    <author>
      <name>7b9326ae08d39de038c5af731d1a6fe0</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">VMware may have taken its time doing it but a sneak preview of Fusion oozes good design sensibility, with Windows integration that blows the pants off anything you&#8217;ve seen before. Move, resize and stack your Windows apps as if they were running directly on your Mac; it feels like you&#8217;ve liberated them from their ugly prison  
read more | digg story</div></summary>
  </entry>

  <entry>
    <title>Applied design patterns: Database abstra</title>
    <link href="http://greatjustice.info/?p=20"/>
    <id>http://yoursite/article/?i=739fa6f4c0babee58682df40bc6746d3</id>
    <updated>2009-09-04T20:00:51-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=20</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In some of my previous posts, I&#8217;ve pretty much ranted about the poor design qualities of some people that enjoy calling themselves PHP programmers. In these two posts however, I&#8217;d like to show you what good and proper design is. The topic is the same as that in my previous posts: databases. Or, to be more precise, database abstraction.
In the first part, transformed a concrete set of database interaction classes into an abstract set, to improve flexibility and extensibility. In the second part (i.e. this one), we&#8217;ll introduce a design pattern which will help us to manage and maintain the new abstract database classes and their concrete implementations. In this post, we&#8217;ll create and implement the design pattern we&#8217;ll use to determine which concrete database connection should be used, using an implementation of the Factory Method.

In the first part, we encountered the following line in the example code:
$databaseConnection = new MySQLDatabaseConnection($server, $username, $password);
This, in itself, will work, but it&#8217;s not what we want. If we used this line in every bit of code where we require a database connection, our application would become dependent on the MySQLDatabaseConnection class. Not only that, but it&#8217;ll become rigid, inflexible, and a general pain in the arse to maintain. You might consider that in most cases your application will stick to a single database, but what if  you&#8217;re writing an application for clients that may want to use a different database? Do you just lock them out saying &#8216;No we don&#8217;t support &#8216;? Not only that, but learning this method now (and not even particularly for this situation) will give you a benefit in the future, when you encounter similar problems. Anyways, back to the tutorial.
In order to solve the above case of inflexibility, we&#8217;ll want to move the concrete object instantiation (= object creation) to a single location. We&#8217;ll want to be able to create an object that can produce new instances of the objects required to work with a database of a specific type, and pass that object around to the bits of code that need it. The $databaseConnection in the above example will, as such, be instantiated not by calling the new operator on a specific database connection type, but by calling a method on an object that&#8217;s assigned to the part of the program using databases which will return an instance of the database connection type currently in use. The former sentence is complex, but I hope it&#8217;ll make sense in a short while. Read on.
To do the above, we have to create ourselves a Factory Method. The name &#8220;Factory Method&#8221; refers to a Design Pattern, an element of reusable object-oriented software as described in The book on Design Patterns, and probably in a load of other books as well. This method (or function, whatever floats your boat) will return an instance of the DatabaseConnection currently used in your application.
Next to a method that creates / returns a DatabaseConnection, we&#8217;ll also want to support connection re-use: in most applications, people only want a single database connection at a time for the duration of a request, so we&#8217;ll want to make the behavior of the factory as such that it&#8217;ll only create a new instance of a Connection if it isn&#8217;t already there. This only-one-object-of-a-certain-type-at-a-time business can be achieved by using the Singleton pattern (albeit slightly different from the one described in The Book, but that difference isn&#8217;t important).
In our Factory, we&#8217;ll also want to keep track of all existing connections, so we&#8217;ll have to maintain a list of active database connections and the means to manage them.
We&#8217;ll create a new interface for this, the ConnectionManager. The ConnectionManager is in essence a pretty basic class, in that it contains only one field (an array that contains the currently active connections) and a handful of connection management methods - one for establishing a connection, one for closing a connection, one for getting a connection from the list of connections, and one for creating a new connection. We&#8217;ll want the ConnectionManager to create new Connections based on whichever type of database is currently selected. To do this, we&#8217;ll create one ConnectionManager for each type of database, so that a MySQLConnectionManager returns MySQLConnections, and a PostgreSQLConnectionManager returns PostgreSQLConnections.
There is one thing that&#8217;s shared in all ConnectionManagers by the way, and that&#8217;s that they all contain a list of database connections. We&#8217;ll take advantage of PHP&#8217;s typelessness by defining the location of those connections in the abstract ConnectionManager. We&#8217;ll add actual functionality to the otherwise abstract ConnectionManager, which means it&#8217;s not an official Interface anymore - it&#8217;s become an Abstract Class, which means that it implements some methods, while leaving the implementation of other methods to subclasses. Here&#8217;s our ConnectionManager:
abstract class ConnectionManager
{
	private $connections = array();

	const DEFAULT_NAME = 'Default';

	// retrieves a Connection from the local connection storage.
	public function GetConnection($name = ConnectionManager::DEFAULT_NAME)
	{
		return $this-&gt;connections[$name];
	}

	// Adds a new connection under the given $name into the connection storage.
	// We don't want external parties (outside of subclasses) to add connections
	// to the storage, so we declare it as protected.
	protected function AddConnection($connection, $name)
	{
		$this-&gt;connections[$name] = $connection;
	}

	// Close the connection specified by the name (if it exists).
	public function CloseConnection($name = ConnectionManager::DEFAULT_NAME)
	{
		if ($this-&gt;connections[$name] != null)
		{
			$this-&gt;connections[$name]-&gt;Close();
			$this-&gt;connections[$name] = null;
		}
	}

	// This method has to be implemented by our subclasses.
	public abstract function CreateConnection($host, $username, $password, $name = ConnectionManager::DEFAULT_NAME);
}
It defines logic for adding and getting Connections, which is independent of actual database implementations, and leaves the logic for creating and closing Connections open for subclasses to implement. We&#8217;ve used a class constant to define the default name for connections, which looks pretty ew in code, but provides a centralized location to store the default name, so you&#8217;ll only have to change it once. Not that it matters in terms of functionality, but eh.
We&#8217;ll define a MySQLConnectionManager as follows:
class MySQLConnectionManager extends ConnectionManager
{
	// Creates a new MySQLDatabaseConnection and inserts it into the ConnectionList.
	// This method has to be called first before the GetConnection method can be called.
	public function CreateConnection($host, $username, $password, $name = ConnectionManager::DEFAULT_NAME)
	{
		$connection = new MySQLDatabaseConnection($host, $username, $password);
		$this-&gt;AddConnection($connection, $name);
	}
}
When a user calls CreateConnection() on an instance of ConnectionManager (or, to be more precisely, on an object reference (variable) that references an object that extends ConnectionManager), the CreateConnection method will return a DatabaseConnection of the type matching the currently active ConnectionManager. To clarify, here&#8217;s a usage example:
$manager = new MySQLConnectionManager();
$manager-&gt;CreateConnection('localhost', 'root', '');
$connection = $manager-&gt;GetConnection();

$manager = new PostgreSQLConnectionManager();
$manager-&gt;CreateConnection('localhost', 'root', '');
$connection = $manager-&gt;GetConnection();
Looks easy enough. Also looks like we&#8217;ve simply moved the same problem we&#8217;ve had before instead of actually solving it. But no, we&#8217;ll assign the $manager somewhere in the initializing stage of the program, and pass it around to anything that needs a connection. The piece of code that requires a connection then simply calls $manager-&gt;GetConnection() and gets a connection to a database. Notice how I&#8217;ve used the word &#8216;a&#8217;? The code that requires no longer requires a connection to a MySQL database, but just &#8216;a&#8217; reference to &#8216;a&#8217; database connection, to which it can pass &#8217;some&#8217; kind of query. Consider the following example as well:
$random = rand(0, 2);
$manager;
switch($random)
{
	case 0: $manager = new MySQLConnectionManager(); break;
	case 1: $manager = new PostgreSQLConnectionManager(); break;
	case 2: $manager = new SQLiteConnectionManager(); break;
}

$manager-&gt;CreateConnection('localhost', 'root', '');
$connection = $manager-&gt;GetConnection();
What this does is create a random connection manager (and, as a result, a random connection). Yet the access methods remain the same, no matter which ConnectionManager is eventually used. Of course, whether the above will work or not is still the question (it won&#8217;t work over here, since I don&#8217;t have Postgres or SQLite installed, let alone wrote an actual PostgreSQLConnectionManager etc), but that&#8217;s not really the point. The point is that, with this construction, you can program your application to a single type - the DatabaseConnection type - without having to worry about the eventual implementation of that one. All you care about is that you get a connection when calling GetConnection(), and that your query gets executed when you call Execute on the resulting connection. And that is abstraction. Less headache, more flexibility, and great justice.
For your entertainment, here&#8217;s a UML diagram (or well, it&#8217;ll look like that) that depicts the Factory Method as used in this example (made non-specific to this application btw). In it, you see the abstract factory (ConnectionManager) (defined as an interface in this case, since we&#8217;ve added the member access functions as an application-specific extra in the example - you probably won&#8217;t need it or have different requirements in other applications of this design pattern), the concrete factory (MySQLConnectionManager) that returns a concrete Product object (MySQLDatabaseConnection), which in turn inherits from a Product interface. The image uses the Factory Method in a slightly different manner from how we&#8217;ve used it here. In the image, the abstract Factory (our ConnectionManager) has a method that calls the FactoryMethod (CreateConnection / GetConnection) for use of its own. The implementation of FactoryMethod goes to a subclass. So in the image, the Factory gets a Product that gets produced by an implementing class. In fact, now that I see that image, we could&#8217;ve used the same method in our own ConnectionManager. We could&#8217;ve implemented the ConnectionManager&#8217;s CreateConnection method so it would call a differently named method that gets implemented by a subclass, which would return an instance-specific Connection.

In the basics though, the two methods are interchangeable and, functionally seeing, do the exact same. But hey, it&#8217;s good to see there&#8217;s still some flexibility in design patterns.
In these two posts, you&#8217;ve learned at least one important rule: Program to interfaces, not to concrete implementations. This might be difficult and probably obsolete and unnecessary in a lot of cases (i.e. don&#8217;t do it unless you want some flexibility), but it&#8217;ll pay off in terms of flexibility, extensibility and maintainability.</div></summary>
  </entry>

  <entry>
    <title>Over-engineering a permissions system</title>
    <link href="http://greatjustice.info/?p=46"/>
    <id>http://yoursite/article/?i=0a0047cfbd734bf625e9c4a765955c0d</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=46</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As before, I&#8217;m still working on a WebManager library / framework / toolbox, and a next step in that is to improve the system&#8217;s authorization system. From my understanding, this works roughly as follows:
In WebManager, as described in my previous post, a WCB is made out of several Components, such as a form, an element, etcetera. Each component (although &#8216;each&#8217; isn&#8217;t a fact, fyi) has, next to a basic set of settings, also an optional setting for permissions. With permissions, I refer to access control lists (of sorts) for the five (or so) basic usergroups that exist in WebManager, usergroups such as authors, users, developers, etcetera. Each usergroup can have a set of permssions assigned to them, which indicate what that user can do. These permissions can then, in the controller or in a .JSP file, be checked again using WebManager&#8217;s AuthorizationService, a service object with some permission checking methods.
A permission is defined as follows. First, you create a Category, basically a parent for each permission. The Category is defined as a Category instance, which gets passed a &#8216;category&#8217; string, an unique identifier for that category. Usually, at least in the default archetypes, this identifier is equal to the component&#8217;s bundle ID, which in turn is a combination of the WCB&#8217;s ID and an appendage (such as &#8216;element&#8217; or whatnot). This results in a category string similar to, for example, &#8220;info.greatjustice.wcb.somewcb.element&#8221;.
Next, one creates a set of Permission objects, which are objects created according to a permission string (a should-be unique string) and the category defined before. The permission string is usually the category string, with the permission itself appended to it (such as &#8216;.update&#8217;, &#8216;.delete&#8217;, etc). This leads to a permission string of &#8216;info.greatjustice.wcb.somewcb.element.update&#8217;, for example.
Now that there&#8217;s a set of permissions (we&#8217;ll use the base set of CRUD permissions as an example here - create, read, update, delete), we can assign them to the usergroups that have these permissions. When no permissions are defined, all users have full access to the WCB component. When just one permission is set in one usergroup, that usergroup can only perform that action, nothing else. Anyways, to assign a permission to a permission group, the ComponentDefinition object, which is used to configure and (by WebManager itself) initialize a WCB&#8217;s component, has a method, setPermissionsForPermissionGroup(), that allows the setting of a permission. The method takes two arguments, the usergroup (which is a constant string defined in WebManager&#8217;s WCBConstants class) and an array of Permission objects to assign to that usergroup.
Next to that, the Element component type has a few extra methods (setCreatePermission and setDeletePermission) that, I assume, sets a global permission that indicates that component can be created and deleted, or in this case, can be inserted or removed from a page - regardless of user rank, i.e. &#8216;global&#8217;.
Now, back to the topic at hand and my own work on this, I figured that this system wasn&#8217;t ideal, for a number of reasons.
First, there&#8217;s an enormous amount of freedom associated with setting a permission. Because you can pass strings, there&#8217;s no way of knowing whether it&#8217;ll &#8216;work&#8217; until you try it out. There&#8217;s no set specification about what input is allowed, and nor is there any checking for proper values. This leads me to believe that the whole permission system in WebManager is little more than a string comparison system (as in, if the usergroup identified by this string has the permission defined by that string, return true, else return false), which is fine in itself, but then, why&#8217;s there the complexity in the assigning of the permissions? Why bother creating a long permission string when you could just fill in &#8220;Slartibartfast&#8221; as a permission, and check if a user has the &#8220;Slartibartfast&#8221; permission all the time?
I can understand that, of course, since I&#8217;m sure the system would allow checking for a permission set in component A in component B, with this relatively low-level approach. Still though, I believed that this system could be improved. The lowest step, the assigning of the permission category is pretty much the starting point. I don&#8217;t believe that that could be abstracted any more, at least not without completely automating the system of assigning permissions, so that&#8217;ll largely stay the same.
The permissions themselves though could be largely automated. There&#8217;s a few facts we know about the permissions:

The permission string is always (or, 99.9% of the time) based on the category&#8217;s string.
The permission is in most cases one of Create, Read, Update, or Delete, and in exceptional cases it&#8217;s a similar system with other permissions such as &#8216;UpdateSomePart&#8217;.
The permission is never used in a dynamic sense - once a permission has been created, it doesn&#8217;t turn into something else.
The usergroups are a pre-defined set of 5 groups, currently defined as plain strings.

Now, with these above facts in mind, there&#8217;s a number of things we could do to improve on the permission system.

Add typesafe constraints to the permissions and usergroups
Auto-generate permissions based on sensible defaults
Auto-generate permissions based on what a user wants

Note that there&#8217;s one or two additional points to the above list, but they apply to the entire library in a wider sense of the word - i.e. an alternative / easier method of creating ComponentPermissions. I&#8217;ll do a full article on that once it&#8217;s finished.
We&#8217;ll want to improve on the permission system for a number of reasons. First, we&#8217;ll want to make it more typesafe - if you know there&#8217;s a limited set of usergroups (5, in this case), why would you want to have the users set it as a string? If you know a permission is always a fixed value, why set it as a string value that allows everyone to freely fill things in?
Second, we&#8217;ll want to automate - in several layers of meaning - the process of creating and assigning permissions. If you know the category and know the set of permission types, it&#8217;s easy to auto-generate the Permission objects and assign them to the ComponentDefinition automatically. Automating in &#8217;several layers&#8217; mean, in this case, that there&#8217;s the possiblity to have all permissions auto-generate (the base CRUD permissions, for example), but at the same time not restrict the users in defining their permissions.
After a few days of development (or something, I don&#8217;t really keep track of time - I don&#8217;t seem to have any deadline or other important tasks where I work), The end-product consisted of a set of components that allow for easy and typesafe definition of permissions, with several layers of automation and customization.
One of the first things I did was to put the permission groups into an enum, a language feature I&#8217;ve never used until about 9 months ago, but which I already love. Using an enum instead of the constant string values defined in WebManager&#8217;s WCBConsts has the main advantage of being typesafe - when you have a method that expects a usergroup, you can only accept usergroups, instead of having to do a manual check to examine the string value passed to it. The setPermissionsForPermissionGroup could, if WebManager used the enum approach, accept a permission group and an array of Permission objects instead of &#8217;some&#8217; string and an array. This guarantees that there is no way that a user could ever enter the wrong value, simply because the software wouldn&#8217;t compile if there&#8217;s an incorrect value set there.
The second thing I did was to make my own subclass of the PermissionCategory object, which, at first, just defined a constructor that forced each mandatory value to be set at object create-time - a PermissionCategory requires two or three values in order to function properly, but those values could only be set using setter methods. The custom permsision category defined a single constructor that forces the user to define all two or three values in one go, so it becomes impossible to &#8216;forget&#8217; a value. This approach is also used in the ComponentDefinition replacement code in the same library, but as said, more on that in a later article.
Later, the custom PermissionCategory got a few additional methods that created Permission objects. A Permission always has a Category as its parent, so why not invert it and have a Category spawn its Permissions?
As said earlier, a Permission&#8217;s permission string is usually the same as the Category&#8217;s permission string, so why not base a Permission&#8217;s string on the Category&#8217;s string with just a small appendage (&#8217;.create&#8217;, for example)?
In this approach, I once again returned to the enum. Defined a Permissions enum that defined four permissions: Create, Update, Read, and Delete. Each had a string representation as well defined inside the enum, string representations in the form of &#160;&#8217;.create&#8217;, &#8216;.update&#8217;, &#8216;.read&#8217;, etcetera.
The permissions enum, in combination with the custom PermissionCategory, resulted in a &#8216;createPermission&#8217; method in the PermissionCategory that took just one parameter, an entry from the Permission enum. The result was a concatenation of the category&#8217;s string and the Permission&#8217;s toString() method result, which was then inserted into a new Permission object, along with the category assigned to it that created it.
Next to a Permission enum, I also created a PermissionGroup enum, which acted a simple wrapper around the string values from WebManager itself - only then typesafe. With it came some extra methods that allow a developer to get the groups &#8216;above&#8217; a current group, so they could, for example, allow everything for the Editor usergroup and all those above it.
So, with an abstraction of the Permissions, the PermissionGroup, and the PermissionCategory in place, we&#8217;ve already come a long way. We can now create a set of permissions for a permission group and, using another abstraction for the creation of ComponentDefinitions, assign them all in one go. However, we can go one step further, by auto-generating the permissions.
In most cases, there&#8217;s just a single set of permissions that you&#8217;d always apply - CRUD. Create, Read, Update, and Delete, and this often in relation to an object of sorts - in this case, an Element component, or the object that you can insert into a page, can only be created (for example) by an Editor, but can only be deleted again by the Main Editor usergroup, which is one level up in the hierarchy.
WebManager&#8217;s permission system allows for more fine-grained permissions, but in most cases, this default set of permissions would work good enough. So, I also added an abstraction for storing and auto-generating CRUD permissions. This was done in two stages, actually. First up was a &#8216;generic&#8217; CRUDPermissionsContainer, an interface that defines four methods for getting the four permissions. I wanted to allow people to define their &#8216;own&#8217; CRUD permissions quartet instead of forcing them to either use the auto-generated ones or have to manually define all permissions, hence the abstraction. Underneath that are two default implementations: A CRUDPermissionsContainer implementation that works only with the earlier defined CRUDPermissions enum, which took just a PermissionCategory as constructor argument and created the permissions from there automatically, and a more generic container with a constructor with five arguments, the PermissionCategory object itself, and four Permission objects - one for each of the four CRUD permissions.
As the title suggests, this is a bit over-engineered, but it&#8217;s good practice material - I&#8217;m still cheap for my employer, so I can spend some more time on over-engineering. I know that there&#8217;s plenty of people that wish they had some excess time to spend on refactoring, =D.
But anyways, to wrap things up. My total permission system setup now allows users to set up the complete permission set for all users in a single line of code, and allows full customization in far less lines of code than the old one (where the old one involved at least two or three dozen lines - creating five string values, &#160;create a couple of Permission objects, put those in arrays, call the same method a couple of times in the ComponentDefinition object to assign them, etcetera. Having to do that every time for each component / WCB that requires permissions gets tedious, and not to mention it increases the code and, as such, the complexity of a class / method, and reduces its readability.
I&#8217;ll post a bit of code later on (maybe) to further illustrate this post, one line of code can say more than a thousand words and whatnot.</div></summary>
  </entry>

  <entry>
    <title>GX WebManager’s WCB Dependency Managem</title>
    <link href="http://greatjustice.info/?p=40"/>
    <id>http://yoursite/article/?i=42520a3e7755f0c6e51808b96310e16c</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=40</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s been far too long since I posted on here, so after an upgrade to WP 2.7 (or something), here&#8217;s a new post. The title may be a tad confusing, so I&#8217;ll try to explain that (and the abbreviations) first now.
I&#8217;m currently doing a 20-week internship at Oberon Interactive, a largely web-oriented company that does webdesign, online campaigns, that kinda stuff, all from their HQ in Amsterdam. It&#8217;s got about 12 or so employees (including myself), but I&#8217;m not sure yet because there&#8217;s almost always someone missing. On there, I&#8217;ve been assigned with the task of making development of WCB&#8217;s easier.
Before I throw in more TLA&#8217;s though, I&#8217;ll explain what I&#8217;m working with. I&#8217;m working with a pretty extensive enterprise content management system called WebManager, made by Dutch company GX. Since WebManager is the only piece of software GX seems to be developing, I&#8217;ll probably often confuse WebManager with GX and vice-versa, so if I use GX in reference to an item, I mean WebManager.
Anyways, since version 9 (I believe) of WebManager, GX has added the ability for developers to add functionality to WebManager through a plug-in-like system. This functionality is packaged in bundles called WebManager Content Bundles, aka WCB&#8217;s. These WCB&#8217;s are basically OSGi modules, built on top of Apache Felix, an implementation of OSGi&#8217;s service platform.
Now, Oberon has received at least one assignment from a large Dutch football site (i.e. the football type with the round ball, not the oblong one) that, at least for now, involves creating two of these WCB&#8217;s to be included into their site. The visible bit of a WCB can easily be inserted into existing WebManager pages through WebManager&#8217;s Edit Environment, a back-end that looks an awful lot like Microsoft Word.
Anyways, I&#8217;m working with that currently, and my primary internship assignment is to make WCB development a lot easier, reliable, and faster. There&#8217;s several aspects of WCB development that have to be improved, as I&#8217;ve discovered / determined for myself so far, and this article is about one of them: Dependency management. I&#8217;m sure I&#8217;ll be writing more posts during my internship on a range of (WCB development) related subjects, so be sure to hang around.
For this first installment, I&#8217;ve taken a closer look on how the WCB API&#8217;s handle dependency management, also comparing it with other, more formalized approaches. I&#8217;ve put the report into a neat, 10-page Word document, which I&#8217;ll link to below. Here&#8217;s a summary though, and you&#8217;re going to have to visit the internets to figure the terms I use out or read the .doc itself in order to find out what is what.
A WCB is built out of separate Components, like a Form, an Element, a Servlet, etc. Each Component has one central class of sorts that is initialized by some obscure part of WebManager, i.e. out of the programmer&#8217;s control. In order to be able to use, for example, the Authorization Service, with which you can check access permissions for users for a certain access, you have to pass a string value containing the class name of said Authorization Service to a new instance of a ServiceDependency object, then pass that to a ComponentDefinition object which is passed back to WebManager when your WCB is installed / initialized.
There&#8217;s loads of problems with this approach:
* No typesafe checking, so you&#8217;ll only see if you&#8217;ve entered the wrong classname at runtime (whilst one could pass a Class object, much more typesafe).
* It&#8217;s hard to get to the central object to get the service(s), you either have to call a getComponent() method from the controller class and cast that into the specific class, or implement the class as a singleton.
* No control over the dependencies&#8217; lifecycle - you can only pass the class you&#8217;d like to initialize to WebManager, can&#8217;t pass any parameters or whatever.
* You can only inject services into that one Component object.
* Injection is (usually) done using reflection on a class&#8217;s private fields, obliterating the meaning of the &#8216;private&#8217; keyword, and preventing the usage of setter methods (and additional behaviour one could associate with that).
All in all, they do use the term &#8216;dependency injection&#8217; a few times in their official documentation, but in practice all you do is pass the names of the classes you&#8217;d like to have created, have WebManager inject those into an object that acts as a hard-to-access Service Locator, and be done with it. The Service Locator isn&#8217;t a bad choice per s&#233;, but since the dependencies contained in the SL are injected somewhere at runtime, after all the objects (Controller, for example) are created, you&#8217;d only be able to access the dependencies at runtime of an object, through accessor methods. I&#8217;d much prefer if an object&#8217;s dependencies were injected at construction-time, through constructor injection, etc.
But all that, and then some, is all described in the document. Read it and let me know what you think - I&#8217;d love a second opinion on the matter, or alternative solutions to solving this problem.
http://greatjustice.info/files/dependency-management.doc
Edit: Small update, if this topic interests you, make sure to read Fowler&#8217;s article on the subject - it helped me formalize the different techniques used. Also, I should seriously buy / read his book(s), fgj.</div></summary>
  </entry>

  <entry>
    <title>Using Bitmasks in a Groups Permission Sy</title>
    <link href="http://greatjustice.info/?p=38"/>
    <id>http://yoursite/article/?i=fd6982bf9bf4cb64bb4844b6ece2abbb</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=38</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As promised in my previous post, this article will describe a practical application of bitmasks, in this particular case for usage in a permission system on a webapplication. This particular application is a social network site, in which a user can create a joinable group. Each group has four usergroups - Guests, Members, Moderators, and Administrators, and as a special group with no specific traits of its own, Creator(s) (i.e. the person(s) that created the group).
Each usergroup has a set of permissions in each group - so basically, you have to be able to store a usergroup&#8217;s permissions on a per-group basis. In this article, I&#8217;ll explain how I&#8217;ve used bitmasks and the associated operators as explained in the previous article to store those permissions, as well as the usergroup(s) a particular user belongs to in a specifc group. The bottom line is that by storing the permission a usergroup has in a bitmask, you end up with a lot less database usage. But that&#8217;ll be explained in this article.
First though, a case study. This is actually a good idea for pretty much every software application, both as a whole and its parts - analyze what you&#8217;re trying to do. In this case, I wanted to create a social network site of sorts (using the&#160;Zend Framework) with, next to the obvious user profiles and user-to-user communication, a &#8216;groups&#8217; system, where users can create groups, clubs, or whatnot, each with its own discussions (or &#8216;threads&#8217;, you could basically also see it as a forum where users can create their own sections). More specifically, the owner / Administrator of a Group should be able to determine the access people have to their own groups - for example, a private group, an invite-only group, a read-only group, etcetera.
To implement this, a permission system would have to be setup. I was already pretty sure I&#8217;d use a default set of usergroups (Creators, Administrators, Moderators, Members and groupless, Guests), also called Roles, which more properly describes the per-group Role a User has - in group A, a User may just be a visiting Guest, whilst in group B the user would be a Moderator, and in C a Member, etc.
Next to that, I also figured that one User may fulfill more than one Role - in first instance the Creator / Administrator combination, where a Creator in its own doesn&#8217;t have any particular rights or duties, but when combined with the Administrator role, a Creator rises above the &#8216;regular&#8217; Administrator rank, in that he cannot be removed from the group by other Administrators. In retrospect, allowing every user to have more than one Role at a time might&#8217;ve been a little overkill, but it&#8217;s quite manageable in terms of the database storage required to associate a User with a Group.
In the database, there&#8217;s a link table, GroupUsers, that contains the group ID, the user ID, and the Role, the latter being a regular integer value. Just one column to indicate the user&#8217;s Role, no matter how many Roles the user has.
Next to assigning Roles to Users on a per-group basis, a Role would also need to have a set of Permissions, also on a per-group basis. In other words, in one group a Member could, for example, create new threads, whilst in another a Member could only reply to threads, all based on the choice of the Administrator(s) of that particular group.
So another requirement was that per Group, the permissions of a Role would have to be stored.
The Permissions are basically a list of sorts, containing items such as
(users with this Role can:)

View the group
View threads
Edit threads
Create new threads
Reply to threads
Edit own posts
Edit other people&#8217;s posts
etc

The permissions each Role has can be determined and set with the above list of permissions. Next to that, it&#8217;s relatively easy to extend these permissions.
The problem however is storage. In a regular system, one might say that the Role has a list of boolean permission values in that Group - canViewGroup, canViewThreads, canEditThreads, etcetera. Translating that to a database schema is also easy - just add boolean columns canViewGroup, canViewThreads, etcetera, with values 0 or 1 in them.
However, this makes the Groups table, in which we can store the permissions for each group, needlessly long - for each role + permission, a column is needed, so with just the above 7 permissions, 28 columns would be needed to store these. One of the base rules of database design is to make your database tables as narrow as possible - as few columns as possible. The narrower the table, the less data has to be processed and searched through, the faster access is.
In order to solve this particular problem, bitmasks were used. Instead of storing each permission as its own boolean value, each permission has its own unique mask - as described in the previous article. The permissions itself is stored in a numerical value, both in the program&#8217;s code itself (the Group object) and in the database. Instead of having the amount of roles times the amount of permissions in database columns for each Group, you can now do with just one column per usergroup. Here&#8217;s how it&#8217;s done. We keep everything in the Group object, since that&#8217;s where the Roles&#8217; &#160;Permissions are stored. You could opt to put the storage of Roles in a separate object, but it makes no functional or logical difference (there&#8217;s a 1-to-1 relationship between a Group and its permissions).
In the Group object, we put the numerical values that store the permissions for each usergroup, and we define a list of constants that represent the bitmasks (or &#8216;flags&#8217;) for each permission. Note again that all permissions are powers of 2, as explained in the other article. Note also the usage of class-level constants, introduced in PHP 5 (I believe).
class Group
{
	const PERM_VIEW_GROUP = 1;
	const PERM_VIEW_THREADS = 2;
	const PERM_EDIT_THREADS = 4;
	const PERM_CREATE_THREADS = 8;
	const PERM_REPLY_THREADS = 16;
	const PERM_EDIT_OWN_POSTS = 32;
	const PERM_EDIT_OTHER_POSTS = 64;

	private $administratorPermissions = 0;
	private $moderatorPermissions = 0;
	private $memberPermissions = 0;
	private $guestPermissions = 0;

}
For each Role, methods can be defined that set, unset, add or remove permissions to a certain usergroup.&#160;
&#160;

	public function setAdministratorPermissions($perms)
	{
		$this-&gt;administratorPermissions = $perms;
	}

	// returns the Administrator role's permissions
	public function getAdministratorPermissions()
	{
		return $this-&gt;administratorPermissions;
	}

	// Adds a permission to the Administrator role.
	public function addAdministratorPermission($perm)
	{
		// we use the |= operator, which is equal to $value = $value | $perm
		$this-&gt;administratorPermissions |= $perm;
	}

	// Removes / unsets the given permission from the Administrator role's permissions.
	public function removeAdministratorPermission($perm)
	{
		$this-&gt;administratorPermissions &amp;= ~$perm
	}

	// checks if the Administrator role has the given permission
	public function getAdministratorPermission($perm)
	{
		return (($this-&gt;administratorPermissions &amp; $perm) != 0);
	}
Rinse and repeat for the other usergroups. Of course, all this could be condensed into even smaller chunks. You could also, to further redue the storage used for permission, create additional permission masks, the full set for each usergroup - i.e. MODERATOR_PERM_CAN_VIEW_THREAD, etc. However, you'll probably run up against the limitations of the system - i.e. that a number can only contain so much bits before it overflows. If you have only a few permissions, you could chuck it all into a single value, but if you have more (more than 8), use separate variables.</div></summary>
  </entry>

  <entry>
    <title>The Lost Art of Bitmasks</title>
    <link href="http://greatjustice.info/?p=37"/>
    <id>http://yoursite/article/?i=183ddebe85f722cdc965f1959eb725f9</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=37</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In this article, I will attempt to explain the so-called bitmasks, and the application of the binary operators (such as &amp;, |, &lt;&lt; and &gt;&gt;) found in pretty much every programming language. I myself have been in my education for four years now, but only last year or so did I encounter a practical application for using them. The title is as such perhaps just personal, seeing that I don&#8217;t really know the level of most modern-day programmers or whether they&#8217;re familiar with binary operations, but in my own experience, more emphasis is put on high-level structures and techniques, compared to low-level data storage, management and manipulation. This article will provide an introduction to binary operators, as well as how and when they can be applied - in a basic fashion, I&#8217;m sure that a lot more advanced applications for these techniques can be thought up.

I&#8217;m fairly sure that every beginning programmer will read through the introductionary text of a new programming language and encounter several operators whose function remains unknown - I&#8217;m referring to the &amp;, |, &lt;&lt; and &gt;&gt; operators, which are present in pretty much every programming language. These operators are the binary AND, binary OR, and the left and right bitshift operators. Some will research further and, if they&#8217;re familiar with binary numbers (i.e. how numbers are represented in a processor, on the lowest level, with ones and zeroes), might also discover what it is they do exactly on a value.
However, a practical application for those doesn&#8217;t always make itself apparent. For me personally, it took three years (or four, dunno exactly) before I finally encountered an application for it. This was whilst I was working on Clan Arena / the C4 engine, whose code contains a relatively large amount of binary operators and functionality.
In C4, the application of these operators is numerous, but it often boils down to one thing - setting and reading properties of an object, for example a renderable 3D model. One property of a model was how it was rendered - render its wireframe, textures, shadow, specific shadow mode, and I dunno what else. Those are just examples btw, I&#8217;m not actually sure how they were really used.
The point with that particular application was that you could assign several settings to a model, whilst internally, each setting was stored in just a single, numerical variable. This means that you could set a number of &#8216;flags&#8217;, as they&#8217;re also referred to, to a single object.
The easiest comparison is with booleans. Pretty much everyone knows the boolean true / false logic, so that shouldn&#8217;t need any more explanation. Let&#8217;s say you&#8217;re writing a 3D engine and you&#8217;re at the part where to decide which part of a model to render - wireframe, texture, shadow, etc. A model, in this case, can indicate what it wants the engine to render, i.e. the model has a set of properties - let&#8217;s call em renderWireframe, renderTexture, and renderShadow, all boolean variables.
For each rendering pass, the engine will check these three variables and render accordingly. Simple enough.
Now, with bitmasks and binary operators, you could store these three (and many more, up to 32 or 64) variables into just one single variable, an integer. This is a prime example of data encapsulation in OOP environments - from the outside, the renderable object has a few methods, say, getRenderShadow(), getRenderWireframe(), and getRenderTexture(), but on the inside, these three booleans are all stored into a single variable.
The easiest way to picture this is to rotate the three booleans to a horizontal orientation. Let&#8217;s say the number 1 is the boolean true, and 0 is the boolean false (which, btw, is perfectly applicable to C/C++ and other languages in that order). You&#8217;d get some vars like:
bool renderWireframe = 0;
bool renderTexture = 1;
bool renderShadow = 1;
In this example, we want to render the model&#8217;s texture and shadow, but not the wireframe. When you take the values, rotate them horizontally, you&#8217;d get the following value:
011
A binary number which, if you happen to know binary, can also be interpreted as the number 3, thus reducing the amount of variables used to store the rendering information from 3 to 1. You may think that this isn&#8217;t a major improvement, but imagine you have to send the rendering variables through a Message, as I&#8217;ve described in an earlier post: Next to the Model object&#8217;s three variables, you&#8217;d also get a Message object with the same three variables.
In the default C4 implementation, this&#8217;ll take a few minutes to create. When you reduce the amount of variables in the Model to 1, you also get a Message with just 1 variable to send - which takes less time to write , and reduces the overhead of packing / unpacking the message by a factor 3 at most (probably a lot less, seeing that the original booleans took up just 3 bits in memory, compared to the 32 or 64 bits an integer would take up). Multiply this saving by the amount of times the message is sent back and forth, and you&#8217;ll notice a major improvement (logically speaking, that is, it&#8217;ll probably save amounts that can only be measured in nanoseconds, something you&#8217;ll hardly notice)
This particular example is probably easy to imagine, but can easily be converted to the inner workings of a program itself - Objects send each other messages all the time, in the form of method invocations and the passing of other Objects. Reduce the amount of variables, and you get less method invocations, less memory access overhead, etcetera.
In a follow-up article, I&#8217;ll explain how I&#8217;ve used this technique for an access control system for a PHP-based website / application. For now though, I&#8217;ll try to explain how to use the system described above.
Usage
There&#8217;s basically three operations you&#8217;ll need to know in order to work with binary variables / bitmasks: Reading, writing, and deleting / unsetting. Reading involves checking a variable if it&#8217;s got a certain value - in the above example, for example, you&#8217;ll want to check whether to render textures or not, and in a later stage, whether to render shadows or not. Writing is also important, since you&#8217;ll have to set the value at some point. Finally, unsetting involves removing a value from the variable.
We&#8217;ll start by setting a flag / bitmask in a variable.
First, you&#8217;ll have to declare a variable that contains the information. In this case, we&#8217;ll use C/C++ datatypes, but this technique applies to pretty much every programming language. We&#8217;ll initialize it to 0.
int var = 0;
Note that the binary representation of this number is 00000000 in an 8-bit system (we&#8217;ll use just 4 bits for this example purpose, in a modern-day system this&#8217;ll probably be 16, 32, 64 or even 128 bits).
Second, we&#8217;ll have to have a base value for all possible settings that can be set. As in, we&#8217;ll want to declare a few constant values that represent the settings. These constants, and this is important, have to be a power of 2, like 1, 2, 4, 8, 16, 32, 64, 128, etcetera. If you translate those to binary, you get sequences like 0001, 0010, 0100 and 1000 - note that each binary number has just one 1 set, the rest is 0. We&#8217;ll define the constants as such:
const int renderWireframe = 1;
const int renderTexture = 2;
const int renderShadow = 4;
In C/C++ and most other languages, you can simplify this action by using the bitshift operator (&lt;&lt;). This will basically move all 1&#8217;s in a binary number one space to the left, so that 0001 &lt;&lt; 1 (bitshift 0001 with 1 space) will result in 0010, as shown in the example below. This however doesn&#8217;t work in all languages - PHP, for example, has problems with assigning the outcome of an operator to a constant. You can just use the notation above, the result is the same.
const int renderWireframe = 1 &lt;&lt; 0; // 1
const int renderTexture = 1 &lt;&lt; 1;   // 2
const int renderShadow = 1 &lt;&lt; 2;// 4
In this case, you won&#8217;t have to manually calculate the power of 2 yourself, which, at least for higher numbers, is convenient - and you don&#8217;t want to risk miscalculations, not even with one number, since it&#8217;ll cause unexpected results.
I&#8217;ll explain the reasoning behind this in a bit, if you don&#8217;t get it by then. First though, we&#8217;ll write a value into our integer variable we declared earlier.
Assignment
 To assign a value to a binary variable, you&#8217;ll need to use the binary OR operator - the single | character, like so:
var = var | renderTexture;
(note that some languages also have the |= operator, which can also be used instead.) The OR operator basically says something like: &#8216;For each number in the binary representation of the resulting variable, set to 1 if either var or renderTexture also has a 1 at that position&#8217;. A calculus notation will clarify (I hope):
0000
0010
---- |
0010

0 OR 0 = 0
0 OR 0 = 0
0 OR 1 = 1
0 OR 0 = 0
(feel free to replace 0 and 1 with false and true, and the | operator with the || operator, which compares the variables on a true/false level, a step higher than the binary level)
We&#8217;ve added renderTexture to the var, indicating we&#8217;ll want to render the texture. Let&#8217;s also add the renderShadow one:
var = var | renderShadow;
Which looks like
0010
0100
---- |
0110

0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
0 OR 0 = 0
Hopefully, the reasoning behind assigning only powers of 2 to the constants become clear now - assign anything but a power of 2, and you could get multiple flags set in the variable, which isn&#8217;t what you intend. Unless you do, of course.
Now, our variable called var has a value of 0110, which, translated back to the decimal system, is 6. Note that 6 is neither the value of the renderTexture constant, nor the value of the renderShadow constant - it&#8217;s a combination of the two. It also isn&#8217;t a power of 2. Because of this, you can&#8217;t compare the value with one of the constants using the == operator directly - you&#8217;ll have to extract the value from the variable, or, to be more precise, check if the value you&#8217;re checking for is contained in the variable.
Querying
To do this, we use the binary AND operator, &amp;, on both the var and the constant, and check if the result is anything but 0. Let&#8217;s check if our variable has the renderShadow flag set. Note that AND works the same as OR, with the exception that the resulting binary number is only set to 1 if both the first AND the second binary number at the position is 1.
0110
0100
---- &amp;
0100
0100 is not 0, so we can safely say that the renderShadow flag is set inside the variable. I said earlier to see if the variable is simply &#8216;anything but 0&#8242;, but the above example indicates that the result is actually equal to the renderShadow constant - why not compare it with that? There&#8217;s a number of reasons for that, actually, the primary one being that it&#8217;s a lot simpler. What&#8217;s easier to type:
if ((var &amp; renderShadow) != 0)
or
if ((var &amp; renderShadow) != renderShadow)
?
The result is in both cases the same - true in this particular example - but the former is a lot easier to write. In fact, in a lot of languages that are either typeless or semi-loosely typed, in which a regular int can, for example, also be interpreted as a boolean, such as C/C++, you could also just do
if (var &amp; renderShadow)
and leave out the comparison entirely - in C/C++ and PHP (haven&#8217;t tried this in other languages yet), anything but 0 is interpreted as a boolean true, when used in an if-statement.
However, it&#8217;s considered bad practice to use it in this way, since it may cause confusion and doesn&#8217;t work this way in all languages. Not only that, but it confuses one type with another - whilst an integer can be interpreted and used as a boolean, they&#8217;re logically speaking two entirely different things. I made a mistake when I tried to put the result of one of these operations into a variable - instead of the result (a boolean true or false), the variable was set to the numerical value of the result (4 in the above example), producing odd, unexpected results.
Querying multiple masks
You should note however that you can only check for one value at a time using this method (using the comparison to 0), even though you&#8217;ve learned how to combine two binary values with each other earlier using the OR operator. The reason is that, when comparing a variable AND-ed with a combination of two values, the resulting value will be a non-0 value even when just one of the two flags is set. This can be prevented by comparing the resulting variable with the combination value instead of checking if it&#8217;s not 0 . An example:
var = 0;
var = var | renderTexture; // set var to 0010

// check if var is set to both renderTexture and renderShadow
if ((var &amp; (renderTexture | renderShadow) != 0)

First we combine the two constants:

0010 // renderTexture
0100 // renderShadow
---- |
0110

Then we do the comparison:

0110 // renderTexture | renderShadow
0010 // var
---- &amp;
0010
0010 is 2, is not 0, so the comparison would return true - even though renderShadow wasn&#8217;t set. Compare it with the combination of the two instead of &#8216;higher than 0&#8242;, and you&#8217;ll get the right result:
if ((0010 &amp; 0110) == (renderTexture | renderShadow))


0010 &amp; 0110 = 0010
0010 &amp; 0100 = 0110

Or, in full

if ((var &amp; (renderTexture | renderShadow)) == (renderTexture | renderShadow))

0010 is not equal to 0110, so the above comparison returns false, which is what we expected. You&#8217;ll have to do some more typing to get this to work though, and do the or-ing of the two constants twice (unless you place the or-ed version in a local variable or, if you do the combined comparison a lot, a constant on its own).
int cmp = (renderTexture | renderShadow);
if ((var &amp; cmp) == cmp) {}
Unsetting
The third and final operation we&#8217;ll want to be able to perform, is to unset a flag from the variable. To do this, we AND the variable with the inverse of the mask. Previously, we did the AND-operator, that turned 0100 and 0110 into 0100, since only the second 1 was set and both numbers have to be 1 in order to have a 1 in the same position in the result. To unset a variable however, we&#8217;ll want the inverse to happen - set the value to 0 if both numbers are 1, i.e. the position in the variable has to be set to 0 at the position where the flag is 1.
If we have a value 0110, and a mask 0100, and we want to unset the mask from the value (i.e. remove the second 1 in the value), we use the inverse of the mask and AND that with the value.
We take the mask 0100 and we inverse it, which can be done with the ~ operator in most languages (bitwise NOT). The inverse of 0100, ~0100, is 1011. ANDing that with the value 0110, and we get:
0110
1011
---- &amp;
0010
or the value minus the flag value.
(another use of the binary NOT operator is to get the maximum value an integer can have - simply echo ~0, the binary NOT of 0, and you get a binary value of all 1&#8217;s, or the maximum integer value)
That&#8217;s about all there is to binary operators. As I said in the beginning, I&#8217;ll attempt to describe an application of this technique with a real-world example, by using the bitmask technique to define roles for users, and permissions belonging to those roles. The major advantage of using bitmasks in such a manner is that of database storage - you only need one database column to describe everything a user having a role can do. But more on that in the follow-up.</div></summary>
  </entry>

  <entry>
    <title>Zend Framework</title>
    <link href="http://greatjustice.info/?p=36"/>
    <id>http://yoursite/article/?i=57f69d81ab5f6e110eadcfd0cfaf93c2</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=36</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There are numerous web application frameworks written in and for PHP on the market nowadays, most of them free and/or open source, most of them following or supporting the MVC paradigm. This summer, I&#8217;m going to go and attempt to make a website using one of the newer frameworks out there: the Zend Framework. Made (or at least started / supported by) the people / company that also does the PHP language itself, it promises a solid framework for web application development, &#8216;extreme simplicity and productivity&#8217; (from the website), up-to-date with the latest internet technologies, etcetera.
In this post (and following posts), I will dive into Zend Framework, describe its various loosely-coupled components, and make an attempt at judging the framework.

For this summer vacation, I had decided to start my own website project, just to keep up-to-date and whatnot. Since PHP is the most supported scripting language (and currently supported by my relatively cheap host), I decided to do it in that - much less hassle trying to get it online. Although PHP isn&#8217;t my favorite language, I decided to give it another serious try, with everything I&#8217;ve learned of OO programming and design during the last few years.
Earlier, I&#8217;ve played around with Ruby on Rails, the web application framework that sparked an enormous flood in MVC frameworks in various programming languages - amongst which PHP. I even made a simple site with that, got some hosting for it (which was quite more expensive than my current host), and attempted to put it online&#8230; but that failed.
Later, I played around with CakePHP, a very popular PHP framework that, as other frameworks do as well, offers an MVC structure, an object-relational mapper, AJAX support, and all that and then some. I didn&#8217;t finish the website I started to built with it (due to uncertainties with the people that were going to use / run / operate it and my own lack of interest), so I am not able to properly judge CakePHP. I was annoyed by how you insert variables in templates though - when I attempted it, you had to echo an array index from an object field:
$something-&gt;post['Post'];
or something like that - I can&#8217;t remember. Looking at the current quickstart, &#160;they&#8217;ve changed it to echo-ing a structure like
$post['Post']['id'];
but that still isn&#8217;t to my liking - it&#8217;s an array in an array in an equally-named variable. If there are multiple posts, which is the only reason I can think of why you&#8217;d use a two-dimensional array, at least call your variable $posts (plural), and run through all the posts with a foreach loop or something.
Anyways, that was probably more than a year ago. So this summer, I finally decided to start working on my own website and, following some rumours on the internets about Zend Framework, I decided to give it a try.
The Zend Framework is in a lot of respects the same as all those other PHP frameworks out there, having a database abstraction layer, MVC support, AJAX support, and all that. The main thing that ZF stands out for however is that it&#8217;s all loosely-coupled - using one component of Zend Framework, for example the database layer, does not mean you also have to use their MVC component, and vice-versa. There&#8217;s a list of components of the Zend Framework in the programmer&#8217;s documentation, and for the biggest part, they all work independently of each other. For example, if you want to configure your database connection (using Zend_Db), you can do that by passing an array of the configuration parameters, or you can use an instance of Zend_Config, which can also be initialized in multiple ways (by using an ini or XML file, or by passing a PHP array). These decouplings and lack of dependencies between Zend Framework components is one of the major points in the entire framework. It doesn&#8217;t force you to use one or the other. Want to use your own controller structure? No problem. Want to use a third-party database abstraction layer? No problem either.
Zend doesn&#8217;t force you to use anything, it leaves you with the choice. And I believe that is a very good philosophy.
So far, I&#8217;ve spent a good week or so on the framework, progressing through the development by reading the documentation on one component, then building part of my application using that, followed by reading up on another component, and intergrating that into my application. It&#8217;s relatively easy to remodel an existing application to use Zend Framework components, or to add additional functionality to your program. Which I find a nice way of working, since you can take learning the framework one step at a time, whenever you&#8217;re ready for it.
So far, I&#8217;ve only used a small part of the Zend Framework - Zend_Controller, Zend_Db, Zend_Form, Zend_Filter,&#160; and Zend_Validator conciously. Some more components are used unconciously, such as Zend_View and whatnot, but it&#8217;s possible to replace those as well. As such, I&#8217;m nowhere near providing an accurate description or review of the framework. However, in the week or so I have noticed several things, both positive and negative.
First, there&#8217;s quite a lot and thorough description of each component in the Zend_Framework, which explain the biggest parts of each component. There&#8217;s also a complete API available, although the documentation on that isn&#8217;t very extensive - three-worded method descriptions and such, for example. With that, the documentation is just &#8216;good&#8217;, not perfect. But since the framework is still in development, with the 1.6 version being released as a release candidate not too long ago, I&#8217;m sure that&#8217;ll come along soon.
Next, there are serious demands for new framework components. They have to have an 80% test coverage, proper documentation, adhere to the coding standards, and so forth. The test coverage requirement is, in my perspective, especially valueable, since it gives some degree of guarantee that the framework is good in terms of quality. I haven&#8217;t actually seen the tests (or even executed them) yet, but I do plan on writing tests for my own application, once I have a basic version done.
However, not everything is fine and dandy with the Zend Framework. While it does offer a large set of components, it isn&#8217;t really intended to be a full website framework. For example, it isn&#8217;t shipped with an object-relational mapper (yet), or with scaffolding purposes, which, for other frameworks, are often used for advertising purposes (as in: lookie me! I can make a blog in 5 minutes!). This means that some components, such as object / relational communications have to be written by the developer himself. The Zend Framework makes the development of a website a lot easier, but doesn&#8217;t take all the work from the developer. This can be seen as both a good and a bad thing. It&#8217;s good because it allows a lot of freedom and control for developers, allowing them to control pretty much every aspect of their website, without relying on auto-generated code or underlying functionality. It&#8217;s bad however because it&#8217;s not very easy to learn for new users. The latter part can probably be solved by both extensive documentation (a full tutorial isn&#8217;t yet available) and frameworks built on top of the Zend Framework, that do add features such as scaffolding to the framework. Such features might be added to the framework itself in a future date.
All in all, I like Zend Framework. It doesn&#8217;t seem to be aimed entirely at new developers, isn&#8217;t pretentious or promising instant websites, but offers a professional framework for serious developers that know what they&#8217;re doing, without forcing their hand into using components that may not be applicable for their particular situation. I&#8217;m also unable to judge whether the Zend Framework is suitable for (relatively) new programmers either. I&#8217;m not having any serious learning problems with it, since I like to tell myself I know proper object-oriented programming, but I can imagine that new programmers will have problems with it, due to it giving a lot of freedom, requiring a lot of design knowledge, and the absence of step-by-step guides for building a full website.
In the near future, I&#8217;ll (probably) be writing some more articles concerning the Zend Framework and/or components therein.
EDIT: My bad, the Zend Framework does have some sort of object/relational mapper, in the form of the Zend_Db_Table and Zend_Db_Table_Row classes, which represent a database table and/or table row. The latter one in specific is the OR-mapper, and allows you to call methods like save() to store a row into the database. I&#8217;ll try and write an article on it once I figure it out properly for myself and I cba.</div></summary>
  </entry>

  <entry>
    <title>Applied design patterns: C4 Engine Messa</title>
    <link href="http://greatjustice.info/?p=34"/>
    <id>http://yoursite/article/?i=5fb2c0f6c9517397769ee926f65bbe6f</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=34</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In my previous article about the C4 engine, I highlighted what was, in my opinion, the biggest downside of the C4 engine: its demo game. Or more precisely, the code and design of the demo game. Because I had to get points for university and didn&#8217;t have time to dive into said code and refactor it all, I wrote a refactoring proposal (found here: Office &#8216;97-&#8217;03 / Office &#8216;07) and put it on the C4 Engine forums. After that, and after the project, I still had to get some points, so I executed some of the refactorings.
So far, most refactorings I&#8217;ve done involve moving functionality from one central Game class to different smaller classes - resource and game management so far. One refactoring however is one I&#8217;m pretty proud of (in all decency), and is described in the refactoring proposal as the Composite Message System.
In this article, I&#8217;ll (attemt to) explain the process of this particular refactoring: explain the old situation, what the problem was with that situation, how it was analyzed and how, eventually (and with the help of my trusty Design Patterns book) I came up with a replacement system of that situation, one that was a lot more flexible and reusable, and one that would accellerate the speed at which programmers could produce results.
For those that are interested, I&#8217;ll be discussing the Composite, Visitor, Factory Method and (to a lesser degree) Builder design patterns in this article.

Ye Olde slash Current Situation
While I&#8217;m not officially allowed to post any real code from the C4 engine or demo game, I&#8217;m pretty sure there&#8217;s no restrictions to discussing said code / design.
In the current situation, you can send messages to other clients through C4&#8217;s MessageMgr class, accessible through a global (shudder) variable, TheMessageMgr. The MessageMgr has a SendMessage method, which takes an address (in the form of the key of the recipient, managed by said MessageMgr) and a Message. This Message is a subclass of C4&#8217;s Message class, a class that contains some management functions (message ID number and such), but mainly defines the behavior of subclasses.
In a C4-made game, a subclass of Message has to be created for each message type. For example, say you want to send a chat message to a certain player. In C4, you&#8217;ll have to create a new class ChatMessage, which extends Message. ChatMessage would contain two variables: Sender, a long value referring to the player who sent the message, and Message, a String (or character array) containing the actual message.
C4&#8217;s Message interface defines that any Message should also implement a Compress() and a Decompress() method, two methods that basically pass a Compressor and/or a Decompressor object to the Message object, on which methods can be called so that the Message can add and extract its own data from a byte stream (or whatever, I don&#8217;t know / don&#8217;t need to know how the data is actually represented inside the Compressor / Decompressor objects). So you&#8217;ll have the following methods:
void ChatMessage::Compress(Compressor&amp; data)
{
	data &lt;&lt; sender;
	data &lt;&lt; message;
}

bool ChatMessage::Decompress(Decompressor&amp; data)
{
	data &gt;&gt; sender;
	data &gt;&gt; message;
}

Basically, the Compressor and Decompressor implement the &lt;&lt; and &gt;&gt; operators, which add and extract the data from their internal representation. This actually adheres to the Visitor design pattern already, where a client sends an object to another object, where this other object (a Message subclass in this case) calls methods on the visiting object to, in this case, add data to it.
So, in total, to create a new Message type, you have to create a new class (in a header file) containing the class itself, the fields, two constructors, accessors for the fields, and a Compress and Decompress method. Next, implement the methods defined in the header file in a .cpp file (as well as message sending and receiving functionality, but that&#8217;s something for another day.) Sounds straightforward enough, and to be honest, it is.
However.

Say you want to create  another message that sends an announcement to all players, say, a server message that appears in the middle of each player&#8217;s screen. Simple enough, create a new Message class that contains a string and done. Rinse and repeat the above operations of new files, new class, constructors, compress / decompress, accessors, and implementation. Next, you want to send a notification that playey X has left the game. Again, simple enough, just create a new message type PlayerLeftMessage, which contains just one long value (the player key), constructors, accessors, compress/decompress, implement&#8230; wait a minute, didn&#8217;t we do that earlier?
The observant reader will notice that in the above example, three full-on message types were created, each about 50 lines in total (no comments, with whitespace), and each containing roughly the same methods and functionality. The only actual difference between the three is the data they contain / send, and an internal key to uniquely identify the message type on reception. Not very much. And yet, you have to create a full class for it.
Let&#8217;s break it down a bit more. The types of data that can be sent over a network is limited by what the Compressor and Decompressor classes can handle in their &lt;&lt; and &gt;&gt; operators. These types include:

Booleans
Floating point numbers
Chars / Unsigned chars
Character arrays (Strings)
Shorts / Unsigned shorts
Longs / Unsigned longs
Long64 / Ulong64 (64 bits integers)

All messages, one way or the other, send these and only these values. More advanced data types, such as for example the Vector3D type, are broken down into components and sent. The Vector3D is broken down into 3 floating point numbers (floats), for example.
What does this mean? It means that, one way or the other, every message is composed of the above data types.  Every message type converts the data they have to send to these types. They all do, no exceptions.
Solution
As I came to realize this, I figured there had to be a better, more flexibe way to define new message types, using the components described above. I read the chapter in the Design Patterns book on the Composite design pattern (since all message types were &#8216;composed&#8217; of the above types), and attempted to work out a solution, as described in the refactoring proposal document.
The solution involved defining a class structure that allows a client to dynamically assemble (&#8217;compose&#8217;) a message type from both simple and complex &#8216;modules&#8217;, building blocks so to speak. There&#8217;s basically two types of building blocks: &#8216;Leaf&#8217;-blocks and &#8216;Composed&#8217; blocks. Leaf blocks are the lowest point in the imaginary Composite Message tree, and contain one type of data - corresponding to the above list of Compressor-supported data types. It contains just one field, and implements both the Compress and Decompress methods defined by C4&#8217;s Message class.
The Composed block is a bit more advanced. It contains an internal list of other blocks (which can be either other Composed objects or leaves), and methods for traversing that list. It also implements the Compress and Decompress method, but instead of calling the Compressor / Decompressor&#8217;s &lt;&lt; and &gt;&gt; operators, it passes the Compressor / Decompressor objects on to its subnodes&#8217; own Compress / Decompress methods, so they can perform whatever action they need to do on it. If one of the subnodes is a leaf node, it&#8217;ll add or extract its own locally stored data to the Compressor / Decompressor object. If it&#8217;s another Composed node, it&#8217;ll pass the Compressor / Decompressor on to its children.
The figure below illustrates.

In this diagram, SomeMessage and Vector3DMessage are Composed Messages, while StringMessage, LongMessage and FloatMessage are leaf messages. All message nodes can be treated equally - they all, directly or indirectly, inherit from C4&#8217;s Message class. They all implement a Compress / Decompress method. They&#8217;re also all subclasses of a custom CompositeMessage type, which defines methods for traversing the tree.
To construct a CompositeMessage, which now is a means of defining a new Message type as described earlier, all a programmer has to do now is a handful of code statements:

CompositeMessage * message = new ComposedMessage();
message-&gt;AddSubnode(new StringMessage("some string here"));
message-&gt;AddSubnode(new LongMessage(10));

TheMessageMgr-&gt;SendMessage(message);
Three lines to create a new message type that would otherwise take 50. Quite an improvement, if I say so myself. Of course, there&#8217;s more to this than the above, as I realized after I had thought out this design.
You now have a tree of CompositeMessage objects, which are either ComposedMessage or LeafMessage types. Which one? No clue - as it should be. Proper OO programming involves not knowing or needing to know what specific implementation of a class you&#8217;re working with. So in the above example, you could see the entire tree as a tree of CompositeMessage objects.
Extracting data
However. How are you supposed to get the data stored in that from it now? This was the problem I had as well, and which I discussed with some people on the internets. From those, I gathered the Visitor design pattern is usually the means of traversing a tree and getting data from it.
Earlier in this article, we briefly passed this Visitor design pattern - the Compress and Decompress methods in the Message subclasses are both Visitor methods. The Compressor and Decompressor objects passed to those are Visitor objects. Such an approach could also be used in the Composite Message type.
In order to extract the data from a Composed message, I thought up a Visitor object that contained a list of sorts for each supported data type, as well as accessors for those. For each data type, there&#8217;s an AddXValue() and an GetXValue() method, that in turn adds a value of type X to the Visitor and get a value of type X from the Visitor. GetXValue will return the first X value when it&#8217;s called the first time, the second when called the second time, etcetera - according to a first in, first out pattern.
In the CompositeMessage type, a Visit method was added for each subclass to implement, which passes a Visitor object to the object. A Leaf subclass would implement it by calling Visitor-&gt;AddXValue(), passing its locally stored value to the Visitor. A Composed subclass would implement it by passing the Visitor to each of its subnodes.
Once the Visitor has traversed all the nodes of the Composite message, it&#8217;s filled with data, which can be extracted by the client again using the GetXValue() methods. An example:

CompositeMessage * message = new ComposedMessage();
message-&gt;AddSubnode(new StringMessage("some string here"));
message-&gt;AddSubnode(new LongMessage(10));

Visitor * visitor = new Visitor();
message-&gt;Visit(visitor);
String * someString = message-&gt;GetStringValue();
long someLong = message-&gt;GetLongValue();

Looks straightforward enough. The only thing to keep in mind is that the data should be extracted in the order the composite message was assembled. This method can also be used to fill the CompositeMessage with data, by defining a FillVisit method for each CompositeMessage subclass. Instead of calling Visitor-&gt;SetXValue() however, the GetXValue() method is called and its resulting value is set as the object&#8217;s local data.
Speaking of assembling, it&#8217;s best if a CompositeMessage type is assembled from only one point in the program, so that the exact same structure is maintained each time the CompositeMessage is composed (or &#8216;built&#8217;). To accomplish this, we&#8217;ll use the Factory Method design pattern. For each Composite message type, we define a construction method that takes the initial values of the various components of the Composite Message. Here&#8217;s an example:

CompositeMessage * CreateSomeMessage(Vector3D someVector, long someLong, float someFloat)
{
	CompositeMessage * message = new CompositeMessage();
	message-&gt;addSubnode(new Vector3DMessage(someVector));
	message-&gt;addSubnode(new LongMessage(someLong));
	message-&gt;addSubnode(new FloatMessage(someFloat));

	return message;
}

Simple and straightforward enough.
Consequences
This structure has both up- and downsides.
Using this structure makes it a lot easier to quickly create new message types. The process of new files, new class, fields, constructors, accessors, compress/decompress methods and all that is no longer needed, instead a programmer now assembles a message in three lines that earlier took 50, not counting documentation. Chucking it into a Factory Method as defined above adds some lines, but still nowhere near 50. This leads to increased production speed, and allows the programmer to concentrate on his task of solving problems, instead of the tedious business of writing the same class over and over again, with only slight differences.
Dynamic. With this structure, it&#8217;s possible to define message types at runtime, based on various factors. As such, the complexity of a message can be adjusted to the requirements. You could create a large, complex composite message for a player&#8217;s initial data, then adjust it to a much smaller / simpler one that only contains the data that has been updated.
Compatible with existing Message system. There&#8217;s no need whatsoever to change anything in the engine&#8217;s network code, since as far as the engine&#8217;s concerned, the CompositeMessage is just yet another Message. So this system can easily be used alongside existing messages, so that a transferrence from or to this system can be executed gradually, one message type at at time, without breaking the rest of the application.
There are however also some disadvantages to this system:
For one, it&#8217;s not as straightforward anymore. In the old system, all you had to do was call message-&gt;GetSender() (or something) to get the sender of a chat message. Now, you first have to create a Visitor object, pass it to the composite message, and call GetLongValue() from the Visitor. It&#8217;s a few extra steps, and it&#8217;s a lot more ambiguous - who says the long value received from the Visitor is really a player&#8217;s key? It&#8217;s uncertain, which means that in order to use this system, you have to keep track of the message type, and the order of data.
Also, it&#8217;s slower than the existing. The existing method was just a class with some message. Sending a new message involved creating a new instance of this class, and done. Creating a new CompositeMessage instance involves creating an X-amount of new objects, depending on the amount of data to be sent, and calling several methods on said objects before it can be sent. And that&#8217;s not all, for when it&#8217;s received again, the entire tree has to be traversed twice - once by the Decompressor object to fill it with data, and once again by the Visitor object to extract the data. How much slower this is, I don&#8217;t know - if in fact it is measureable - but it requires more instructions than the existing system. I&#8217;m guessing the performance decrease is negligible though, considering that at the same time messages are received and such, C4&#8217;s engine calculates loads of matrix transforms and whatnot.
Finally, this system can be used alongside the existing message system. Didn&#8217;t I already say that before? I did, since this point can be seen as both an advantage and a disadvantage. It&#8217;s in this case disadvantageous because the two message systems can become confused with each other - when one message is a class and another is a CompositeMessage, you&#8217;ll end up with maintaining two different systems. It&#8217;s best to do either one or the other, not both. But I guess that&#8217;s also personal.

Code
Anyway, for points I went and implemented the system (or a version thereof) explained in the refactoring proposal document. I&#8217;ll post the code below, but first, a warning: I haven&#8217;t properly tested this code. I did translate a few messages to the system, but nothing really complex, and nowhere enough to say this code is safe. If you&#8217;re planning on using this code, don&#8217;t assume it&#8217;ll work. I won&#8217;t give any guarantees.
Here&#8217;s the code. Hope you don&#8217;t mind the massive amount of code (relatively), and that Wordpress messed up the indentation.
CompositeMessage.h

#ifndef CompositeMessage_h
#define CompositeMessage_h

#include "C4Messages.h"
#include "C4Engine.h"

namespace C4
{

/*
The Visitor class is a class representing an object that is able to traverse a
Complex Message structure to gather data.
*/
class Visitor
{
private:

// For each data types, two fields have to be defined:
// * The array (or whatever) used to store the data
// * A counter keeping track of the last data returned.

// Long values
Array longValues;
long currentLongValue;

Array unsignedLongValues;
long currentUnsignedLongValue;

// Boolean values
Array boolValues;
long currentBoolValue;

// Float values
Array floatValues;
long currentFloatValue;

// String values
Array stringValues;
long currentStringValue;

// Char values
Array charValues;
long currentCharValue;

Array unsignedCharValues;
long currentUnsignedCharValue;

// Short values
Array shortValues;
long currentShortValue;

Array unsignedShortValues;
long currentUnsignedShortValue;

// long64 values
Array long64Values;
long currentLong64Value;

Array
unsignedLong64Values;
long currentUnsignedLong64Value;

public:
Visitor();
~Visitor();

// Long values
void AddLongValue(long value);
long GetLongValue(void);

void AddUnsignedLongValue(unsigned long value);
unsigned long GetUnsignedLongValue(void);

// Bool values
void AddBoolValue(bool value);
bool GetBoolValue(void);

// Float values
void AddFloatValue(float value);
float GetFloatValue(void);

// String values
void AddStringValue(const char * value);
const char * GetStringValue(void);

// Char values
void AddCharValue(char value);
char GetCharValue(void);

void AddUnsignedCharValue(unsigned char value);
unsigned char GetUnsignedCharValue(void);

// Short values
void AddShortValue(short value);
short GetShortValue(void);

void AddUnsignedShortValue(unsigned short value);
unsigned short GetUnsignedShortValue(void);

// Long64 values
void AddLong64Value(long64 value);
long64 GetLong64Value(void);

void AddUnsignedLong64Value(ulong64 value);
ulong64 GetUnsignedLong64Value(void);
};

/*
The CompositeMessage class acts as the interface to all CompositeMessage subclasses,
and defines the basic behavior of all subclasses. The main two subclasses to this class
are LeafMessage and ComposedMessage - see those for more information.

*/
class CompositeMessage : public Message
{
public:
// Constructor, used to set an identifier for the Message.
// Passes type to the Message constructor.
CompositeMessage(MessageType type);
~CompositeMessage(void);

// The Compress method is called right before a Message is sent.
virtual void Compress(Compressor&amp; data) const;

// The Decompress method is called after the type of a Message has
// been determined.
virtual bool Decompress(Decompressor&amp; data);

// The Add method adds a subnode to a CompositeMessage.
virtual void Add(CompositeMessage * subnode);

// The Visit method should, when implemented by a leaf class,
// pass its data to the Visitor object. When implemented by a Composed
// class, it should pass the Visitor to its subnodes and, when appropriate,
// extract the data from the visitor, assemble its complex object, and
// pass that to the Visitor again.
virtual void Visit(Visitor * visitor) const;

// The FillVisit method works the same as the Visit method, except should
// be used to extract data from the Visitor and assign that data to the local
// fields. Once again, Composed message types should pass the Visitor on to
// subclasses.
virtual void FillVisit(Visitor * visitor);

// The GetData method is implemented by the CompositeMessage itself,
// and will create a Visitor object, send it through its own structure
// (regardless of whether it's a tree or just a single node), and return
// the filled Visitor to the calling client.
virtual Visitor * GetData(void) const;
};

/*
The LeafMessage class is the parent class to all Composite Message nodes
that do not have any subnodes of themselves. Therefore, the Add method
will remain unimplemented (i.e. will do nothing) for Leaf nodes.

Subclasses usually contain one basic type value, so you get
BoolMessage, LongMessage etc subclasses to this class.

Note that LeafMessage is an abstract class, and does not implement
any functions itself.
*/
class LeafMessage : public CompositeMessage
{
public:
LeafMessage(MessageType type);
~LeafMessage(void);

// Compresses the local data into a Compressor.
virtual void Compress(Compressor&amp; data) const;

// Extracts data from the Decompressor and stores it in a local value
virtual bool Decompress(Decompressor&amp; data);

// Stores locally stored data into the given Visitor object.
virtual void Visit(Visitor * visitor) const;

// Extracts data from the Visitor object and stores it locally.
virtual void FillVisit(Visitor * visitor);
};

/*
The ComposedMessage class is a class that can be used
to compose more comples messages. It implements the Add,
Compress, Decompress, Visit and FillVisit methods,
each of which will traverse the array of subnodes
also defined in this class.

Subclasses that implement these four classes should all,
at one point, call this class's implementations. This can
be done either before or after doing their own thing.
*/
class ComposedMessage : public CompositeMessage
{
private:
Array subnodes;
public:
ComposedMessage(MessageType type);
~ComposedMessage(void);

// Adds the passed CompositeMessage, which can either be a leaf or another ComposedMessage,
// to the list of subnodes.
void Add(CompositeMessage * subnode);

// Will iterate through all subnodes and pass the Compressor object to each
// subnode's Compress method.
void Compress(Compressor&amp; data) const;

// Will iterate through all subnodes and pass the Decompressor object to each
// subnode's Deompress method.
bool Decompress(Decompressor&amp; data);

// Will iterate through all subnodes and pass the Visitor object to each
// subnode's Visit method.
void Visit(Visitor * visitor) const;

// Will iterate through all subnodes and pass the Visitor object to each
// subnode's FillVisit method.
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store a boolean value.
*/
class BoolMessage : public LeafMessage
{
private:
bool value;
public:
BoolMessage(MessageType type, bool val = false);
BoolMessage(bool val = false);
~BoolMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor* visitor);
};

/*
Leaf Message type used to store a long value.
*/
class LongMessage : public LeafMessage
{
private:
long value;
public:
LongMessage(long val = 0L);
LongMessage(MessageType type, long val = 0L);
~LongMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store an unsigned long value.
*/
class UnsignedLongMessage : public LeafMessage
{
private:
unsigned long value;
public:
UnsignedLongMessage(unsigned long val = 0L);
UnsignedLongMessage(MessageType type, unsigned long val);
~UnsignedLongMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store a long64 value. (see C4Types.h for long64 info)
*/
class Long64Message : public LeafMessage
{
private:
long64 value;
public:
Long64Message(long64 val = 0L);
Long64Message(MessageType type, long64 val = 0L);
~Long64Message(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store an ulong64 (unsigned long64) value. (see C4Types.h for ulong64 info)
*/
class UnsignedLong64Message : public LeafMessage
{
private:
ulong64 value;
public:
UnsignedLong64Message(ulong64 val = 0L);
UnsignedLong64Message(MessageType type, ulong64 val = 0L);
~UnsignedLong64Message(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store a char value.
*/
class CharMessage : public LeafMessage
{
private:
char value;
public:
CharMessage(char val = ' ');
CharMessage(MessageType type, char val);
~CharMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store an unsigned char value.
*/
class UnsignedCharMessage : public LeafMessage
{
private:
unsigned char value;
public:
UnsignedCharMessage(unsigned char val = ' ');
UnsignedCharMessage(MessageType type, unsigned char val = ' ');
~UnsignedCharMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store a string (or char pointer / array) value.
See also C4String.h.
*/
class StringMessage : public LeafMessage
{
private:
String value;
public:
StringMessage(const char * val = "");
StringMessage(MessageType type, const char * val = "");
~StringMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store a short value.
*/
class ShortMessage : public LeafMessage
{
private:
short value;
public:
ShortMessage(short val = 0);
ShortMessage(MessageType type, short val = 0);
~ShortMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store an unsigned short value.
*/
class UnsignedShortMessage : public LeafMessage
{
private:
unsigned short value;
public:
UnsignedShortMessage(unsigned short val = 0);
UnsignedShortMessage(MessageType type, unsigned short val = 0);
~UnsignedShortMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
Leaf Message type used to store a float value.
*/
class FloatMessage : public LeafMessage
{
private:
float value;
public:
FloatMessage(float val = 0.0F);
FloatMessage(MessageType type, float val = 0.0F);
~FloatMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};

/*
The MessageTypeManager class is a supportive class for the Composite Message system,
and defines / can define a list of factory methods that assemble a Composite Message.

Optionally, parameters can be passed to the factory method of each message type,
which contain the data to be assigned to the nodes of the composed message.
However, keep in mind that empty composed messages should also be created,
for when a Message is received but not decompressed yet.

I've only put a few examples in this class, cba to do all current message types.
There's a description of each message type in their implementations, see the .cpp file
for information and usage etc.

In the examples put into those comments, pay particular attention to the lack of casts
to a specific message type. All messages, when received, are cast into a CompositeMessage
type - none of the underlying classes are ever directly used by a client.

In a system where all Messages have been replaced by CompositeMessages, a ReceiveMessage
method would only have to do a single cast at the top of the method, from C4's Message
to this CompositeMessage type. A massive reduction in casts is a result, and a result from
that is more reliable and type-safe code.
*/
class MessageTypeManager
{
public:
static CompositeMessage * GetServerInfoMessage(long playerCount = 0L, long maxPlayerCount = 0L, String gameName = "", ResourceName worldName = "");
static CompositeMessage * GetGameInfoMessage(unsigned long flags = 0L, ResourceName world = "");
static CompositeMessage * GetUpdateScoreMessage(long playerScore = 0L);
static CompositeMessage * GetUpdateHealthMessage(long playerHealth = 0L);
static CompositeMessage * GetClientOrientationMessage(float azimuth = 0.0F, float altitude = 0.0F);
};

}

#endif

CompositeMessage.cpp
#include "CompositeMessage.h"

#include "MGMultiplayer.h" // message types

using namespace C4;

Visitor::Visitor()
{
// set all 'current X value' indicator to 0.
currentLongValue = 0L;
currentUnsignedLongValue = 0L;
currentBoolValue = 0L;
currentFloatValue = 0L;
currentStringValue = 0L;
currentCharValue = 0L;
currentUnsignedCharValue = 0L;
currentShortValue = 0L;
currentUnsignedShortValue = 0L;
currentLong64Value = 0L;
currentUnsignedLong64Value = 0L;
}

Visitor::~Visitor()
{
}

// Adds a long value to the array.
void Visitor::AddLongValue(long value)
{
longValues.AddElement(value);
}

// Gets a long value from the array, or 0 if the array will exceed its bounds.
long Visitor::GetLongValue(void)
{
if (currentLongValue &gt;= longValues.GetElementCount())
return 0;
else
return (longValues[currentLongValue++]);
}

// Adds an unsigned long value to the array.
void Visitor::AddUnsignedLongValue(unsigned long value){
unsignedLongValues.AddElement(value);
}

// Gets an unsigned long value from the array, or 0 if the array will exceed its bounds.
unsigned long Visitor::GetUnsignedLongValue(void){
if (currentUnsignedLongValue &gt;= unsignedLongValues.GetElementCount())
return 0;
else
return (unsignedLongValues[currentUnsignedLongValue++]);
}

void Visitor::AddBoolValue(bool value){
boolValues.AddElement(value);
}

bool Visitor::GetBoolValue(void){
if (currentBoolValue &gt;= boolValues.GetElementCount())
return false;
else
return (boolValues[currentBoolValue++]);
}

void Visitor::AddFloatValue(float value){
floatValues.AddElement(value);
}

float Visitor::GetFloatValue(void){
if (currentFloatValue &gt;= floatValues.GetElementCount())
return false;
else
return (floatValues[currentFloatValue++]);
}

void Visitor::AddStringValue(const char * value){
stringValues.AddElement(value);
}

const char * Visitor::GetStringValue(void){
if (currentStringValue &gt;= stringValues.GetElementCount())
return "";
else
return (stringValues[currentStringValue++]);
}

void Visitor::AddCharValue(char value){
charValues.AddElement(value);
}

char Visitor::GetCharValue(void){
if (currentCharValue &gt;= charValues.GetElementCount())
return ' ';
else
return (charValues[currentCharValue++]);
}

void Visitor::AddUnsignedCharValue(unsigned char value){
unsignedCharValues.AddElement(value);
}

unsigned char Visitor::GetUnsignedCharValue(void){
if (currentUnsignedCharValue &gt;= charValues.GetElementCount())
return ' ';
else
return (unsignedCharValues[currentUnsignedCharValue++]);
}

void Visitor::AddShortValue(short value){
shortValues.AddElement(value);
}

short Visitor::GetShortValue(void){
if (currentShortValue &gt;= shortValues.GetElementCount())
return 0;
else
return (shortValues[currentShortValue++]);
}

void Visitor::AddUnsignedShortValue(unsigned short value){
unsignedShortValues.AddElement(value);
}

unsigned short Visitor::GetUnsignedShortValue(void){
if (currentUnsignedShortValue &gt;= unsignedShortValues.GetElementCount())
return 0;
else
return (unsignedShortValues[currentUnsignedShortValue++]);
}

void Visitor::AddLong64Value(long64 value){
long64Values.AddElement(value);
}

long64 Visitor::GetLong64Value(void)
{
if (currentLong64Value &gt;= long64Values.GetElementCount())
return 0;
else
return (long64Values[currentLong64Value++]);
}

void Visitor::AddUnsignedLong64Value(ulong64 value){
unsignedLong64Values.AddElement(value);
}

ulong64 Visitor::GetUnsignedLong64Value(void){
if (currentUnsignedLong64Value &gt;= unsignedLong64Values.GetElementCount())
return 0;
else
return (unsignedLong64Values[currentUnsignedLong64Value++]);
}

// Compsite Message implementation.

// Constructor calls the parent constructor, passing the type parameter.
CompositeMessage::CompositeMessage(MessageType type) : Message(type){}

CompositeMessage::~CompositeMessage(void){}

void CompositeMessage::Compress(Compressor &amp;data) const{}

bool CompositeMessage::Decompress(Decompressor &amp;data) {return true;}

void CompositeMessage::Add(CompositeMessage * subnode) {}

void CompositeMessage::Visit(C4::Visitor * visitor) const {}

void CompositeMessage::FillVisit(C4::Visitor * visitor){}

/*
Creates a Visitor object and passes it to the Visit method, which
is implemented differently depending on what subclass of CompositeMessage
is currently used. When passed, the Visitor is returned.
*/
Visitor * CompositeMessage::GetData(void) const {
Visitor * visitor = new Visitor();
Visit(visitor);
return visitor;
}

// LeafMessage constructor, calls the parent CompositeMessage constructor
// passing the type parameter to it.
LeafMessage::LeafMessage(MessageType type) : CompositeMessage(type){}

LeafMessage::~LeafMessage(void){}

void LeafMessage::Compress(Compressor&amp; data) const {}

bool LeafMessage::Decompress(Decompressor&amp; data) {return true;}

void LeafMessage::Visit(Visitor * visitor) const {}

void LeafMessage::FillVisit(Visitor * visitor) {}

/*
ComposedMessage implementation.
*/
ComposedMessage::ComposedMessage(MessageType type) : CompositeMessage(type) {}

// deletes all the subnodes (if any) recursively.
ComposedMessage::~ComposedMessage(void)
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a]) delete subnodes[a];
}
}

// Adds the given element to the subnode array.
void ComposedMessage::Add(CompositeMessage * subnode)
{
subnodes.AddElement(subnode);
}

// Passes the Compressor to all subnodes' Compress methods.
void ComposedMessage::Compress(Compressor&amp; data) const
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a]) subnodes[a]-&gt;Compress(data);
}
}

// Passes the Decompressor to all subnodes' Decompress methods.
bool ComposedMessage::Decompress(Decompressor &amp;data)
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a])
{
if (!(subnodes[a]-&gt;Decompress(data)))
return false;
}
}
return true;
}

// Passes the Visitor object to all subnodes' Visit methods.
void ComposedMessage::Visit(Visitor * visitor) const
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a])
subnodes[a]-&gt;Visit(visitor);
}
}

// Passes the Visitor object to all subnodes' FillVisit methods.
void ComposedMessage::FillVisit(Visitor *visitor)
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a])
subnodes[a]-&gt;FillVisit(visitor);
}
}

/*
BoolMessage implementation
*/
BoolMessage::BoolMessage(bool val) : LeafMessage(kMessageBool)
{
value = val;
}

BoolMessage::BoolMessage(MessageType type, bool val) : LeafMessage(type)
{
value = val;
}

BoolMessage::~BoolMessage(void) {}

void BoolMessage::Compress(Compressor&amp; data) const
{
data &lt;&lt; value;
}

bool BoolMessage::Decompress(Decompressor&amp; data)
{
data &gt;&gt; value;
return (true);
}

void BoolMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddBoolValue(value);
}

void BoolMessage::FillVisit(Visitor *visitor)
{
value = visitor-&gt;GetBoolValue();
}

/*
LongMessage implementation
*/
LongMessage::LongMessage(long val) : LeafMessage(kMessageLong)
{
value = val;
}

LongMessage::LongMessage(MessageType type, long val) : LeafMessage(type)
{
value = val;
}

LongMessage::~LongMessage(void) {}

void LongMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool LongMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void LongMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddLongValue(value);
}

void LongMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetLongValue();
}

/*
UnsignedLongMessage implementation
*/
UnsignedLongMessage::UnsignedLongMessage(unsigned long val) : LeafMessage(kMessageUnsignedLong)
{
value = val;
}

UnsignedLongMessage::UnsignedLongMessage(unsigned long val, MessageType type) : LeafMessage(type)
{
value = val;
}

UnsignedLongMessage::~UnsignedLongMessage(void) {}

void UnsignedLongMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool UnsignedLongMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void UnsignedLongMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedLongValue(value);
}

void UnsignedLongMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedLongValue();
}

/*
Long64Message implementation
*/
Long64Message::Long64Message(long64 val) : LeafMessage(kMessageLong64)
{
value = val;
}

Long64Message::Long64Message(MessageType type, long64 val) : LeafMessage(type)
{
value = val;
}

Long64Message::~Long64Message(void) {}

void Long64Message::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool Long64Message::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void Long64Message::Visit(Visitor * visitor) const
{
visitor-&gt;AddLong64Value(value);
}

void Long64Message::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetLong64Value();
}

/*
UnsignedLong64Message implementation
*/
UnsignedLong64Message::UnsignedLong64Message(ulong64 val) : LeafMessage(kMessageUnsignedLong64)
{
value = val;
}

UnsignedLong64Message::UnsignedLong64Message(MessageType type, ulong64 val) : LeafMessage(type)
{
value = val;
}

UnsignedLong64Message::~UnsignedLong64Message(void) {}

void UnsignedLong64Message::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool UnsignedLong64Message::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void UnsignedLong64Message::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedLong64Value(value);
}

void UnsignedLong64Message::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedLong64Value();
}

/*
CharMessage implementation
*/

CharMessage::CharMessage(char val) : LeafMessage(kMessageChar)
{
value = val;
}

CharMessage::CharMessage(MessageType type, char val) : LeafMessage(type)
{
value = val;
}

CharMessage::~CharMessage(void) {}

void CharMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool CharMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void CharMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddCharValue(value);
}

void CharMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetCharValue();
}

/*
UnsignedCharMessage implementation
*/
UnsignedCharMessage::UnsignedCharMessage(unsigned char val) : LeafMessage(kMessageUnsignedChar)
{
value = val;
}

UnsignedCharMessage::UnsignedCharMessage(MessageType type, unsigned char val) : LeafMessage(type)
{
value = val;
}

UnsignedCharMessage::~UnsignedCharMessage(void) {}

void UnsignedCharMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool UnsignedCharMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void UnsignedCharMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedCharValue(value);
}

void UnsignedCharMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedCharValue();
}

/*
StringMessage implementation
*/
StringMessage::StringMessage(const char *val) : LeafMessage(kMessageString)
{
value = val;
}

StringMessage::StringMessage(MessageType type, const char *val) : LeafMessage(type)
{
value = val;
}

StringMessage::~StringMessage(void) {}

void StringMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool StringMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void StringMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddStringValue(value);
}

void StringMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetStringValue();
}

/*
ShortMessage implementation
*/
ShortMessage::ShortMessage(short val) : LeafMessage(kMessageShort)
{
value = val;
}

ShortMessage::ShortMessage(MessageType type, short val) : LeafMessage(type)
{
value = val;
}

ShortMessage::~ShortMessage(void) {}

void ShortMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool ShortMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void ShortMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddShortValue(value);
}

void ShortMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetShortValue();
}

/*
UnsignedShortMessage implementation
*/
UnsignedShortMessage::UnsignedShortMessage(unsigned short val) : LeafMessage(kMessageUnsignedShort)
{
value = val;
}

UnsignedShortMessage::UnsignedShortMessage(MessageType type, unsigned short val) : LeafMessage(type)
{
value = val;
}

UnsignedShortMessage::~UnsignedShortMessage(void) {}

void UnsignedShortMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool UnsignedShortMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void UnsignedShortMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedShortValue(value);
}

void UnsignedShortMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedShortValue();
}

/*
FloatMessage implementation
*/
FloatMessage::FloatMessage(float val) : LeafMessage(kMessageFloat)
{
value = val;
}

FloatMessage::FloatMessage(MessageType type, float val) : LeafMessage(type)
{
value = val;
}

FloatMessage::~FloatMessage(void) {}

void FloatMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}

bool FloatMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}

void FloatMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddFloatValue(value);
}

void FloatMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetFloatValue();
}

/*
Creates and returns a CompositeMessage containing two long values and two string values.
Usage:

Creating new filled ServerInfoMessage composite message:

// parameters are all the params you want to send.
CompositeMessage * message = MessageTypeManager::GetServerInfoMessage(playerCount, maxPlayerCount, gameName, worldName);
TheMessageMgr-&gt;SendMessage(addressee, *message);
// (note that there should be a star in front of the 'message' param in the sendmessage method, since the
// GetServerInfoMessage method returns a pointer to the message, whereas the SendMessage method expects
// a reference instead.

// Also, the message should probably be deleted after this, but I dunno if the message is sent right
// away or stored in a cache for a while, which could lead to unexpected results if the message is deleted.

Receiving incoming ServerInfoMessage composite message type:

CompositeMessage * msg = static_cast(message);
Visitor * v = msg-&gt;GetData();

long playerCount = v-&gt;GetLongValue();
long maxPlayerCount = v-&gt;GetLongValue();
String gameName = v-&gt;GetStringValue();
ResourceName worldName = v-&gt;GetStringValue();

// note that the order of inserting and extracting data of the same type should be the same on both
// the sending and receiving side.
*/
CompositeMessage * MessageTypeManager::GetServerInfoMessage(long playerCount, long maxPlayerCount, String gameName, ResourceName worldName)
{
CompositeMessage * message = new ComposedMessage(kMessageServerInfo);
message-&gt;Add(new LongMessage(playerCount));
message-&gt;Add(new LongMessage(maxPlayerCount));
message-&gt;Add(new StringMessage(gameName));
message-&gt;Add(new StringMessage(worldName));
return message;
}

/*
Creates and returns a GameInfoMessage composite message type, containing an unsigned long and a string value.

Usage:

CompositeMessage * message = MessageTypeManager::GetGameInfoMessage(multiplayerFlags, worldName);
TheMessageMgr-&gt;SendMessage(addressee, *message);

// extracting

CompositeMessage * msg = static_cast(message);
Visitor * v = msg-&gt;GetData();

unsigned long flags = v-&gt;GetUnsignedLongValue();
ResourceName world = v-&gt;GetStringValue();
*/
CompositeMessage * MessageTypeManager::GetGameInfoMessage(unsigned long flags, ResourceName world)
{
CompositeMessage * message = new ComposedMessage(kMessageGameInfo);
message-&gt;Add(new UnsignedLongMessage(flags));
message-&gt;Add(new StringMessage(world));
return message;
}

/*
Creates and returns an UpdateScoreMessage, which contains a single Long value.
Notice that in this case, a LongMessage is returned directly without first having
to put it into a ComposedMessage - the advantage of using a proper abstract class.
Receiving parties will just treat it like any other CompositeMessage, as in,
they won't be able nor will they have to see the difference between the two.

Usage:

// send
TheMessageMgr-&gt;SendMessage(addressee, *MessageTypeManager::GetUpdateScoreMessage(playerScore));

// receive

long score = static_cast(message)-&gt;GetData()-&gt;GetLongValue();
*/
CompositeMessage * MessageTypeManager::GetUpdateScoreMessage(long playerScore)
{
return (new LongMessage(kMessageUpdateScore, playerScore));
}

/*
Creates and returns a new UpdateHealthMessage, which has the same structure of
GetUpdateScoreMessage. The only difference between the two is the message identification
number. We could make the two even simpler, by defining and implementing a
CreateLongMessage method, which takes a message identifier and an initial value,
and returns a LongMessage with that value. GetUpdateHealthMessage and GetUpdateScoreMessage
could then both call and return the return value of that GetLongMessage method, passing
their own message type identifier to the method. We won't do that in here though,
to keep things straightforward for now.

Usage:

// send
TheMessageMgr-&gt;SendMessage(addressee, *MessageTypeManager::GetUpdateHealthMessage(playerHealth));

// receive

long playerHealth = static_cast(message)-&gt;GetData()-&gt;GetLongValue();

*/
CompositeMessage * MessageTypeManager::GetUpdateHealthMessage(long playerHealth)
{
return new LongMessage(kMessageUpdateHealth, playerHealth);
}

/*
Creates and returns a ClientOrientation CompositeMessage, which contains two float values.

Usage:

Send:
TheMessageMgr-&gt;SendMessage(addressee, MessageTypeManager::GetClientOrientationMessage(azimuth, altitude));

Receive:

Visitor * v = static_cast(message)-&gt;GetData();
float azimuth = v-&gt;GetFloatValue();
float altitude = v-&gt;GetFloatValue();

*/
CompositeMessage * MessageTypeManager::GetClientOrientationMessage(float azimuth, float altitude)
{
CompositeMessage * message = new ComposedMessage(kMessageClientOrientation);
message-&gt;Add(new FloatMessage(azimuth));
message-&gt;Add(new FloatMessage(altitude));
return message;
}
</div></summary>
  </entry>

  <entry>
    <title>The C4 Engine</title>
    <link href="http://greatjustice.info/?p=25"/>
    <id>http://yoursite/article/?i=55bc125548a3d339ba7347f7d37ae2ed</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=25</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">During the last 20 weeks (February to June &#8216;08), I and 7 other people have been working on a game project (both for university points and for this online group of dudes that started the creation of this particular game), 2 of them programmers, 5 of them artsy fags media students (who did models, textures, sketches, sound/music etc).
The game itself is a sci-fi tactical first person shooter (well, it&#8217;s supposed to be in a distant future, olz), which was basically in a half-assed concept stage for about a year or two, during which some very nice concept art drawings were made, but nothing concrete was made, such as actual game design (i.e. functional design) or background story.
The project was eventually put forward to our university as a project for the Game Design minor, and since then, we&#8217;ve been working on it for the last 20 weeks. In this post, I won&#8217;t go into detail about the project itself, but more into the 3D engine that was used: The C4 engine. 
About
The C4 Engine is written and maintained by Eric Lengyel, a mathematician slash application developer, who&#8217;s worked on the technologies behind several games, including several PS3 titles (although no actual names are given). He&#8217;s also written some or contributed to some books, including Mathematics for 3D Game Programming And Computer Graphics, so he bascially knows what he&#8217;s talking about.
C4&#8217;s got a load of features, including all the basic graphics capabilities one would want for a game, as well as a built-in world editor, graphical script editor, etc. The next version, 149, which is out now for licensed users, has a greatly improved graphical script editor, with conditionals and variables and whatnot (it didn&#8217;t have those earlier). Version 1.5, to be released late August if everything&#8217;s right, will come with a terrain editor and large outdoor terrain support (as in, the current version is mainly suitable for indoor or &#8216;roomed&#8217; environments, which can be divided into so-called zones, which are used to determine what has to be rendered etc).
For more info on C4&#8217;s features, look here.
The C4 engine is aimed at both professional users and &#8216;indie&#8217; game developers (independent, hobbyists, students etc). For both types, a license can be aquired. The indie category, such as we are, can get a license for as low as $200.-, which gives the licensee a lifetime license (= free updates to later versions), and allows 5 people to work on the engine and the engine&#8217;s code. However, this license type will be updated when version 1.5 (150) is released, and will be upped to $350,- accoring to the C4 website.&#160; The engine is supplied as both the executables, plugins and, something unique, the full source code to both the engine and the demo game. That means that programmers can edit or add features to the engine itself, and get a deeper insight into the workings of the engine by reading its code.  According to the C4 engine&#8217;s website, some large corporations (such as Lockheed Martin) and universities have taken licenses for the C4 engine.

Screenshots
Let&#8217;s goan see some screenshots from the current demo game which, by the way, doesn&#8217;t show off the full potential of the demo game. The full-sized screenshots can be viewed here.

This first image shows a basic piece of a level with a so-called cube light, a light that basically projects a texture 360 degrees around it. In this case, it projects the insides of a lantern.

This next image displays a scene from the Cemetery level, a relatively new demo level. This particular screenshot displays an imported terrain (not using the terrain editor yet btw, just the height map import option), with a fog layer on top of it. The fog&#8217;s fully configureable, so you can set the height at which it starts, the color, the density, etc.
A feature not shown in this screenshot is the lightning effect, which lights up the entire level and plays thunder sounds and such. Once again, this isn&#8217;t a level that&#8217;s graphically the most impressive, just a limited feature showcase - see some of the screenshots for other games made with C4 for better examples.
The Ravensword game screenshots shows how good proper normal maps can look (normal map is a texture that contains height information, which is used to calculate shadows on the object itself, which translates to a perception of depth and detail). The screenshots for World of Subways (yes, a subway simulator game) look in roughly the same style as Half-Life 2, only more realistic (and with less zombies).

The above screenshot is taken from the primary demo level, and shows imported terrain for the overall layout of the land, a waterfall effect (made with C4&#8217;s particle system), water itself (which uses animated textures and portals for reflection / refraction, see also this tutorial on C4&#8217;s wiki on how the water effect was made.) , etcetera.

This next screenshot is of C4&#8217;s built-in world editor, which allows people to make their own worlds. On the left side is a menu bar, which contains all the tools a world editor can use. The pane next to that is the Scene Graph, a graphical representation of the internal structure of a world editor. A root node, the Infinite Zone, contains a handful of subnodes, such as geometries, light sources, etcetera, which in turn can contain several subnodes as well.

The above is a screenshot of C4&#8217;s graphical script editor, I&#8217;m fairly sure this is the old (or current) version. Version 149 of the engine, to be released soon, contains additional features that could, once fully developed, allow non-programmers to program the behavior of an NPC, for example.

Experiences
Anyways, this was supposed to be more of a review and experiences with the C4 engine, but eh, it&#8217;ll need a good intro in order for people to sorta know what we&#8217;re talking about.
We&#8217;ve spent a good 20 weeks on our project, half of which was spent designing our game and exploring the C4 engine. We played around and made some basic worlds with the world editor, dived into the demo game&#8217;s code and edited some stuff, added a weapon by following a tutorial, etcetera.
It was pretty daunting to begin with for several reasons:

A new language. Up until this project, all 3 of us (we had 3 programmers in our group) had little to no experience programming in C++ - I myself had done a fractal generator largely copied from the internets during a 2-week period. So with the C4 engine (which is written in C++, in case you didn&#8217;t realize that by now), we encountered new, unexplored problems like pointers and such. Scary.
A new environment. The C4 engine&#8217;s quite different from the Java libraries and such I&#8217;ve used before this, with a lot of tricks and such. For example, a lot of binary flags are used - basically a means of storing a large amount of boolean data into a single variable. But that was all learnable.
Poorly designed demo game. The engine itself is designed properly, but the demo game&#8217;s code looks as if it was programmed in some free saturday afternoons. There&#8217;s 500-lined functions containing large switch-statements which contain logic for pretty much all components for the demo game, to name an example. More on that later.
Lack of commenting / documentation. The C4 engine&#8217;s code itself is reasonably documented (it&#8217;s not entirely complete and in a format that basically forces you to view the online version), &#160;but the demo game itself isn&#8217;t. There are some scarce one or two-lined comments in particular bits of code, but not by far complete. So in order to understand the inner workings of the demo game, we had to dive into the code itself and work according to some of the tutorials on the C4 wiki.  But after some time, we got the hang of it and knew enough of both the engine and the demo game&#8217;s code to add most of the features we wanted.

We added our own weapons (a handgun and an assault rifle), some of our own models (not all, which is why we didn&#8217;t get all the points for the end-product), animations (and animation control), sounds, and our own special features - distraction grenades, one that generated a &#8216;hologram&#8217;, one that played a sound, and one that displayed a flashing light pattern (which is supposed to look like gunfire). All three configureable by the player (by using an in-game selection menu), etc. They were all fired by the C4 demo game&#8217;s grenade launcher, but it&#8217;s the idea that counts.
We also added teams to the players (a multiplayer mode was already available), 3 game modes, and did some refactorings by splitting up some of the classes into their own files (a habit from Java, counteracted by the habit of whoever wrote the demo game to put loads of similar classes into a single file).  The end result was a game that displayed most of the features we had planned, but didn&#8217;t look as good and looked basically only half-finished, due to the lack of models and the levels being only half-finished. But I myself got most points, mainly due to programming.
Anyways, the C4 engine left a very good overall impression on me. I haven&#8217;t had any experience with other game engines (that is, unless you count ZZT as being a game engine), but those that do think that C4&#8217;s the most awesome and well thought-out engines they&#8217;ve encountered so far. The engine itself is very rich in features without looking cluttered or bloated, and is still in full development, a new version with new features being released every month or so. We started when the engine was at version 147, and when we were done, version 149 beta 2 was out. A few days ago, the final version of 149 was released, along with a new demo including new demo levels and everything.
Criticisms
The majority of criticisms we as programmers had on the engine was all in its demo game and the documentation. The code-level documentation is allright (see above), but in terms of &#8216;how do you do so-and-so&#8217;, it&#8217;s still lacking. For example, halfway our project I wanted to find out how the C4 networking system worked. At that time, the only documentation avaiable was an article on the C4 wiki, highlighting the basic assumptions and workings of the network and messaging system, and the API documentation itself on the messages and message manager, which sends and handles messages, as well as the network manager, which operates on a lower level.
So because of that, we were bascially forced to figure it all our on ourselves, mainly trying to get as much information as possible from the API documentation and the code found in the demo game. Because we didn&#8217;t want others to have the same problem (and spend as much time on solving it), we (read: I) wrote a two-part tutorial on C4&#8217;s messaging system, in which a basic chat application is made. You can find that tutorial right here, and part two here.
But yeah, not everything is as of yet documented and explained. There&#8217;s enough to get you going, but it&#8217;s just not all there yet.
The second major problem was the lack of design in the demo game. There&#8217;s at least a dozen examples to think of, but it&#8217;s kinda bollox to have to repeat them all here. I can do one example though, the weapon system in the demo game. According to the tutorial on the C4 wiki on adding a weapon to the demo game, &#160;a programmer has to add two files to the project, and edit 12 (!) files to add it to the game. These files handle firing, selecting, picking up, ammo etc of the weapon. But the problem is that it&#8217;s so divided, it&#8217;s difficult to figure all that out on your own without the use of a tutorial. Not only that, but the weapon system is decentralized, or, to put it more bluntly, all over the place. There are .h and .cpp files for each type of weapon, but they don&#8217;t contain anything related to the weapon itself, only to the projectile fired by the weapon (if any). Firing the weapon happens in a very large method in the Fighter class, a controller for the player&#8217;s model, which is called each frame, checks if a timer has run down to 0, then checks what weapon is currently selected, re-sets the timer and calls a function that informs everyone that a projectile has been fired, which in turn generates a projectile and moves it every frame.
But that&#8217;s not how you&#8217;d want things to happen. You&#8217;d want each weapon to have its own files, and its own responsibilities. &#160;You don&#8217;t want a fixed number somewhere in a very large method in the Fighter class to determine how fast a weapon fires, you want it to occur in the weapon&#8217;s file itself, and make it dynamic even if you think that&#8217;ll add something to your game or if you just want to tweak it.
And that&#8217;s just one example, there were at least 3 more specific modules of the demo game that were just designed&#8230; well, wrong. They worked fine, so functionally they were good, but their design was just awful (imo), everything was fixed at compile-time, loads of functionality was crammed into a single method, loads of responsibility into a single class, and so forth.
We didn&#8217;t have the time during our project to fix all this, so instead we (read: I) made a document in which the game&#8217;s modules are described, the problems occuring in those highlighted, and one or more solutions described and explained. I firstly put that up for assessment by the teachers (one for the techical design, the other for Written English), then offered it to the licensees and author of the C4 engine. So far, only two or three licensees have commented on it (both whom I doubt understand even half of what&#8217;s in there), and the author is yet to comment on it. He&#8217;s probably busy with the next version of the engine though, so I won&#8217;t blame him.
I&#8217;ve put the refactoring proposal online for your reading pleasure, maybe you can learn something from it. As I said on the forums when I posted it, any C&amp;C on it is welcome. Here&#8217;s the file:
Office 2007 version: Refactoring Proposal
Office 1997-2003 version: &#160;Refactoring Proposal
It&#8217;s also an attempt at applying some design patterns, including the Composite, Visitor, Factory Method, and Prototype patterns. I&#8217;m sure that more patterns and refactorings can be applied to the demo game&#8217;s code, but the components described in the document should give a very good head start (if I say so myself, /smug). That, and if done right, could inspire others as well.
Currently, I&#8217;m finishing up on our project, and in order to get the last few points I&#8217;ve started to implement at least some of the refactorings proposed in the document into the C4 demo game, and publishing those refactorings on the forums. I probably won&#8217;t spend a lot of time on that anymore, since I haven&#8217;t had much feedback on the proposals, least of all from the author himself (i.e. the dude that actually matters). I even sent him a PM about the matter, but I&#8217;ve received no feedback whatsoever. Either he hasn&#8217;t gotten to it, or he&#8217;s just ignoring the whole thing - I&#8217;m suspecting the latter, and I don&#8217;t like it. But eh, it&#8217;s his product, and as such, his problem.
Conclusion
But, outside of the (in my opinion) poor design of the demo game, the C4 engine is pretty good. As said, I have no experience with other graphics engines, so I&#8217;m unable to provide a proper comparison, but from what I&#8217;ve seen of the C4 engine, its features, its relatively low price and all that, I&#8217;m impressed. It has pretty much everything anyone needs making a 3D video game, and the features it doesn&#8217;t have will be added in the coming versions. As I probably said in the beginning of this article, version 1.5 will add a terrain editor to the engine. I dunno how advanced it will be, but from what the author says about it, it&#8217;ll be technically quite impressive. (note that the author of the engine isn&#8217;t the first poster in the linked thread, but the dude with the red username etc).
All in all, I think that from a bang-for-buck point of view, the C4 engine is the best engine any beginning game developer can buy. For inexperienced or unmotivated programmers it may have a steep learning curve (mainly due to the poor design of the demo game - it&#8217;s all in there, but it&#8217;s hard to get it out), but it&#8217;ll be well worth it. I only wish the demo game had a better design, &#8217;cause right now it&#8217;s putting people off. Not as much as they&#8217;ve been put off by other affordable engines (judging by some of the forum posts by previous users of said engines), but still.</div></summary>
  </entry>

  <entry>
    <title>University versus self-taught</title>
    <link href="http://greatjustice.info/?p=24"/>
    <id>http://yoursite/article/?i=687fb7a5a0d7f1237d8901b3831ec98e</id>
    <updated>2009-09-04T20:00:50-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=24</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A topic I&#8217;ve been thinking about for quite some time now. If I was an employer, looking for an employee, which would I take: The type that basically self-taught himself programming through reading books and/or websites, or the type that spend an X amount of years at university and has a bachelor&#8217;s or master&#8217;s degree? Let&#8217;s assume that, when they apply, they both have roughly the same amount of knowledge and/or skill.
I&#8217;ll unveil it right now: I&#8217;d totally go for the one that went to university and got a degree. Why? I&#8217;ll explain (or, attempt to.) Read the rest of this post for a wider view of my opinion, as well as a massive edit written when this post got a relatively large amount of attention quite suddenly and unsuspectingly.

When someone both went to university and, more importantly, actually finished it, you&#8217;ll know that he has certain properties to himself. First, you&#8217;ll know that he&#8217;s persistent, in that he&#8217;s spent 4 or 6 years (or, he would in my country) learning a job, even though he didn&#8217;t like some parts of it. A self-educated programmer would more likely have stuck to only the languages and projects he himself liked. Over here, a student would have to perform various assignments in university, and some of them spanning multiple disciplines. I somehow doubt a self-educated programmer would be working on programming both a microprocessor and a (Java) control program for a remote-controlled model boat, at least not unless he had a particular interest in that area.
In university, you&#8217;re pretty much forced to perform a wide range of projects, spanning multiple disciplines, languages, areas, and forcing the student to work together with people of different environments - for example, electronical engineers, 3D modelers, structural engineers, etcetera. I do not believe that most self-taught programmers would have such a background. Instead, I&#8217;d expect them to remain in their own safe zone - PHP webapplications, C/C++ apps for an open source project or operating system, or .NET hobby-applications for, say, maintaining an address book - you name it.
I don&#8217;t actually know any self-taught programmers, mind, so feel free to prove me wrong. I&#8217;m confident that there&#8217;s numerous self-taught programmers that have a much wider range of software engineering interests than I can think of.
But yeah. University graduates would have several points above self-taught programmers, since they&#8217;ve been through a system, they&#8217;ve persisted in doing tasks they, most likely, didn&#8217;t really want to do. I had to work on completely unrelated projects like designing / describing an environmentally friendly house, which was more concentrated on structural engineering and whatnot than programming. But because of that, and other projects, I know (read: have a general idea) what goes on in those areas. I know what it takes to write a program at the very lowest levels of the system (well, not THAT low, considering we still could use C), where you&#8217;d only have 300~something bytes of memory available to do everything in.
Anyways, to conclude this post, I believe that a self-taught programmer does not have the persistence, organizational skills, multi-disciplinary development, and finally the proof of his ability (i.e. a piece of paper saying he&#8217;s finished an education) to be as desirable for a company as self-taught one is, some exceptions left aside.
Massive edit
Whoa, stepped on quite some toes here it seems, never thought my blog would draw so much attention. Guess linking to other blogs draws massive attention. That, and having the author of said blog directly link to this post. Let&#8217;s comment on some of the comments here.
First, I&#8217;m not (entirely) trying to say that the self-taught programmers are incompetent - the example of Bill Gates et al was raised, one that I agree with, since he and everyone else that started the whole science were pretty much all self-taught, in a time before degrees.
As for hiring people, the degree does, indeed, not mean anything when it comes to actual knowledge or experience - I&#8217;m actually still in university, and the people I work with&#8230; well, aren&#8217;t that awesome, in most cases. However, and this is one point I have, last year I worked with a handful of people that came along with my previous education (a system administrator education thingy), and to put it short, they were terrible. Lucky for me (since they&#8217;d most likely cling to me so I could do their job), they failed the second year and probably won&#8217;t finish the education.
Which is one of the points I was trying to get at while (hastily) writing this post: An education filters out most of the bad ones (some exceptions there), so you know that someone who finished an education has at least a minimal level of skill, a guarantee you can&#8217;t get from self-taught people. Of course, you can question people about it during a job interview or something, but a lot of people will say something like &#8220;I made websites so-and-so blah blah blah&#8221;, which only shows that they&#8217;ve got a basic understanding of a programming language and can produce something with it - it does not however tell anything about their grasp of, say, OO principles, design patterns, proper coding, working in a team, etcetera, or at least not without asking on.
Another thing is that 99% of employers, unfair as it may be, simply want you to have an education and, preferably, an X amount of experience, else they simply won&#8217;t even ask you for an interview, especially not if you can&#8217;t provide them with a list of experience or self-taught business.
There&#8217;s also a comment about actual experience versus theoretical knowledge, one that I also agree with. Someone can have all the theoretical knowledge he wants, but if he can&#8217;t put it into practice, he will fail. I have the advantage that I have that ability, plus some practical experience where I could put that theoretical stuff into practice , but I&#8217;m sure that many people wouldn&#8217;t and would be only theoretical masters.
I also do not believe that you can create programmers just from Wikipedia. It is a very good tool as a helper - I&#8217;ve used it loads as well -, but you can&#8217;t base everything just on that. Books are also just tools, eventually, it&#8217;s all about experience. And a college will give you, at least in my case, a basis of experience if you finish it. Over here, you get a total of a year of experience in a real-world company during two internships, where you can put the theory into practice - which, by the way, is far more valuable than the actual teaching. I spent my first 20 weeks at a large insurance company, who spent an entire floor on a single website (since it&#8217;s a large and critical website, not because they have loads of people that do nothing), and the experience I gained there was invaluable. There, they wouldn&#8217;t hire someone who did some websites in PHP or did some programs in .net, they&#8217;d hire people with degrees.
Realistically speaking, only a small portion of people would get at a proper enough level without an education to be hired, and the ones with a degree will get a much higher chance of a job.
Also, there&#8217;s several categories of self-taught people. There&#8217;s the really talented ones, that spent years in they mother&#8217;s basements (or whatever) programming for a wide range of various projects, and then there&#8217;s the hobby programmer. This latter one is mostly active on the internets, posting on blogs (like this one&#8230; oops) and whatnot telling the world what an awesome PHP database class they&#8217;ve written, or whatnot. These are the category of self-proclaimed programmers that they&#8217;re on top of the world, and these are the ones that I would not want to learn from. Which, sadly, I did a few years back.
There was this dude, a self-taught web developer in PHP, who boasted about all his projects and making $45 an hour (which, for his former Russian country, was a lot). He helped me out with my first actual project, replacing a horrid block of hundreds of lines of repetitive HTML / PHP forms into a 15-lined triple for-loop that did the exact same, only neater.
Later, I took a look at his code, and already didn&#8217;t feel too good about it. He built a website CMS in a week or so, and when he sold the site after two months of getting it, he dished in $6000,-, for a week of programming. Now, some years later and now I have part of an education behind me, I realize that he wasn&#8217;t actually that good of a programmer. Sure, he made money, and sure, his websites worked, but in terms of design, he failed. He used object-oriented programming (once again, self-proclaimed), but he used it in the exact wrong way. I should see if I can still find that code somewhere on my home computer, for the lulz.
The main category of self-taught programmers falls into that category - the one that think they&#8217;re all that, but aren&#8217;t. You probably won&#8217;t see that type applying for jobs, since either they think they&#8217;re too good for that, or they know nobody would hire them for their lack of an education, but instead they&#8217;ll fill the internets with their self-botched template systems and whatnot. The problem with that is that other people will read it, and the less smart will actually praise them for it and, worse, take over their code and habits, resulting in more self-educated programmers that do everything wrong. I can&#8217;t be arsed to collect examples at the moment, but they&#8217;re there allright.</div></summary>
  </entry>

  <entry>
    <title>Goooooooooooooooooooooooooooogle</title>
    <link href="http://greatjustice.info/?p=52"/>
    <id>http://yoursite/article/?i=5afd68476fb619ad5088d9b055b307a4</id>
    <updated>2009-09-04T20:00:49-07:00</updated>
    <author>
      <name>http://greatjustice.info/?p=52</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Two bits of news from Google.
First, nobody thought MJ would ever die, but even less people thought&#160;Gmail and similar Google services would ever get out of beta. Guess again, Hell has frozen over,&#160;. They state in the article that they planted the &#8216;Beta&#8217; tag on it to indicate it&#8217;s constantly under development, but (as you can imagine), companies were reluctant to use it - &#8216;Beta&#8217; usually means &#8216;Possibly riddled with critical bugs - use at your own risk&#8217;, and you don&#8217;t want to take risks when all your company communciation goes through Beta apps. Not that they didn&#8217;t use it, mind - according to Google itself, 1.75 million companies are using Google&#8217;s apps. My previous employer / internship, Oberon Interactive, used Gmail (&#8217;For Your Domain&#8216;) as their main mail client, and I&#8217;d do the exact same.
Second, they&#8217;ve (finally) announced&#160;their web-based operating system. As expected, it seems to focus on web applications and such - which basically seems to make it a shell around a webbrowser of sorts. This project is developed separately from their mobile OS Android, although both are based on the Linux kernel. But where Android uses Java for the most part, the &#8216;Google Chrome Operating System&#8217; will use &#8216;web technologies&#8217; - i.e. webapps for all of its functionality.
The latter is a tad odd, one would think - what if you don&#8217;t have innernet access? What about&#160;WoW!11 3D video games? Well, for the former, there&#8217;s Google Gears and other offline tools, that allow one to run a webapp without an internet connection. For the latter, there&#8217;s projects like&#160;O3D (also by Google) to chuck a proper 3D engine API in a browser.
They say the OS will be released somewhere next year. Making it a Linux version that is mainly a browser would severely reduce development time, so that makes sense.
Still though, I personally would&#8217;ve preferred they re-invented the entire thing instead of reusing the 30 year old Linux base and such. It would be moast win if they would be able to make an operating system that ran Windows programs as well as Linux programs, but I doubt that&#8217;ll happen anytime soon - the&#160;React OS, for example, as well as the&#160;Wine project have both been going on for many years, and whilst they do get some results, neither is a full alternative to Windows yet.
For the OS though, I&#8217;m sure it&#8217;ll quickly become equally or even more popular than Linux, especially on netbooks - Google indicated they are already&#160;&#8216;working with multiple OEMs&#8217;, so I wouldn&#8217;t be surprised at all if GCOS (?) was supplied on new netbooks by next year. The main advantage Google has over all the other netbook / linux operating systems is that it&#8217;s got the name and reputation, not to mention the financial means and marketing. I&#8217;m surely intrigued.
&#8230;But I doubt it&#8217;ll be the Windows killer everyone&#8217;s been waiting for.
UPDATE, 9 July: Google published a list of partners they&#8217;re working with. The list contains, amongst others, the names of&#160;Acer, Asus, HP, Lenovo, Hewlett-Packard, Qualcomm and Texas Instruments. With those, Google has a number of large netbook manufacturers, as well as an ARM processor manufacturer. Dell seems to be missing on the list, even though they&#8217;ve been working with Android (supposedly). The list isn&#8217;t definitive though, more companies may be added as time passes.
The blog post also confirms that the OS will be free and open source - although not yet. The blog says that the OS will be open sourced later this year.</div></summary>
  </entry>

  <entry>
    <title>Goooooooooooooooooooooooooooogle</title>
    <link href="http://greatjustice.info/goooooooooooooooooooooooooooogle/"/>
    <id>http://yoursite/article/?i=8a29d66f6b08867f3de0b0b697d6594f</id>
    <updated>2009-07-08T05:30:39-07:00</updated>
    <author>
      <name>http://greatjustice.info/goooooooooooooooooooooooo</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Two bits of news from Google.
First, nobody thought MJ would ever die, but even less people thought&#160;Gmail and similar Google services would ever get out of beta. Guess again, Hell has frozen over,&#160;. They state in the article that they planted the &#8216;Beta&#8217; tag on it to indicate it&#8217;s constantly under development, but (as you can imagine), companies were reluctant to use it - &#8216;Beta&#8217; usually means &#8216;Possibly riddled with critical bugs - use at your own risk&#8217;, and you don&#8217;t want to take risks when all your company communciation goes through Beta apps. Not that they didn&#8217;t use it, mind - according to Google itself, 1.75 million companies are using Google&#8217;s apps. My previous employer / internship, Oberon Interactive, used Gmail (&#8217;For Your Domain&#8216;) as their main mail client, and I&#8217;d do the exact same.
Second, they&#8217;ve (finally) announced&#160;their web-based operating system. As expected, it seems to focus on web applications and such - which basically seems to make it a shell around a webbrowser of sorts. This project is developed separately from their mobile OS Android, although both are based on the Linux kernel. But where Android uses Java for the most part, the &#8216;Google Chrome Operating System&#8217; will use &#8216;web technologies&#8217; - i.e. webapps for all of its functionality.
The latter is a tad odd, one would think - what if you don&#8217;t have innernet access? What about&#160;WoW!11 3D video games? Well, for the former, there&#8217;s Google Gears and other offline tools, that allow one to run a webapp without an internet connection. For the latter, there&#8217;s projects like&#160;O3D (also by Google) to chuck a proper 3D engine API in a browser.
They say the OS will be released somewhere next year. Making it a Linux version that is mainly a browser would severely reduce development time, so that makes sense.
Still though, I personally would&#8217;ve preferred they re-invented the entire thing instead of reusing the 30 year old Linux base and such. It would be moast win if they would be able to make an operating system that ran Windows programs as well as Linux programs, but I doubt that&#8217;ll happen anytime soon - the&#160;React OS, for example, as well as the&#160;Wine project have both been going on for many years, and whilst they do get some results, neither is a full alternative to Windows yet.
For the OS though, I&#8217;m sure it&#8217;ll quickly become equally or even more popular than Linux, especially on netbooks - Google indicated they are already&#160;&#8216;working with multiple OEMs&#8217;, so I wouldn&#8217;t be surprised at all if GCOS (?) was supplied on new netbooks by next year. The main advantage Google has over all the other netbook / linux operating systems is that it&#8217;s got the name and reputation, not to mention the financial means and marketing. I&#8217;m surely intrigued.
&#8230;But I doubt it&#8217;ll be the Windows killer everyone&#8217;s been waiting for.</div></summary>
  </entry>

  <entry>
    <title>Over-engineering a permissions system</title>
    <link href="http://greatjustice.info/over-engineering-a-permissions-system/"/>
    <id>http://yoursite/article/?i=15078386f96938f83139582b1c5ae740</id>
    <updated>2009-03-14T12:01:31-07:00</updated>
    <author>
      <name>http://greatjustice.info/over-engineering-a-permis</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As before, I&#8217;m still working on a WebManager library / framework / toolbox, and a next step in that is to improve the system&#8217;s authorization system. From my understanding, this works roughly as follows:
In WebManager, as described in my previous post, a WCB is made out of several Components, such as a form, an element, etcetera. Each component (although &#8216;each&#8217; isn&#8217;t a fact, fyi) has, next to a basic set of settings, also an optional setting for permissions. With permissions, I refer to access control lists (of sorts) for the five (or so) basic usergroups that exist in WebManager, usergroups such as authors, users, developers, etcetera. Each usergroup can have a set of permssions assigned to them, which indicate what that user can do. These permissions can then, in the controller or in a .JSP file, be checked again using WebManager&#8217;s AuthorizationService, a service object with some permission checking methods.
A permission is defined as follows. First, you create a Category, basically a parent for each permission. The Category is defined as a Category instance, which gets passed a &#8216;category&#8217; string, an unique identifier for that category. Usually, at least in the default archetypes, this identifier is equal to the component&#8217;s bundle ID, which in turn is a combination of the WCB&#8217;s ID and an appendage (such as &#8216;element&#8217; or whatnot). This results in a category string similar to, for example, &#8220;info.greatjustice.wcb.somewcb.element&#8221;.
Next, one creates a set of Permission objects, which are objects created according to a permission string (a should-be unique string) and the category defined before. The permission string is usually the category string, with the permission itself appended to it (such as &#8216;.update&#8217;, &#8216;.delete&#8217;, etc). This leads to a permission string of &#8216;info.greatjustice.wcb.somewcb.element.update&#8217;, for example.
Now that there&#8217;s a set of permissions (we&#8217;ll use the base set of CRUD permissions as an example here - create, read, update, delete), we can assign them to the usergroups that have these permissions. When no permissions are defined, all users have full access to the WCB component. When just one permission is set in one usergroup, that usergroup can only perform that action, nothing else. Anyways, to assign a permission to a permission group, the ComponentDefinition object, which is used to configure and (by WebManager itself) initialize a WCB&#8217;s component, has a method, setPermissionsForPermissionGroup(), that allows the setting of a permission. The method takes two arguments, the usergroup (which is a constant string defined in WebManager&#8217;s WCBConstants class) and an array of Permission objects to assign to that usergroup.
Next to that, the Element component type has a few extra methods (setCreatePermission and setDeletePermission) that, I assume, sets a global permission that indicates that component can be created and deleted, or in this case, can be inserted or removed from a page - regardless of user rank, i.e. &#8216;global&#8217;.
Now, back to the topic at hand and my own work on this, I figured that this system wasn&#8217;t ideal, for a number of reasons.
First, there&#8217;s an enormous amount of freedom associated with setting a permission. Because you can pass strings, there&#8217;s no way of knowing whether it&#8217;ll &#8216;work&#8217; until you try it out. There&#8217;s no set specification about what input is allowed, and nor is there any checking for proper values. This leads me to believe that the whole permission system in WebManager is little more than a string comparison system (as in, if the usergroup identified by this string has the permission defined by that string, return true, else return false), which is fine in itself, but then, why&#8217;s there the complexity in the assigning of the permissions? Why bother creating a long permission string when you could just fill in &#8220;Slartibartfast&#8221; as a permission, and check if a user has the &#8220;Slartibartfast&#8221; permission all the time?
I can understand that, of course, since I&#8217;m sure the system would allow checking for a permission set in component A in component B, with this relatively low-level approach. Still though, I believed that this system could be improved. The lowest step, the assigning of the permission category is pretty much the starting point. I don&#8217;t believe that that could be abstracted any more, at least not without completely automating the system of assigning permissions, so that&#8217;ll largely stay the same.
The permissions themselves though could be largely automated. There&#8217;s a few facts we know about the permissions:

The permission string is always (or, 99.9% of the time) based on the category&#8217;s string.
The permission is in most cases one of Create, Read, Update, or Delete, and in exceptional cases it&#8217;s a similar system with other permissions such as &#8216;UpdateSomePart&#8217;.
The permission is never used in a dynamic sense - once a permission has been created, it doesn&#8217;t turn into something else.
The usergroups are a pre-defined set of 5 groups, currently defined as plain strings.

Now, with these above facts in mind, there&#8217;s a number of things we could do to improve on the permission system.

Add typesafe constraints to the permissions and usergroups
Auto-generate permissions based on sensible defaults
Auto-generate permissions based on what a user wants

Note that there&#8217;s one or two additional points to the above list, but they apply to the entire library in a wider sense of the word - i.e. an alternative / easier method of creating ComponentPermissions. I&#8217;ll do a full article on that once it&#8217;s finished.
We&#8217;ll want to improve on the permission system for a number of reasons. First, we&#8217;ll want to make it more typesafe - if you know there&#8217;s a limited set of usergroups (5, in this case), why would you want to have the users set it as a string? If you know a permission is always a fixed value, why set it as a string value that allows everyone to freely fill things in?
Second, we&#8217;ll want to automate - in several layers of meaning - the process of creating and assigning permissions. If you know the category and know the set of permission types, it&#8217;s easy to auto-generate the Permission objects and assign them to the ComponentDefinition automatically. Automating in &#8217;several layers&#8217; mean, in this case, that there&#8217;s the possiblity to have all permissions auto-generate (the base CRUD permissions, for example), but at the same time not restrict the users in defining their permissions.
After a few days of development (or something, I don&#8217;t really keep track of time - I don&#8217;t seem to have any deadline or other important tasks where I work), The end-product consisted of a set of components that allow for easy and typesafe definition of permissions, with several layers of automation and customization.
One of the first things I did was to put the permission groups into an enum, a language feature I&#8217;ve never used until about 9 months ago, but which I already love. Using an enum instead of the constant string values defined in WebManager&#8217;s WCBConsts has the main advantage of being typesafe - when you have a method that expects a usergroup, you can only accept usergroups, instead of having to do a manual check to examine the string value passed to it. The setPermissionsForPermissionGroup could, if WebManager used the enum approach, accept a permission group and an array of Permission objects instead of &#8217;some&#8217; string and an array. This guarantees that there is no way that a user could ever enter the wrong value, simply because the software wouldn&#8217;t compile if there&#8217;s an incorrect value set there.
The second thing I did was to make my own subclass of the PermissionCategory object, which, at first, just defined a constructor that forced each mandatory value to be set at object create-time - a PermissionCategory requires two or three values in order to function properly, but those values could only be set using setter methods. The custom permsision category defined a single constructor that forces the user to define all two or three values in one go, so it becomes impossible to &#8216;forget&#8217; a value. This approach is also used in the ComponentDefinition replacement code in the same library, but as said, more on that in a later article.
Later, the custom PermissionCategory got a few additional methods that created Permission objects. A Permission always has a Category as its parent, so why not invert it and have a Category spawn its Permissions?
As said earlier, a Permission&#8217;s permission string is usually the same as the Category&#8217;s permission string, so why not base a Permission&#8217;s string on the Category&#8217;s string with just a small appendage (&#8217;.create&#8217;, for example)?
In this approach, I once again returned to the enum. Defined a Permissions enum that defined four permissions: Create, Update, Read, and Delete. Each had a string representation as well defined inside the enum, string representations in the form of &#160;&#8217;.create&#8217;, &#8216;.update&#8217;, &#8216;.read&#8217;, etcetera.
The permissions enum, in combination with the custom PermissionCategory, resulted in a &#8216;createPermission&#8217; method in the PermissionCategory that took just one parameter, an entry from the Permission enum. The result was a concatenation of the category&#8217;s string and the Permission&#8217;s toString() method result, which was then inserted into a new Permission object, along with the category assigned to it that created it.
Next to a Permission enum, I also created a PermissionGroup enum, which acted a simple wrapper around the string values from WebManager itself - only then typesafe. With it came some extra methods that allow a developer to get the groups &#8216;above&#8217; a current group, so they could, for example, allow everything for the Editor usergroup and all those above it.
So, with an abstraction of the Permissions, the PermissionGroup, and the PermissionCategory in place, we&#8217;ve already come a long way. We can now create a set of permissions for a permission group and, using another abstraction for the creation of ComponentDefinitions, assign them all in one go. However, we can go one step further, by auto-generating the permissions.
In most cases, there&#8217;s just a single set of permissions that you&#8217;d always apply - CRUD. Create, Read, Update, and Delete, and this often in relation to an object of sorts - in this case, an Element component, or the object that you can insert into a page, can only be created (for example) by an Editor, but can only be deleted again by the Main Editor usergroup, which is one level up in the hierarchy.
WebManager&#8217;s permission system allows for more fine-grained permissions, but in most cases, this default set of permissions would work good enough. So, I also added an abstraction for storing and auto-generating CRUD permissions. This was done in two stages, actually. First up was a &#8216;generic&#8217; CRUDPermissionsContainer, an interface that defines four methods for getting the four permissions. I wanted to allow people to define their &#8216;own&#8217; CRUD permissions quartet instead of forcing them to either use the auto-generated ones or have to manually define all permissions, hence the abstraction. Underneath that are two default implementations: A CRUDPermissionsContainer implementation that works only with the earlier defined CRUDPermissions enum, which took just a PermissionCategory as constructor argument and created the permissions from there automatically, and a more generic container with a constructor with five arguments, the PermissionCategory object itself, and four Permission objects - one for each of the four CRUD permissions.
As the title suggests, this is a bit over-engineered, but it&#8217;s good practice material - I&#8217;m still cheap for my employer, so I can spend some more time on over-engineering. I know that there&#8217;s plenty of people that wish they had some excess time to spend on refactoring, =D.
But anyways, to wrap things up. My total permission system setup now allows users to set up the complete permission set for all users in a single line of code, and allows full customization in far less lines of code than the old one (where the old one involved at least two or three dozen lines - creating five string values, &#160;create a couple of Permission objects, put those in arrays, call the same method a couple of times in the ComponentDefinition object to assign them, etcetera. Having to do that every time for each component / WCB that requires permissions gets tedious, and not to mention it increases the code and, as such, the complexity of a class / method, and reduces its readability.
I&#8217;ll post a bit of code later on (maybe) to further illustrate this post, one line of code can say more than a thousand words and whatnot.</div></summary>
  </entry>

  <entry>
    <title>GX WebManager’s WCB Dependency Managem</title>
    <link href="http://greatjustice.info/gx-webmanagers-wcb-dependency-management/"/>
    <id>http://yoursite/article/?i=ef8f744c1278d75d2020248d298915f1</id>
    <updated>2009-03-01T04:31:20-08:00</updated>
    <author>
      <name>http://greatjustice.info/gx-webmanagers-wcb-depend</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It&#8217;s been far too long since I posted on here, so after an upgrade to WP 2.7 (or something), here&#8217;s a new post. The title may be a tad confusing, so I&#8217;ll try to explain that (and the abbreviations) first now.
I&#8217;m currently doing a 20-week internship at Oberon Interactive, a largely web-oriented company that does webdesign, online campaigns, that kinda stuff, all from their HQ in Amsterdam. It&#8217;s got about 12 or so employees (including myself), but I&#8217;m not sure yet because there&#8217;s almost always someone missing. On there, I&#8217;ve been assigned with the task of making development of WCB&#8217;s easier.
Before I throw in more TLA&#8217;s though, I&#8217;ll explain what I&#8217;m working with. I&#8217;m working with a pretty extensive enterprise content management system called WebManager, made by Dutch company GX. Since WebManager is the only piece of software GX seems to be developing, I&#8217;ll probably often confuse WebManager with GX and vice-versa, so if I use GX in reference to an item, I mean WebManager.
Anyways, since version 9 (I believe) of WebManager, GX has added the ability for developers to add functionality to WebManager through a plug-in-like system. This functionality is packaged in bundles called WebManager Content Bundles, aka WCB&#8217;s. These WCB&#8217;s are basically OSGi modules, built on top of Apache Felix, an implementation of OSGi&#8217;s service platform.
Now, Oberon has received at least one assignment from a large Dutch football site (i.e. the football type with the round ball, not the oblong one) that, at least for now, involves creating two of these WCB&#8217;s to be included into their site. The visible bit of a WCB can easily be inserted into existing WebManager pages through WebManager&#8217;s Edit Environment, a back-end that looks an awful lot like Microsoft Word.
Anyways, I&#8217;m working with that currently, and my primary internship assignment is to make WCB development a lot easier, reliable, and faster. There&#8217;s several aspects of WCB development that have to be improved, as I&#8217;ve discovered / determined for myself so far, and this article is about one of them: Dependency management. I&#8217;m sure I&#8217;ll be writing more posts during my internship on a range of (WCB development) related subjects, so be sure to hang around.
For this first installment, I&#8217;ve taken a closer look on how the WCB API&#8217;s handle dependency management, also comparing it with other, more formalized approaches. I&#8217;ve put the report into a neat, 10-page Word document, which I&#8217;ll link to below. Here&#8217;s a summary though, and you&#8217;re going to have to visit the internets to figure the terms I use out or read the .doc itself in order to find out what is what.
A WCB is built out of separate Components, like a Form, an Element, a Servlet, etc. Each Component has one central class of sorts that is initialized by some obscure part of WebManager, i.e. out of the programmer&#8217;s control. In order to be able to use, for example, the Authorization Service, with which you can check access permissions for users for a certain access, you have to pass a string value containing the class name of said Authorization Service to a new instance of a ServiceDependency object, then pass that to a ComponentDefinition object which is passed back to WebManager when your WCB is installed / initialized.
There&#8217;s loads of problems with this approach:
* No typesafe checking, so you&#8217;ll only see if you&#8217;ve entered the wrong classname at runtime (whilst one could pass a Class object, much more typesafe).
* It&#8217;s hard to get to the central object to get the service(s), you either have to call a getComponent() method from the controller class and cast that into the specific class, or implement the class as a singleton.
* No control over the dependencies&#8217; lifecycle - you can only pass the class you&#8217;d like to initialize to WebManager, can&#8217;t pass any parameters or whatever.
* You can only inject services into that one Component object.
* Injection is (usually) done using reflection on a class&#8217;s private fields, obliterating the meaning of the &#8216;private&#8217; keyword, and preventing the usage of setter methods (and additional behaviour one could associate with that).
All in all, they do use the term &#8216;dependency injection&#8217; a few times in their official documentation, but in practice all you do is pass the names of the classes you&#8217;d like to have created, have WebManager inject those into an object that acts as a hard-to-access Service Locator, and be done with it. The Service Locator isn&#8217;t a bad choice per s&#233;, but since the dependencies contained in the SL are injected somewhere at runtime, after all the objects (Controller, for example) are created, you&#8217;d only be able to access the dependencies at runtime of an object, through accessor methods. I&#8217;d much prefer if an object&#8217;s dependencies were injected at construction-time, through constructor injection, etc.
But all that, and then some, is all described in the document. Read it and let me know what you think - I&#8217;d love a second opinion on the matter, or alternative solutions to solving this problem.
http://greatjustice.info/files/dependency-management.doc</div></summary>
  </entry>

  <entry>
    <title>Applied design patterns: Database abstra</title>
    <link href="http://greatjustice.info/applied-design-patterns-database-abstraction-part-1/"/>
    <id>http://yoursite/article/?i=bada4049f7211fbc43322b8422838433</id>
    <updated>2008-10-03T03:01:06-07:00</updated>
    <author>
      <name>http://greatjustice.info/applied</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In some of my previous posts, I&#8217;ve pretty much ranted about the poor design qualities of some people that enjoy calling themselves PHP programmers. In these two posts however, I&#8217;d like to show you what good and proper design is. The topic is the same as that in my previous posts: databases. Or, to be more precise, database abstraction.
In the first part, we&#8217;ll transform a concrete set of database interaction classes into an abstract set, to improve flexibility and extensibility. In the second part, we&#8217;ll introduce a design pattern which will help us to manage and maintain the new abstract database classes and their concrete implementations. We&#8217;ll do part one in this post.

With database abstraction, I mean in this case that you write your database-driven program in such a way, that you&#8217;ll never really have to know what database you&#8217;re using. Consider the following example, which might not be the most neat example, but it&#8217;ll do for now:
function do_something()
{
// establishes a database connection
$databaseConnection = new MySQLDatabaseConnection($server, $username, $password);
$databaseConnection-&gt;SetDatabase('someDatabase');
// assemble the query (we'll do it directly now btw, ignore this example)
$query = new SelectQuery("SELECT * FROM 'someTable'");

$result = $query-&gt;Execute($databaseConnection);

// do something with the result, you get the idea.
}
The above example is actually pretty neat, if I say so myself. Feel free to replace it with either calls to the MySQLI class or direct mysql_ function calls, it&#8217;s not really important in this case.
Okay, you&#8217;ve made a web application, and the app is littered with calls to get data from your MySQL database, awesome. Now, however, you read somewhere that PostgreSQL is a lot faster / better in some cases, and you want to go and convert your entire application to use PostgreSQL instead of MySQL. In a 20-file or less application, this is still doable - open the .php file, find all calls to execute database queries, and replace them with a Postgres equivalent - which, outside of the actual syntax of the query (which I&#8217;m not familiar with btw), is pretty much the same (instead of mysql_query() you call pg_query(), for example).
But then you want to revert back after a few months. Great, re-do it all, again 20 times something of edits. This is getting tedious.
And it gets worse. What if instead of 20, you have 200 files (which isn&#8217;t uncommon in large websites)? What if you&#8217;re doing a research project to which database is more suitable for your application? You can either prepare for a lot of searching and replacing of similar-looking code, or, if you&#8217;re smarter, delegate that task to some moron who&#8217;s thinking he&#8217;s doing really important work.
If you&#8217;re teh smartest though, you&#8217;ll want to make your program in such a way that it won&#8217;t matter which database software you&#8217;re using. Lucky for you, there&#8217;s people who invented programming language features that allows you to do just that.
Let&#8217;s analyze the problem first. You have a database that contains data. Your program wants to create, read, update and delete (CRUD) data from that. Databases support all those four operations, without exception - that&#8217;s a constant, that&#8217;s a common feature, that&#8217;s important. The first step into abstracting a program or program structure is to discover what is common in the program. For databases, the common factors are:
1. You can connect / disconnect to them.
2. You can execute queries on them (CRUD queries).
That&#8217;s two common features all databases share. There&#8217;s a load more you can do with databases, but that&#8217;s the basics, that&#8217;s the very least we want to be able to do.
So, what&#8217;s this abstraction business again? We&#8217;ll want to make the calls to connecting to and executing queries on a database in such a way, that when we call it, we won&#8217;t know which database it&#8217;s actually performed on.
To do this, we&#8217;ll have to make a few things:
1. An abstract interface that contains the tasks you can perform on / with a database.
2. An implementation for each database type
3. A means to get a hold of the object(s) required to execute operations.
The first thing we need is an abstract interface. Think of an abstract interface as a list of requirements, a recipe, a guideline. In this interface, we define what we expect objects of this kind can do. We&#8217;ll first define an interface to a DatabaseConnection object. We want a DatabaseConnection to be established, closed, and for it to be able to execute queries. (In this example, we&#8217;ll pass the responsibilities to executing queries to the object that represents an active connection to a database. This might not be the most ideal or logical implementation, but eh, I can&#8217;t be arsed to think up something that makes more sense).
You&#8217;ll notice that there&#8217;s three function definitions in there, but without an implementation - the functions are there, but they don&#8217;t contain anything executable. In fact, calling them like this will result in fatal errors. But that&#8217;s not what this interface does - it provides a guideline, not an implementation. So, next we&#8217;ll create an implementation - we&#8217;ll do one for MySQL in this one.
class MySQLDatabaseConnection implements DatabaseConnection
{
	private $connection = null;

	public function __construct($host, $username, $password)
	{
		$connection = mysql_connect($host, $username, $password);
	}

	public function Execute($query)
	{
		return mysql_query($query, $connection);
	}

	public function Close()
	{
		if ($connection != null)
		{
			mysql_close($connection);
		}
	}
}
(it&#8217;s pretty basic btw, we&#8217;ll just assume we&#8217;re getting direct queries in this one. It also doesn&#8217;t really make sense since it looks pretty basic and not very advanced or complex, but eh, it&#8217;s just an example).
With the rules set by the interface, we can also implement a MySQLIDatabaseConnection that uses PHP&#8217;s MySQLI_ (MySQL Improved) functions, or a PostgreSQLDatabaseConnection that uses the Postgres functions. The point is, we want to make the actual connection establishing and query executing code invisible from the caller - we want to encapsulate those processes in defined classes.
So, in our own code, we can now just write a statement like the following:
$result = $query-&gt;Execute($databaseConnection);
And who knows what type $query is right now. MySQL? MySQLI? PostgreSQL? Ovrimos? The last one is a random one I took from the list at PHP.net, I have no clue what it is or how it works. But that&#8217;s the cool thing: it doesn&#8217;t really matter now. All you do is execute $query on a $databaseConnection, why should you care what it gets executed on? As long as the Execute method executes the query and returns a result, you don&#8217;t care what goes on behind it - or, better said, you shouldn&#8217;t care. By encapsulating the problem, you reduce or remove the need to know about the problem.
What&#8217;s next? There&#8217;s actually only one database-specific line in the example code at the top of this page:
$databaseConnection = new MySQLDatabaseConnection($server, $username, $password);
In order to solve that predicament, we&#8217;ll want to move the assignment of the $databaseConnection to a single, centralized location. In other words, we&#8217;ll want to move the creation of the concrete DatabaseConnections to a standard location. We&#8217;ll introduce the concept of a creational design pattern  (the Factory Method) in part 2 of this tutorial.</div></summary>
  </entry>

  <entry>
    <title>Applied design patterns: Database abstra</title>
    <link href="http://greatjustice.info/applied-design-patterns-database-abstraction-part-2/"/>
    <id>http://yoursite/article/?i=6b4c0b9c36778ddafd4a2eeb342c93b5</id>
    <updated>2008-10-03T03:01:06-07:00</updated>
    <author>
      <name>http://greatjustice.info/applied</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In some of my previous posts, I&#8217;ve pretty much ranted about the poor design qualities of some people that enjoy calling themselves PHP programmers. In these two posts however, I&#8217;d like to show you what good and proper design is. The topic is the same as that in my previous posts: databases. Or, to be more precise, database abstraction.
In the first part, transformed a concrete set of database interaction classes into an abstract set, to improve flexibility and extensibility. In the second part (i.e. this one), we&#8217;ll introduce a design pattern which will help us to manage and maintain the new abstract database classes and their concrete implementations. In this post, we&#8217;ll create and implement the design pattern we&#8217;ll use to determine which concrete database connection should be used, using an implementation of the Factory Method.

In the first part, we encountered the following line in the example code:
$databaseConnection = new MySQLDatabaseConnection($server, $username, $password);
This, in itself, will work, but it&#8217;s not what we want. If we used this line in every bit of code where we require a database connection, our application would become dependent on the MySQLDatabaseConnection class. Not only that, but it&#8217;ll become rigid, inflexible, and a general pain in the arse to maintain. You might consider that in most cases your application will stick to a single database, but what if  you&#8217;re writing an application for clients that may want to use a different database? Do you just lock them out saying &#8216;No we don&#8217;t support &#8216;? Not only that, but learning this method now (and not even particularly for this situation) will give you a benefit in the future, when you encounter similar problems. Anyways, back to the tutorial.
In order to solve the above case of inflexibility, we&#8217;ll want to move the concrete object instantiation (= object creation) to a single location. We&#8217;ll want to be able to create an object that can produce new instances of the objects required to work with a database of a specific type, and pass that object around to the bits of code that need it. The $databaseConnection in the above example will, as such, be instantiated not by calling the new operator on a specific database connection type, but by calling a method on an object that&#8217;s assigned to the part of the program using databases which will return an instance of the database connection type currently in use. The former sentence is complex, but I hope it&#8217;ll make sense in a short while. Read on.
To do the above, we have to create ourselves a Factory Method. The name &#8220;Factory Method&#8221; refers to a Design Pattern, an element of reusable object-oriented software as described in The book on Design Patterns, and probably in a load of other books as well. This method (or function, whatever floats your boat) will return an instance of the DatabaseConnection currently used in your application.
Next to a method that creates / returns a DatabaseConnection, we&#8217;ll also want to support connection re-use: in most applications, people only want a single database connection at a time for the duration of a request, so we&#8217;ll want to make the behavior of the factory as such that it&#8217;ll only create a new instance of a Connection if it isn&#8217;t already there. This only-one-object-of-a-certain-type-at-a-time business can be achieved by using the Singleton pattern (albeit slightly different from the one described in The Book, but that difference isn&#8217;t important).
In our Factory, we&#8217;ll also want to keep track of all existing connections, so we&#8217;ll have to maintain a list of active database connections and the means to manage them.
We&#8217;ll create a new interface for this, the ConnectionManager. The ConnectionManager is in essence a pretty basic class, in that it contains only one field (an array that contains the currently active connections) and a handful of connection management methods - one for establishing a connection, one for closing a connection, one for getting a connection from the list of connections, and one for creating a new connection. We&#8217;ll want the ConnectionManager to create new Connections based on whichever type of database is currently selected. To do this, we&#8217;ll create one ConnectionManager for each type of database, so that a MySQLConnectionManager returns MySQLConnections, and a PostgreSQLConnectionManager returns PostgreSQLConnections.
There is one thing that&#8217;s shared in all ConnectionManagers by the way, and that&#8217;s that they all contain a list of database connections. We&#8217;ll take advantage of PHP&#8217;s typelessness by defining the location of those connections in the abstract ConnectionManager. We&#8217;ll add actual functionality to the otherwise abstract ConnectionManager, which means it&#8217;s not an official Interface anymore - it&#8217;s become an Abstract Class, which means that it implements some methods, while leaving the implementation of other methods to subclasses. Here&#8217;s our ConnectionManager:
abstract class ConnectionManager
{
	private $connections = array();

	const DEFAULT_NAME = 'Default';

	// retrieves a Connection from the local connection storage.
	public function GetConnection($name = ConnectionManager::DEFAULT_NAME)
	{
		return $this-&gt;connections[$name];
	}

	// Adds a new connection under the given $name into the connection storage.
	// We don&#8217;t want external parties (outside of subclasses) to add connections
	// to the storage, so we declare it as protected.
	protected function AddConnection($connection, $name)
	{
		$this-&gt;connections[$name] = $connection;
	}

	// Close the connection specified by the name (if it exists).
	public function CloseConnection($name = ConnectionManager::DEFAULT_NAME)
	{
		if ($this-&gt;connections[$name] != null)
		{
			$this-&gt;connections[$name]-&gt;Close();
			$this-&gt;connections[$name] = null;
		}
	}

	// This method has to be implemented by our subclasses.
	public abstract function CreateConnection($host, $username, $password, $name = ConnectionManager::DEFAULT_NAME);
}
It defines logic for adding and getting Connections, which is independent of actual database implementations, and leaves the logic for creating and closing Connections open for subclasses to implement. We&#8217;ve used a class constant to define the default name for connections, which looks pretty ew in code, but provides a centralized location to store the default name, so you&#8217;ll only have to change it once. Not that it matters in terms of functionality, but eh.
We&#8217;ll define a MySQLConnectionManager as follows:
class MySQLConnectionManager extends ConnectionManager
{
	// Creates a new MySQLDatabaseConnection and inserts it into the ConnectionList.
	// This method has to be called first before the GetConnection method can be called.
	public function CreateConnection($host, $username, $password, $name = ConnectionManager::DEFAULT_NAME)
	{
		$connection = new MySQLDatabaseConnection($host, $username, $password);
		$this-&gt;AddConnection($connection, $name);
	}
}
When a user calls CreateConnection() on an instance of ConnectionManager (or, to be more precisely, on an object reference (variable) that references an object that extends ConnectionManager), the CreateConnection method will return a DatabaseConnection of the type matching the currently active ConnectionManager. To clarify, here&#8217;s a usage example:
$manager = new MySQLConnectionManager();
$manager-&gt;CreateConnection('localhost', 'root', '');
$connection = $manager-&gt;GetConnection();

$manager = new PostgreSQLConnectionManager();
$manager-&gt;CreateConnection('localhost', 'root', '');
$connection = $manager-&gt;GetConnection();
Looks easy enough. Also looks like we&#8217;ve simply moved the same problem we&#8217;ve had before instead of actually solving it. But no, we&#8217;ll assign the $manager somewhere in the initializing stage of the program, and pass it around to anything that needs a connection. The piece of code that requires a connection then simply calls $manager-&gt;GetConnection() and gets a connection to a database. Notice how I&#8217;ve used the word &#8216;a&#8217;? The code that requires no longer requires a connection to a MySQL database, but just &#8216;a&#8217; reference to &#8216;a&#8217; database connection, to which it can pass &#8217;some&#8217; kind of query. Consider the following example as well:
$random = rand(0, 2);
$manager;
switch($random)
{
	case 0: $manager = new MySQLConnectionManager(); break;
	case 1: $manager = new PostgreSQLConnectionManager(); break;
	case 2: $manager = new SQLiteConnectionManager(); break;
}

$manager-&gt;CreateConnection('localhost', 'root', '');
$connection = $manager-&gt;GetConnection();
What this does is create a random connection manager (and, as a result, a random connection). Yet the access methods remain the same, no matter which ConnectionManager is eventually used. Of course, whether the above will work or not is still the question (it won&#8217;t work over here, since I don&#8217;t have Postgres or SQLite installed, let alone wrote an actual PostgreSQLConnectionManager etc), but that&#8217;s not really the point. The point is that, with this construction, you can program your application to a single type - the DatabaseConnection type - without having to worry about the eventual implementation of that one. All you care about is that you get a connection when calling GetConnection(), and that your query gets executed when you call Execute on the resulting connection. And that is abstraction. Less headache, more flexibility, and great justice.
For your entertainment, here&#8217;s a UML diagram (or well, it&#8217;ll look like that) that depicts the Factory Method as used in this example (made non-specific to this application btw). In it, you see the abstract factory (ConnectionManager) (defined as an interface in this case, since we&#8217;ve added the member access functions as an application-specific extra in the example - you probably won&#8217;t need it or have different requirements in other applications of this design pattern), the concrete factory (MySQLConnectionManager) that returns a concrete Product object (MySQLDatabaseConnection), which in turn inherits from a Product interface. The image uses the Factory Method in a slightly different manner from how we&#8217;ve used it here. In the image, the abstract Factory (our ConnectionManager) has a method that calls the FactoryMethod (CreateConnection / GetConnection) for use of its own. The implementation of FactoryMethod goes to a subclass. So in the image, the Factory gets a Product that gets produced by an implementing class. In fact, now that I see that image, we could&#8217;ve used the same method in our own ConnectionManager. We could&#8217;ve implemented the ConnectionManager&#8217;s CreateConnection method so it would call a differently named method that gets implemented by a subclass, which would return an instance-specific Connection.

In the basics though, the two methods are interchangeable and, functionally seeing, do the exact same. But hey, it&#8217;s good to see there&#8217;s still some flexibility in design patterns.
In these two posts, you&#8217;ve learned at least one important rule: Program to interfaces, not to concrete implementations. This might be difficult and probably obsolete and unnecessary in a lot of cases (i.e. don&#8217;t do it unless you want some flexibility), but it&#8217;ll pay off in terms of flexibility, extensibility and maintainability.</div></summary>
  </entry>

  <entry>
    <title>University versus self-taught</title>
    <link href="http://greatjustice.info/university-versus-self-taught/"/>
    <id>http://yoursite/article/?i=c161d726d4308d97fdbec05717e9becc</id>
    <updated>2008-10-03T03:01:06-07:00</updated>
    <author>
      <name>http://greatjustice.info/univers</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A topic I&#8217;ve been thinking about for quite some time now. If I was an employer, looking for an employee, which would I take: The type that basically self-taught himself programming through reading books and/or websites, or the type that spend an X amount of years at university and has a bachelor&#8217;s or master&#8217;s degree? Let&#8217;s assume that, when they apply, they both have roughly the same amount of knowledge and/or skill.
I&#8217;ll unveil it right now: I&#8217;d totally go for the one that went to university and got a degree. Why? I&#8217;ll explain (or, attempt to.) Read the rest of this post for a wider view of my opinion, as well as a massive edit written when this post got a relatively large amount of attention quite suddenly and unsuspectingly.

When someone both went to university and, more importantly, actually finished it, you&#8217;ll know that he has certain properties to himself. First, you&#8217;ll know that he&#8217;s persistent, in that he&#8217;s spent 4 or 6 years (or, he would in my country) learning a job, even though he didn&#8217;t like some parts of it. A self-educated programmer would more likely have stuck to only the languages and projects he himself liked. Over here, a student would have to perform various assignments in university, and some of them spanning multiple disciplines. I somehow doubt a self-educated programmer would be working on programming both a microprocessor and a (Java) control program for a remote-controlled model boat, at least not unless he had a particular interest in that area.
In university, you&#8217;re pretty much forced to perform a wide range of projects, spanning multiple disciplines, languages, areas, and forcing the student to work together with people of different environments - for example, electronical engineers, 3D modelers, structural engineers, etcetera. I do not believe that most self-taught programmers would have such a background. Instead, I&#8217;d expect them to remain in their own safe zone - PHP webapplications, C/C++ apps for an open source project or operating system, or .NET hobby-applications for, say, maintaining an address book - you name it.
I don&#8217;t actually know any self-taught programmers, mind, so feel free to prove me wrong. I&#8217;m confident that there&#8217;s numerous self-taught programmers that have a much wider range of software engineering interests than I can think of.
But yeah. University graduates would have several points above self-taught programmers, since they&#8217;ve been through a system, they&#8217;ve persisted in doing tasks they, most likely, didn&#8217;t really want to do. I had to work on completely unrelated projects like designing / describing an environmentally friendly house, which was more concentrated on structural engineering and whatnot than programming. But because of that, and other projects, I know (read: have a general idea) what goes on in those areas. I know what it takes to write a program at the very lowest levels of the system (well, not THAT low, considering we still could use C), where you&#8217;d only have 300~something bytes of memory available to do everything in.
Anyways, to conclude this post, I believe that a self-taught programmer does not have the persistence, organizational skills, multi-disciplinary development, and finally the proof of his ability (i.e. a piece of paper saying he&#8217;s finished an education) to be as desirable for a company as self-taught one is, some exceptions left aside.
Massive edit
Whoa, stepped on quite some toes here it seems, never thought my blog would draw so much attention. Guess linking to other blogs draws massive attention. That, and having the author of said blog directly link to this post. Let&#8217;s comment on some of the comments here.
First, I&#8217;m not (entirely) trying to say that the self-taught programmers are incompetent - the example of Bill Gates et al was raised, one that I agree with, since he and everyone else that started the whole science were pretty much all self-taught, in a time before degrees.
As for hiring people, the degree does, indeed, not mean anything when it comes to actual knowledge or experience - I&#8217;m actually still in university, and the people I work with&#8230; well, aren&#8217;t that awesome, in most cases. However, and this is one point I have, last year I worked with a handful of people that came along with my previous education (a system administrator education thingy), and to put it short, they were terrible. Lucky for me (since they&#8217;d most likely cling to me so I could do their job), they failed the second year and probably won&#8217;t finish the education.
Which is one of the points I was trying to get at while (hastily) writing this post: An education filters out most of the bad ones (some exceptions there), so you know that someone who finished an education has at least a minimal level of skill, a guarantee you can&#8217;t get from self-taught people. Of course, you can question people about it during a job interview or something, but a lot of people will say something like &#8220;I made websites so-and-so blah blah blah&#8221;, which only shows that they&#8217;ve got a basic understanding of a programming language and can produce something with it - it does not however tell anything about their grasp of, say, OO principles, design patterns, proper coding, working in a team, etcetera, or at least not without asking on.
Another thing is that 99% of employers, unfair as it may be, simply want you to have an education and, preferably, an X amount of experience, else they simply won&#8217;t even ask you for an interview, especially not if you can&#8217;t provide them with a list of experience or self-taught business.
There&#8217;s also a comment about actual experience versus theoretical knowledge, one that I also agree with. Someone can have all the theoretical knowledge he wants, but if he can&#8217;t put it into practice, he will fail. I have the advantage that I have that ability, plus some practical experience where I could put that theoretical stuff into practice , but I&#8217;m sure that many people wouldn&#8217;t and would be only theoretical masters.
I also do not believe that you can create programmers just from Wikipedia. It is a very good tool as a helper - I&#8217;ve used it loads as well -, but you can&#8217;t base everything just on that. Books are also just tools, eventually, it&#8217;s all about experience. And a college will give you, at least in my case, a basis of experience if you finish it. Over here, you get a total of a year of experience in a real-world company during two internships, where you can put the theory into practice - which, by the way, is far more valuable than the actual teaching. I spent my first 20 weeks at a large insurance company, who spent an entire floor on a single website (since it&#8217;s a large and critical website, not because they have loads of people that do nothing), and the experience I gained there was invaluable. There, they wouldn&#8217;t hire someone who did some websites in PHP or did some programs in .net, they&#8217;d hire people with degrees.
Realistically speaking, only a small portion of people would get at a proper enough level without an education to be hired, and the ones with a degree will get a much higher chance of a job.
Also, there&#8217;s several categories of self-taught people. There&#8217;s the really talented ones, that spent years in they mother&#8217;s basements (or whatever) programming for a wide range of various projects, and then there&#8217;s the hobby programmer. This latter one is mostly active on the internets, posting on blogs (like this one&#8230; oops) and whatnot telling the world what an awesome PHP database class they&#8217;ve written, or whatnot. These are the category of self-proclaimed programmers that they&#8217;re on top of the world, and these are the ones that I would not want to learn from. Which, sadly, I did a few years back.
There was this dude, a self-taught web developer in PHP, who boasted about all his projects and making $45 an hour (which, for his former Russian country, was a lot). He helped me out with my first actual project, replacing a horrid block of hundreds of lines of repetitive HTML / PHP forms into a 15-lined triple for-loop that did the exact same, only neater.
Later, I took a look at his code, and already didn&#8217;t feel too good about it. He built a website CMS in a week or so, and when he sold the site after two months of getting it, he dished in $6000,-, for a week of programming. Now, some years later and now I have part of an education behind me, I realize that he wasn&#8217;t actually that good of a programmer. Sure, he made money, and sure, his websites worked, but in terms of design, he failed. He used object-oriented programming (once again, self-proclaimed), but he used it in the exact wrong way. I should see if I can still find that code somewhere on my home computer, for the lulz.
The main category of self-taught programmers falls into that category - the one that think they&#8217;re all that, but aren&#8217;t. You probably won&#8217;t see that type applying for jobs, since either they think they&#8217;re too good for that, or they know nobody would hire them for their lack of an education, but instead they&#8217;ll fill the internets with their self-botched template systems and whatnot. The problem with that is that other people will read it, and the less smart will actually praise them for it and, worse, take over their code and habits, resulting in more self-educated programmers that do everything wrong. I can&#8217;t be arsed to collect examples at the moment, but they&#8217;re there allright.</div></summary>
  </entry>

  <entry>
    <title>Object-oriented programming in ANSI-C</title>
    <link href="http://greatjustice.info/object-oriented-programming-in-ansi-c/"/>
    <id>http://yoursite/article/?i=3d6caa2d37976f7e2c44d7589020916c</id>
    <updated>2008-10-03T03:01:06-07:00</updated>
    <author>
      <name>http://greatjustice.info/object-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This PDF is actually pretty neat. It explains how you can apply a basic sense of object-oriented programming in standard (non-OO) C. I&#8217;m no C programmer (I&#8217;ve programmed a microprocessor for school a year or so back), but it&#8217;s still pretty interesting to see. Check it out at 
http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
Found it at PlanetPDF</div></summary>
  </entry>

  <entry>
    <title>Apparent user-content filtering in PHP</title>
    <link href="http://greatjustice.info/apparent-user-content-filtering-in-php/"/>
    <id>http://yoursite/article/?i=ec440cc2fb794aef383ef92773366ada</id>
    <updated>2008-10-03T03:01:06-07:00</updated>
    <author>
      <name>http://greatjustice.info/apparen</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The following fellow is a tard.
http://www.soaptray.com/2008/04/filtering-user-input-in-php/
How I start to loathe StumbleUpon and, worse, the people that promote their own blogpost thinking they&#8217;ve actually produced something awesome. I&#8217;m not going to go into it anymore, instead I&#8217;ll copypasta the comment I posted on there:
I have some critical comments @ your code. First off, why do you write a Filter class that doesn?t have any actual class-level methods? The methods are all plain, static methods, and should either be declared static (so you can do filter::whitespace($string) etc), or be left out of a class declaration altogether (Which is a bit faster than declaring static methods).

Second, your methods make little sense. For the methods you posted, there?s regular PHP functions already there.
Your first one:
// Removes all whitespace from a string
function whitespace($str){
$str = preg_replace(?/\s\s+/?,? ?, $str);
return $str;
}
can, firstly, be rephrased as
function whitespace($str){
return preg_replace(?/\s\s+/?,? ?, $str);
}
and, secondly, there?s a trim() function in the standard PHP library that removes all whitespace in front and behind a string. Don?t re-invent the wheel, instead read up on PHP?s APIs etc.
// Removes characters not valid in an e-mail address
function email($email){
$email = preg_replace(?/[^a-z0-9+_.@-]/i?,?,$email);
$email = strtolower($email);
return $email;
}
can be re-written as
// Removes characters not valid in an e-mail address
function email($email){
return strtolower(preg_replace(?/[^a-z0-9+_.@-]/i?,?,$email));
}
and second, I?d make it an e-mail validation instead of removing invalid characters.
Your next function:
// Removes tags, whitespace
function text($str){
// Ensure it?s a string
$str = strval($str);
// We strip all html tags
$str = strip_tags($str);
// Remove any whitespace using
// the define method above
$str = $this-&gt;whitespace($str);
return $str;
}
firstly has no logical name - what does a function ?text? do? Second, I wouldn?t reccomend using the strip_tags function - pass it a string like ?I pwn noobs like &lt; and etc? - the &lt; and everything behind it will be deleted. Or at least it did a few years ago when I last used it. Second, it?s kinda unneeded, since you can just call strip_tags(trim($str)); in your code.
The final method makes no sense whatsoever.
// Return the input as an integer
function integer($int){
$int = intval($int);
return $int;
}
You?re basically just calling intval, so why make a second method that calls intval again? Just call intval() right off in your example code and be done with it.
Also, the above methods WILL NOT prevent XSS attacks, which means that either you can?t be arsed to write an article that properly addresses the subject, or you have no clue what XSS is and, more importantly, how to prevent it.</div></summary>
  </entry>

  <entry>
    <title>The C4 Engine</title>
    <link href="http://greatjustice.info/the-c4-engine/"/>
    <id>http://yoursite/article/?i=93d2191e00de488f80bb128140539a63</id>
    <updated>2008-10-03T03:01:06-07:00</updated>
    <author>
      <name>http://greatjustice.info/the-c4-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">During the last 20 weeks (February to June &#8216;08), I and 7 other people have been working on a game project (both for university points and for this online group of dudes that started the creation of this particular game), 2 of them programmers, 5 of them artsy fags media students (who did models, textures, sketches, sound/music etc).
The game itself is a sci-fi tactical first person shooter (well, it&#8217;s supposed to be in a distant future, olz), which was basically in a half-assed concept stage for about a year or two, during which some very nice concept art drawings were made, but nothing concrete was made, such as actual game design (i.e. functional design) or background story.
The project was eventually put forward to our university as a project for the Game Design minor, and since then, we&#8217;ve been working on it for the last 20 weeks. In this post, I won&#8217;t go into detail about the project itself, but more into the 3D engine that was used: The C4 engine. 
About
The C4 Engine is written and maintained by Eric Lengyel, a mathematician slash application developer, who&#8217;s worked on the technologies behind several games, including several PS3 titles (although no actual names are given). He&#8217;s also written some or contributed to some books, including Mathematics for 3D Game Programming And Computer Graphics, so he bascially knows what he&#8217;s talking about.
C4&#8217;s got a load of features, including all the basic graphics capabilities one would want for a game, as well as a built-in world editor, graphical script editor, etc. The next version, 149, which is out now for licensed users, has a greatly improved graphical script editor, with conditionals and variables and whatnot (it didn&#8217;t have those earlier). Version 1.5, to be released late August if everything&#8217;s right, will come with a terrain editor and large outdoor terrain support (as in, the current version is mainly suitable for indoor or &#8216;roomed&#8217; environments, which can be divided into so-called zones, which are used to determine what has to be rendered etc).
For more info on C4&#8217;s features, look here.
The C4 engine is aimed at both professional users and &#8216;indie&#8217; game developers (independent, hobbyists, students etc). For both types, a license can be aquired. The indie category, such as we are, can get a license for as low as $200.-, which gives the licensee a lifetime license (= free updates to later versions), and allows 5 people to work on the engine and the engine&#8217;s code. However, this license type will be updated when version 1.5 (150) is released, and will be upped to $350,- accoring to the C4 website.  The engine is supplied as both the executables, plugins and, something unique, the full source code to both the engine and the demo game. That means that programmers can edit or add features to the engine itself, and get a deeper insight into the workings of the engine by reading its code.  According to the C4 engine&#8217;s website, some large corporations (such as Lockheed Martin) and universities have taken licenses for the C4 engine.

Screenshots
Let&#8217;s goan see some screenshots from the current demo game which, by the way, doesn&#8217;t show off the full potential of the demo game. The full-sized screenshots can be viewed here.

This first image shows a basic piece of a level with a so-called cube light, a light that basically projects a texture 360 degrees around it. In this case, it projects the insides of a lantern.

This next image displays a scene from the Cemetery level, a relatively new demo level. This particular screenshot displays an imported terrain (not using the terrain editor yet btw, just the height map import option), with a fog layer on top of it. The fog&#8217;s fully configureable, so you can set the height at which it starts, the color, the density, etc.
A feature not shown in this screenshot is the lightning effect, which lights up the entire level and plays thunder sounds and such. Once again, this isn&#8217;t a level that&#8217;s graphically the most impressive, just a limited feature showcase - see some of the screenshots for other games made with C4 for better examples.
The Ravensword game screenshots shows how good proper normal maps can look (normal map is a texture that contains height information, which is used to calculate shadows on the object itself, which translates to a perception of depth and detail). The screenshots for World of Subways (yes, a subway simulator game) look in roughly the same style as Half-Life 2, only more realistic (and with less zombies).

The above screenshot is taken from the primary demo level, and shows imported terrain for the overall layout of the land, a waterfall effect (made with C4&#8217;s particle system), water itself (which uses animated textures and portals for reflection / refraction, see also this tutorial on C4&#8217;s wiki on how the water effect was made.) , etcetera.

This next screenshot is of C4&#8217;s built-in world editor, which allows people to make their own worlds. On the left side is a menu bar, which contains all the tools a world editor can use. The pane next to that is the Scene Graph, a graphical representation of the internal structure of a world editor. A root node, the Infinite Zone, contains a handful of subnodes, such as geometries, light sources, etcetera, which in turn can contain several subnodes as well.

The above is a screenshot of C4&#8217;s graphical script editor, I&#8217;m fairly sure this is the old (or current) version. Version 149 of the engine, to be released soon, contains additional features that could, once fully developed, allow non-programmers to program the behavior of an NPC, for example.

Experiences
Anyways, this was supposed to be more of a review and experiences with the C4 engine, but eh, it&#8217;ll need a good intro in order for people to sorta know what we&#8217;re talking about.
We&#8217;ve spent a good 20 weeks on our project, half of which was spent designing our game and exploring the C4 engine. We played around and made some basic worlds with the world editor, dived into the demo game&#8217;s code and edited some stuff, added a weapon by following a tutorial, etcetera.
It was pretty daunting to begin with for several reasons:

A new language. Up until this project, all 3 of us (we had 3 programmers in our group) had little to no experience programming in C++ - I myself had done a fractal generator largely copied from the internets during a 2-week period. So with the C4 engine (which is written in C++, in case you didn&#8217;t realize that by now), we encountered new, unexplored problems like pointers and such. Scary.
A new environment. The C4 engine&#8217;s quite different from the Java libraries and such I&#8217;ve used before this, with a lot of tricks and such. For example, a lot of binary flags are used - basically a means of storing a large amount of boolean data into a single variable. But that was all learnable.
Poorly designed demo game. The engine itself is designed properly, but the demo game&#8217;s code looks as if it was programmed in some free saturday afternoons. There&#8217;s 500-lined functions containing large switch-statements which contain logic for pretty much all components for the demo game, to name an example. More on that later.
Lack of commenting / documentation. The C4 engine&#8217;s code itself is reasonably documented (it&#8217;s not entirely complete and in a format that basically forces you to view the online version),  but the demo game itself isn&#8217;t. There are some scarce one or two-lined comments in particular bits of code, but not by far complete. So in order to understand the inner workings of the demo game, we had to dive into the code itself and work according to some of the tutorials on the C4 wiki.  But after some time, we got the hang of it and knew enough of both the engine and the demo game&#8217;s code to add most of the features we wanted.

We added our own weapons (a handgun and an assault rifle), some of our own models (not all, which is why we didn&#8217;t get all the points for the end-product), animations (and animation control), sounds, and our own special features - distraction grenades, one that generated a &#8216;hologram&#8217;, one that played a sound, and one that displayed a flashing light pattern (which is supposed to look like gunfire). All three configureable by the player (by using an in-game selection menu), etc. They were all fired by the C4 demo game&#8217;s grenade launcher, but it&#8217;s the idea that counts.
We also added teams to the players (a multiplayer mode was already available), 3 game modes, and did some refactorings by splitting up some of the classes into their own files (a habit from Java, counteracted by the habit of whoever wrote the demo game to put loads of similar classes into a single file).  The end result was a game that displayed most of the features we had planned, but didn&#8217;t look as good and looked basically only half-finished, due to the lack of models and the levels being only half-finished. But I myself got most points, mainly due to programming.
Anyways, the C4 engine left a very good overall impression on me. I haven&#8217;t had any experience with other game engines (that is, unless you count ZZT as being a game engine), but those that do think that C4&#8217;s the most awesome and well thought-out engines they&#8217;ve encountered so far. The engine itself is very rich in features without looking cluttered or bloated, and is still in full development, a new version with new features being released every month or so. We started when the engine was at version 147, and when we were done, version 149 beta 2 was out. A few days ago, the final version of 149 was released, along with a new demo including new demo levels and everything.
Criticisms
The majority of criticisms we as programmers had on the engine was all in its demo game and the documentation. The code-level documentation is allright (see above), but in terms of &#8216;how do you do so-and-so&#8217;, it&#8217;s still lacking. For example, halfway our project I wanted to find out how the C4 networking system worked. At that time, the only documentation avaiable was an article on the C4 wiki, highlighting the basic assumptions and workings of the network and messaging system, and the API documentation itself on the messages and message manager, which sends and handles messages, as well as the network manager, which operates on a lower level.
So because of that, we were bascially forced to figure it all our on ourselves, mainly trying to get as much information as possible from the API documentation and the code found in the demo game. Because we didn&#8217;t want others to have the same problem (and spend as much time on solving it), we (read: I) wrote a two-part tutorial on C4&#8217;s messaging system, in which a basic chat application is made. You can find that tutorial right here, and part two here.
But yeah, not everything is as of yet documented and explained. There&#8217;s enough to get you going, but it&#8217;s just not all there yet.
The second major problem was the lack of design in the demo game. There&#8217;s at least a dozen examples to think of, but it&#8217;s kinda bollox to have to repeat them all here. I can do one example though, the weapon system in the demo game. According to the tutorial on the C4 wiki on adding a weapon to the demo game,  a programmer has to add two files to the project, and edit 12 (!) files to add it to the game. These files handle firing, selecting, picking up, ammo etc of the weapon. But the problem is that it&#8217;s so divided, it&#8217;s difficult to figure all that out on your own without the use of a tutorial. Not only that, but the weapon system is decentralized, or, to put it more bluntly, all over the place. There are .h and .cpp files for each type of weapon, but they don&#8217;t contain anything related to the weapon itself, only to the projectile fired by the weapon (if any). Firing the weapon happens in a very large method in the Fighter class, a controller for the player&#8217;s model, which is called each frame, checks if a timer has run down to 0, then checks what weapon is currently selected, re-sets the timer and calls a function that informs everyone that a projectile has been fired, which in turn generates a projectile and moves it every frame.
But that&#8217;s not how you&#8217;d want things to happen. You&#8217;d want each weapon to have its own files, and its own responsibilities.  You don&#8217;t want a fixed number somewhere in a very large method in the Fighter class to determine how fast a weapon fires, you want it to occur in the weapon&#8217;s file itself, and make it dynamic even if you think that&#8217;ll add something to your game or if you just want to tweak it.
And that&#8217;s just one example, there were at least 3 more specific modules of the demo game that were just designed&#8230; well, wrong. They worked fine, so functionally they were good, but their design was just awful (imo), everything was fixed at compile-time, loads of functionality was crammed into a single method, loads of responsibility into a single class, and so forth.
We didn&#8217;t have the time during our project to fix all this, so instead we (read: I) made a document in which the game&#8217;s modules are described, the problems occuring in those highlighted, and one or more solutions described and explained. I firstly put that up for assessment by the teachers (one for the techical design, the other for Written English), then offered it to the licensees and author of the C4 engine. So far, only two or three licensees have commented on it (both whom I doubt understand even half of what&#8217;s in there), and the author is yet to comment on it. He&#8217;s probably busy with the next version of the engine though, so I won&#8217;t blame him.
I&#8217;ve put the refactoring proposal online for your reading pleasure, maybe you can learn something from it. As I said on the forums when I posted it, any C&amp;C on it is welcome. Here&#8217;s the file:
Office 2007 version: Refactoring Proposal
Office 1997-2003 version:  Refactoring Proposal
It&#8217;s also an attempt at applying some design patterns, including the Composite, Visitor, Factory Method, and Prototype patterns. I&#8217;m sure that more patterns and refactorings can be applied to the demo game&#8217;s code, but the components described in the document should give a very good head start (if I say so myself, /smug). That, and if done right, could inspire others as well.
Currently, I&#8217;m finishing up on our project, and in order to get the last few points I&#8217;ve started to implement at least some of the refactorings proposed in the document into the C4 demo game, and publishing those refactorings on the forums. I probably won&#8217;t spend a lot of time on that anymore, since I haven&#8217;t had much feedback on the proposals, least of all from the author himself (i.e. the dude that actually matters). I even sent him a PM about the matter, but I&#8217;ve received no feedback whatsoever. Either he hasn&#8217;t gotten to it, or he&#8217;s just ignoring the whole thing - I&#8217;m suspecting the latter, and I don&#8217;t like it. But eh, it&#8217;s his product, and as such, his problem.
Conclusion
But, outside of the (in my opinion) poor design of the demo game, the C4 engine is pretty good. As said, I have no experience with other graphics engines, so I&#8217;m unable to provide a proper comparison, but from what I&#8217;ve seen of the C4 engine, its features, its relatively low price and all that, I&#8217;m impressed. It has pretty much everything anyone needs making a 3D video game, and the features it doesn&#8217;t have will be added in the coming versions. As I probably said in the beginning of this article, version 1.5 will add a terrain editor to the engine. I dunno how advanced it will be, but from what the author says about it, it&#8217;ll be technically quite impressive. (note that the author of the engine isn&#8217;t the first poster in the linked thread, but the dude with the red username etc).
All in all, I think that from a bang-for-buck point of view, the C4 engine is the best engine any beginning game developer can buy. For inexperienced or unmotivated programmers it may have a steep learning curve (mainly due to the poor design of the demo game - it&#8217;s all in there, but it&#8217;s hard to get it out), but it&#8217;ll be well worth it. I only wish the demo game had a better design, &#8217;cause right now it&#8217;s putting people off. Not as much as they&#8217;ve been put off by other affordable engines (judging by some of the forum posts by previous users of said engines), but still.</div></summary>
  </entry>

  <entry>
    <title>Applied design patterns: C4 Engine Messa</title>
    <link href="http://greatjustice.info/applied-design-patterns-c4-engine-messages/"/>
    <id>http://yoursite/article/?i=4fbce42757b8daf2be8eaaaaf0772184</id>
    <updated>2008-10-03T03:01:05-07:00</updated>
    <author>
      <name>http://greatjustice.info/applied</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In my previous article about the C4 engine, I highlighted what was, in my opinion, the biggest downside of the C4 engine: its demo game. Or more precisely, the code and design of the demo game. Because I had to get points for university and didn&#8217;t have time to dive into said code and refactor it all, I wrote a refactoring proposal (found here: Office &#8216;97-&#8217;03 / Office &#8216;07) and put it on the C4 Engine forums. After that, and after the project, I still had to get some points, so I executed some of the refactorings.
So far, most refactorings I&#8217;ve done involve moving functionality from one central Game class to different smaller classes - resource and game management so far. One refactoring however is one I&#8217;m pretty proud of (in all decency), and is described in the refactoring proposal as the Composite Message System.
In this article, I&#8217;ll (attemt to) explain the process of this particular refactoring: explain the old situation, what the problem was with that situation, how it was analyzed and how, eventually (and with the help of my trusty Design Patterns book) I came up with a replacement system of that situation, one that was a lot more flexible and reusable, and one that would accellerate the speed at which programmers could produce results.
For those that are interested, I&#8217;ll be discussing the Composite, Visitor, Factory Method and (to a lesser degree) Builder design patterns in this article.

Ye Olde slash Current Situation
While I&#8217;m not officially allowed to post any real code from the C4 engine or demo game, I&#8217;m pretty sure there&#8217;s no restrictions to discussing said code / design.
In the current situation, you can send messages to other clients through C4&#8217;s MessageMgr class, accessible through a global (shudder) variable, TheMessageMgr. The MessageMgr has a SendMessage method, which takes an address (in the form of the key of the recipient, managed by said MessageMgr) and a Message. This Message is a subclass of C4&#8217;s Message class, a class that contains some management functions (message ID number and such), but mainly defines the behavior of subclasses.
In a C4-made game, a subclass of Message has to be created for each message type. For example, say you want to send a chat message to a certain player. In C4, you&#8217;ll have to create a new class ChatMessage, which extends Message. ChatMessage would contain two variables: Sender, a long value referring to the player who sent the message, and Message, a String (or character array) containing the actual message.
C4&#8217;s Message interface defines that any Message should also implement a Compress() and a Decompress() method, two methods that basically pass a Compressor and/or a Decompressor object to the Message object, on which methods can be called so that the Message can add and extract its own data from a byte stream (or whatever, I don&#8217;t know / don&#8217;t need to know how the data is actually represented inside the Compressor / Decompressor objects). So you&#8217;ll have the following methods:
void ChatMessage::Compress(Compressor&amp; data)
{
data &lt;&lt; sender;
data &lt;&lt; message;
}
bool ChatMessage::Decompress(Decompressor&amp; data)
{
data &gt;&gt; sender;
data &gt;&gt; message;
}
Basically, the Compressor and Decompressor implement the &lt;&lt; and &gt;&gt; operators, which add and extract the data from their internal representation. This actually adheres to the Visitor design pattern already, where a client sends an object to another object, where this other object (a Message subclass in this case) calls methods on the visiting object to, in this case, add data to it.
So, in total, to create a new Message type, you have to create a new class (in a header file) containing the class itself, the fields, two constructors, accessors for the fields, and a Compress and Decompress method. Next, implement the methods defined in the header file in a .cpp file (as well as message sending and receiving functionality, but that&#8217;s something for another day.) Sounds straightforward enough, and to be honest, it is.
However.

Say you want to create  another message that sends an announcement to all players, say, a server message that appears in the middle of each player&#8217;s screen. Simple enough, create a new Message class that contains a string and done. Rinse and repeat the above operations of new files, new class, constructors, compress / decompress, accessors, and implementation. Next, you want to send a notification that playey X has left the game. Again, simple enough, just create a new message type PlayerLeftMessage, which contains just one long value (the player key), constructors, accessors, compress/decompress, implement&#8230; wait a minute, didn&#8217;t we do that earlier?
The observant reader will notice that in the above example, three full-on message types were created, each about 50 lines in total (no comments, with whitespace), and each containing roughly the same methods and functionality. The only actual difference between the three is the data they contain / send, and an internal key to uniquely identify the message type on reception. Not very much. And yet, you have to create a full class for it.
Let&#8217;s break it down a bit more. The types of data that can be sent over a network is limited by what the Compressor and Decompressor classes can handle in their &lt;&lt; and &gt;&gt; operators. These types include:

Booleans
Floating point numbers
Chars / Unsigned chars
Character arrays (Strings)
Shorts / Unsigned shorts
Longs / Unsigned longs
Long64 / Ulong64 (64 bits integers)

All messages, one way or the other, send these and only these values. More advanced data types, such as for example the Vector3D type, are broken down into components and sent. The Vector3D is broken down into 3 floating point numbers (floats), for example.
What does this mean? It means that, one way or the other, every message is composed of the above data types.  Every message type converts the data they have to send to these types. They all do, no exceptions.
Solution
As I came to realize this, I figured there had to be a better, more flexibe way to define new message types, using the components described above. I read the chapter in the Design Patterns book on the Composite design pattern (since all message types were &#8216;composed&#8217; of the above types), and attempted to work out a solution, as described in the refactoring proposal document.
The solution involved defining a class structure that allows a client to dynamically assemble (&#8217;compose&#8217;) a message type from both simple and complex &#8216;modules&#8217;, building blocks so to speak. There&#8217;s basically two types of building blocks: &#8216;Leaf&#8217;-blocks and &#8216;Composed&#8217; blocks. Leaf blocks are the lowest point in the imaginary Composite Message tree, and contain one type of data - corresponding to the above list of Compressor-supported data types. It contains just one field, and implements both the Compress and Decompress methods defined by C4&#8217;s Message class.
The Composed block is a bit more advanced. It contains an internal list of other blocks (which can be either other Composed objects or leaves), and methods for traversing that list. It also implements the Compress and Decompress method, but instead of calling the Compressor / Decompressor&#8217;s &lt;&lt; and &gt;&gt; operators, it passes the Compressor / Decompressor objects on to its subnodes&#8217; own Compress / Decompress methods, so they can perform whatever action they need to do on it. If one of the subnodes is a leaf node, it&#8217;ll add or extract its own locally stored data to the Compressor / Decompressor object. If it&#8217;s another Composed node, it&#8217;ll pass the Compressor / Decompressor on to its children.
The figure below illustrates.

In this diagram, SomeMessage and Vector3DMessage are Composed Messages, while StringMessage, LongMessage and FloatMessage are leaf messages. All message nodes can be treated equally - they all, directly or indirectly, inherit from C4&#8217;s Message class. They all implement a Compress / Decompress method. They&#8217;re also all subclasses of a custom CompositeMessage type, which defines methods for traversing the tree.
To construct a CompositeMessage, which now is a means of defining a new Message type as described earlier, all a programmer has to do now is a handful of code statements:
CompositeMessage * message = new ComposedMessage();
message-&gt;AddSubnode(new StringMessage(&#8221;some string here&#8221;));
message-&gt;AddSubnode(new LongMessage(10));
TheMessageMgr-&gt;SendMessage(message);
Three lines to create a new message type that would otherwise take 50. Quite an improvement, if I say so myself. Of course, there&#8217;s more to this than the above, as I realized after I had thought out this design.
You now have a tree of CompositeMessage objects, which are either ComposedMessage or LeafMessage types. Which one? No clue - as it should be. Proper OO programming involves not knowing or needing to know what specific implementation of a class you&#8217;re working with. So in the above example, you could see the entire tree as a tree of CompositeMessage objects.
Extracting data
However. How are you supposed to get the data stored in that from it now? This was the problem I had as well, and which I discussed with some people on the internets. From those, I gathered the Visitor design pattern is usually the means of traversing a tree and getting data from it.
Earlier in this article, we briefly passed this Visitor design pattern - the Compress and Decompress methods in the Message subclasses are both Visitor methods. The Compressor and Decompressor objects passed to those are Visitor objects. Such an approach could also be used in the Composite Message type.
In order to extract the data from a Composed message, I thought up a Visitor object that contained a list of sorts for each supported data type, as well as accessors for those. For each data type, there&#8217;s an AddXValue() and an GetXValue() method, that in turn adds a value of type X to the Visitor and get a value of type X from the Visitor. GetXValue will return the first X value when it&#8217;s called the first time, the second when called the second time, etcetera - according to a first in, first out pattern.
In the CompositeMessage type, a Visit method was added for each subclass to implement, which passes a Visitor object to the object. A Leaf subclass would implement it by calling Visitor-&gt;AddXValue(), passing its locally stored value to the Visitor. A Composed subclass would implement it by passing the Visitor to each of its subnodes.
Once the Visitor has traversed all the nodes of the Composite message, it&#8217;s filled with data, which can be extracted by the client again using the GetXValue() methods. An example:
CompositeMessage * message = new ComposedMessage();
message-&gt;AddSubnode(new StringMessage(&#8221;some string here&#8221;));
message-&gt;AddSubnode(new LongMessage(10));
Visitor * visitor = new Visitor();
message-&gt;Visit(visitor);
String * someString = message-&gt;GetStringValue();
long someLong = message-&gt;GetLongValue();
Looks straightforward enough. The only thing to keep in mind is that the data should be extracted in the order the composite message was assembled. This method can also be used to fill the CompositeMessage with data, by defining a FillVisit method for each CompositeMessage subclass. Instead of calling Visitor-&gt;SetXValue() however, the GetXValue() method is called and its resulting value is set as the object&#8217;s local data.
Speaking of assembling, it&#8217;s best if a CompositeMessage type is assembled from only one point in the program, so that the exact same structure is maintained each time the CompositeMessage is composed (or &#8216;built&#8217;). To accomplish this, we&#8217;ll use the Factory Method design pattern. For each Composite message type, we define a construction method that takes the initial values of the various components of the Composite Message. Here&#8217;s an example:
CompositeMessage * CreateSomeMessage(Vector3D someVector, long someLong, float someFloat)
{
CompositeMessage * message = new CompositeMessage();
message-&gt;addSubnode(new Vector3DMessage(someVector));
message-&gt;addSubnode(new LongMessage(someLong));
message-&gt;addSubnode(new FloatMessage(someFloat));
return message;
}
Simple and straightforward enough.
Consequences
This structure has both up- and downsides.
Using this structure makes it a lot easier to quickly create new message types. The process of new files, new class, fields, constructors, accessors, compress/decompress methods and all that is no longer needed, instead a programmer now assembles a message in three lines that earlier took 50, not counting documentation. Chucking it into a Factory Method as defined above adds some lines, but still nowhere near 50. This leads to increased production speed, and allows the programmer to concentrate on his task of solving problems, instead of the tedious business of writing the same class over and over again, with only slight differences.
Dynamic. With this structure, it&#8217;s possible to define message types at runtime, based on various factors. As such, the complexity of a message can be adjusted to the requirements. You could create a large, complex composite message for a player&#8217;s initial data, then adjust it to a much smaller / simpler one that only contains the data that has been updated.
Compatible with existing Message system. There&#8217;s no need whatsoever to change anything in the engine&#8217;s network code, since as far as the engine&#8217;s concerned, the CompositeMessage is just yet another Message. So this system can easily be used alongside existing messages, so that a transferrence from or to this system can be executed gradually, one message type at at time, without breaking the rest of the application.
There are however also some disadvantages to this system:
For one, it&#8217;s not as straightforward anymore. In the old system, all you had to do was call message-&gt;GetSender() (or something) to get the sender of a chat message. Now, you first have to create a Visitor object, pass it to the composite message, and call GetLongValue() from the Visitor. It&#8217;s a few extra steps, and it&#8217;s a lot more ambiguous - who says the long value received from the Visitor is really a player&#8217;s key? It&#8217;s uncertain, which means that in order to use this system, you have to keep track of the message type, and the order of data.
Also, it&#8217;s slower than the existing. The existing method was just a class with some message. Sending a new message involved creating a new instance of this class, and done. Creating a new CompositeMessage instance involves creating an X-amount of new objects, depending on the amount of data to be sent, and calling several methods on said objects before it can be sent. And that&#8217;s not all, for when it&#8217;s received again, the entire tree has to be traversed twice - once by the Decompressor object to fill it with data, and once again by the Visitor object to extract the data. How much slower this is, I don&#8217;t know - if in fact it is measureable - but it requires more instructions than the existing system. I&#8217;m guessing the performance decrease is negligible though, considering that at the same time messages are received and such, C4&#8217;s engine calculates loads of matrix transforms and whatnot.
Finally, this system can be used alongside the existing message system. Didn&#8217;t I already say that before? I did, since this point can be seen as both an advantage and a disadvantage. It&#8217;s in this case disadvantageous because the two message systems can become confused with each other - when one message is a class and another is a CompositeMessage, you&#8217;ll end up with maintaining two different systems. It&#8217;s best to do either one or the other, not both. But I guess that&#8217;s also personal.

Code
Anyway, for points I went and implemented the system (or a version thereof) explained in the refactoring proposal document. I&#8217;ll post the code below, but first, a warning: I haven&#8217;t properly tested this code. I did translate a few messages to the system, but nothing really complex, and nowhere enough to say this code is safe. If you&#8217;re planning on using this code, don&#8217;t assume it&#8217;ll work. I won&#8217;t give any guarantees.
Here&#8217;s the code. Hope you don&#8217;t mind the massive amount of code (relatively), and that Wordpress messed up the indentation.
CompositeMessage.h
#ifndef CompositeMessage_h
#define CompositeMessage_h
#include &#8220;C4Messages.h&#8221;
#include &#8220;C4Engine.h&#8221;
namespace C4
{
/*
The Visitor class is a class representing an object that is able to traverse a
Complex Message structure to gather data.
*/
class Visitor
{
private:
// For each data types, two fields have to be defined:
// * The array (or whatever) used to store the data
// * A counter keeping track of the last data returned.
// Long values
Array longValues;
long currentLongValue;
Array unsignedLongValues;
long currentUnsignedLongValue;
// Boolean values
Array boolValues;
long currentBoolValue;
// Float values
Array floatValues;
long currentFloatValue;
// String values
Array stringValues;
long currentStringValue;
// Char values
Array charValues;
long currentCharValue;
Array unsignedCharValues;
long currentUnsignedCharValue;
// Short values
Array shortValues;
long currentShortValue;
Array unsignedShortValues;
long currentUnsignedShortValue;
// long64 values
Array long64Values;
long currentLong64Value;
Array
unsignedLong64Values;
long currentUnsignedLong64Value;
public:
Visitor();
~Visitor();
// Long values
void AddLongValue(long value);
long GetLongValue(void);
void AddUnsignedLongValue(unsigned long value);
unsigned long GetUnsignedLongValue(void);
// Bool values
void AddBoolValue(bool value);
bool GetBoolValue(void);
// Float values
void AddFloatValue(float value);
float GetFloatValue(void);
// String values
void AddStringValue(const char * value);
const char * GetStringValue(void);
// Char values
void AddCharValue(char value);
char GetCharValue(void);
void AddUnsignedCharValue(unsigned char value);
unsigned char GetUnsignedCharValue(void);
// Short values
void AddShortValue(short value);
short GetShortValue(void);
void AddUnsignedShortValue(unsigned short value);
unsigned short GetUnsignedShortValue(void);
// Long64 values
void AddLong64Value(long64 value);
long64 GetLong64Value(void);
void AddUnsignedLong64Value(ulong64 value);
ulong64 GetUnsignedLong64Value(void);
};
/*
The CompositeMessage class acts as the interface to all CompositeMessage subclasses,
and defines the basic behavior of all subclasses. The main two subclasses to this class
are LeafMessage and ComposedMessage - see those for more information.
*/
class CompositeMessage : public Message
{
public:
// Constructor, used to set an identifier for the Message.
// Passes type to the Message constructor.
CompositeMessage(MessageType type);
~CompositeMessage(void);
// The Compress method is called right before a Message is sent.
virtual void Compress(Compressor&amp; data) const;
// The Decompress method is called after the type of a Message has
// been determined.
virtual bool Decompress(Decompressor&amp; data);
// The Add method adds a subnode to a CompositeMessage.
virtual void Add(CompositeMessage * subnode);
// The Visit method should, when implemented by a leaf class,
// pass its data to the Visitor object. When implemented by a Composed
// class, it should pass the Visitor to its subnodes and, when appropriate,
// extract the data from the visitor, assemble its complex object, and
// pass that to the Visitor again.
virtual void Visit(Visitor * visitor) const;
// The FillVisit method works the same as the Visit method, except should
// be used to extract data from the Visitor and assign that data to the local
// fields. Once again, Composed message types should pass the Visitor on to
// subclasses.
virtual void FillVisit(Visitor * visitor);
// The GetData method is implemented by the CompositeMessage itself,
// and will create a Visitor object, send it through its own structure
// (regardless of whether it&#8217;s a tree or just a single node), and return
// the filled Visitor to the calling client.
virtual Visitor * GetData(void) const;
};
/*
The LeafMessage class is the parent class to all Composite Message nodes
that do not have any subnodes of themselves. Therefore, the Add method
will remain unimplemented (i.e. will do nothing) for Leaf nodes.
Subclasses usually contain one basic type value, so you get
BoolMessage, LongMessage etc subclasses to this class.
Note that LeafMessage is an abstract class, and does not implement
any functions itself.
*/
class LeafMessage : public CompositeMessage
{
public:
LeafMessage(MessageType type);
~LeafMessage(void);
// Compresses the local data into a Compressor.
virtual void Compress(Compressor&amp; data) const;
// Extracts data from the Decompressor and stores it in a local value
virtual bool Decompress(Decompressor&amp; data);
// Stores locally stored data into the given Visitor object.
virtual void Visit(Visitor * visitor) const;
// Extracts data from the Visitor object and stores it locally.
virtual void FillVisit(Visitor * visitor);
};
/*
The ComposedMessage class is a class that can be used
to compose more comples messages. It implements the Add,
Compress, Decompress, Visit and FillVisit methods,
each of which will traverse the array of subnodes
also defined in this class.
Subclasses that implement these four classes should all,
at one point, call this class&#8217;s implementations. This can
be done either before or after doing their own thing.
*/
class ComposedMessage : public CompositeMessage
{
private:
Array subnodes;
public:
ComposedMessage(MessageType type);
~ComposedMessage(void);
// Adds the passed CompositeMessage, which can either be a leaf or another ComposedMessage,
// to the list of subnodes.
void Add(CompositeMessage * subnode);
// Will iterate through all subnodes and pass the Compressor object to each
// subnode&#8217;s Compress method.
void Compress(Compressor&amp; data) const;
// Will iterate through all subnodes and pass the Decompressor object to each
// subnode&#8217;s Deompress method.
bool Decompress(Decompressor&amp; data);
// Will iterate through all subnodes and pass the Visitor object to each
// subnode&#8217;s Visit method.
void Visit(Visitor * visitor) const;
// Will iterate through all subnodes and pass the Visitor object to each
// subnode&#8217;s FillVisit method.
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store a boolean value.
*/
class BoolMessage : public LeafMessage
{
private:
bool value;
public:
BoolMessage(MessageType type, bool val = false);
BoolMessage(bool val = false);
~BoolMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor* visitor);
};
/*
Leaf Message type used to store a long value.
*/
class LongMessage : public LeafMessage
{
private:
long value;
public:
LongMessage(long val = 0L);
LongMessage(MessageType type, long val = 0L);
~LongMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store an unsigned long value.
*/
class UnsignedLongMessage : public LeafMessage
{
private:
unsigned long value;
public:
UnsignedLongMessage(unsigned long val = 0L);
UnsignedLongMessage(MessageType type, unsigned long val);
~UnsignedLongMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store a long64 value. (see C4Types.h for long64 info)
*/
class Long64Message : public LeafMessage
{
private:
long64 value;
public:
Long64Message(long64 val = 0L);
Long64Message(MessageType type, long64 val = 0L);
~Long64Message(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store an ulong64 (unsigned long64) value. (see C4Types.h for ulong64 info)
*/
class UnsignedLong64Message : public LeafMessage
{
private:
ulong64 value;
public:
UnsignedLong64Message(ulong64 val = 0L);
UnsignedLong64Message(MessageType type, ulong64 val = 0L);
~UnsignedLong64Message(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store a char value.
*/
class CharMessage : public LeafMessage
{
private:
char value;
public:
CharMessage(char val = &#8216; &#8216;);
CharMessage(MessageType type, char val);
~CharMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store an unsigned char value.
*/
class UnsignedCharMessage : public LeafMessage
{
private:
unsigned char value;
public:
UnsignedCharMessage(unsigned char val = &#8216; &#8216;);
UnsignedCharMessage(MessageType type, unsigned char val = &#8216; &#8216;);
~UnsignedCharMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store a string (or char pointer / array) value.
See also C4String.h.
*/
class StringMessage : public LeafMessage
{
private:
String value;
public:
StringMessage(const char * val = &#8220;&#8221;);
StringMessage(MessageType type, const char * val = &#8220;&#8221;);
~StringMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store a short value.
*/
class ShortMessage : public LeafMessage
{
private:
short value;
public:
ShortMessage(short val = 0);
ShortMessage(MessageType type, short val = 0);
~ShortMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store an unsigned short value.
*/
class UnsignedShortMessage : public LeafMessage
{
private:
unsigned short value;
public:
UnsignedShortMessage(unsigned short val = 0);
UnsignedShortMessage(MessageType type, unsigned short val = 0);
~UnsignedShortMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
Leaf Message type used to store a float value.
*/
class FloatMessage : public LeafMessage
{
private:
float value;
public:
FloatMessage(float val = 0.0F);
FloatMessage(MessageType type, float val = 0.0F);
~FloatMessage(void);
void Compress(Compressor&amp; data) const;
bool Decompress(Decompressor&amp; data);
void Visit(Visitor * visitor) const;
void FillVisit(Visitor * visitor);
};
/*
The MessageTypeManager class is a supportive class for the Composite Message system,
and defines / can define a list of factory methods that assemble a Composite Message.
Optionally, parameters can be passed to the factory method of each message type,
which contain the data to be assigned to the nodes of the composed message.
However, keep in mind that empty composed messages should also be created,
for when a Message is received but not decompressed yet.
I&#8217;ve only put a few examples in this class, cba to do all current message types.
There&#8217;s a description of each message type in their implementations, see the .cpp file
for information and usage etc.
In the examples put into those comments, pay particular attention to the lack of casts
to a specific message type. All messages, when received, are cast into a CompositeMessage
type - none of the underlying classes are ever directly used by a client.
In a system where all Messages have been replaced by CompositeMessages, a ReceiveMessage
method would only have to do a single cast at the top of the method, from C4&#8217;s Message
to this CompositeMessage type. A massive reduction in casts is a result, and a result from
that is more reliable and type-safe code.
*/
class MessageTypeManager
{
public:
static CompositeMessage * GetServerInfoMessage(long playerCount = 0L, long maxPlayerCount = 0L, String gameName = &#8220;&#8221;, ResourceName worldName = &#8220;&#8221;);
static CompositeMessage * GetGameInfoMessage(unsigned long flags = 0L, ResourceName world = &#8220;&#8221;);
static CompositeMessage * GetUpdateScoreMessage(long playerScore = 0L);
static CompositeMessage * GetUpdateHealthMessage(long playerHealth = 0L);
static CompositeMessage * GetClientOrientationMessage(float azimuth = 0.0F, float altitude = 0.0F);
};
}
#endif
CompositeMessage.cpp
#include &#8220;CompositeMessage.h&#8221;
#include &#8220;MGMultiplayer.h&#8221; // message types
using namespace C4;
Visitor::Visitor()
{
// set all &#8216;current X value&#8217; indicator to 0.
currentLongValue = 0L;
currentUnsignedLongValue = 0L;
currentBoolValue = 0L;
currentFloatValue = 0L;
currentStringValue = 0L;
currentCharValue = 0L;
currentUnsignedCharValue = 0L;
currentShortValue = 0L;
currentUnsignedShortValue = 0L;
currentLong64Value = 0L;
currentUnsignedLong64Value = 0L;
}
Visitor::~Visitor()
{
}
// Adds a long value to the array.
void Visitor::AddLongValue(long value)
{
longValues.AddElement(value);
}
// Gets a long value from the array, or 0 if the array will exceed its bounds.
long Visitor::GetLongValue(void)
{
if (currentLongValue &gt;= longValues.GetElementCount())
return 0;
else
return (longValues[currentLongValue++]);
}
// Adds an unsigned long value to the array.
void Visitor::AddUnsignedLongValue(unsigned long value){
unsignedLongValues.AddElement(value);
}
// Gets an unsigned long value from the array, or 0 if the array will exceed its bounds.
unsigned long Visitor::GetUnsignedLongValue(void){
if (currentUnsignedLongValue &gt;= unsignedLongValues.GetElementCount())
return 0;
else
return (unsignedLongValues[currentUnsignedLongValue++]);
}
void Visitor::AddBoolValue(bool value){
boolValues.AddElement(value);
}
bool Visitor::GetBoolValue(void){
if (currentBoolValue &gt;= boolValues.GetElementCount())
return false;
else
return (boolValues[currentBoolValue++]);
}
void Visitor::AddFloatValue(float value){
floatValues.AddElement(value);
}
float Visitor::GetFloatValue(void){
if (currentFloatValue &gt;= floatValues.GetElementCount())
return false;
else
return (floatValues[currentFloatValue++]);
}
void Visitor::AddStringValue(const char * value){
stringValues.AddElement(value);
}
const char * Visitor::GetStringValue(void){
if (currentStringValue &gt;= stringValues.GetElementCount())
return &#8220;&#8221;;
else
return (stringValues[currentStringValue++]);
}
void Visitor::AddCharValue(char value){
charValues.AddElement(value);
}
char Visitor::GetCharValue(void){
if (currentCharValue &gt;= charValues.GetElementCount())
return &#8216; &#8216;;
else
return (charValues[currentCharValue++]);
}
void Visitor::AddUnsignedCharValue(unsigned char value){
unsignedCharValues.AddElement(value);
}
unsigned char Visitor::GetUnsignedCharValue(void){
if (currentUnsignedCharValue &gt;= charValues.GetElementCount())
return &#8216; &#8216;;
else
return (unsignedCharValues[currentUnsignedCharValue++]);
}
void Visitor::AddShortValue(short value){
shortValues.AddElement(value);
}
short Visitor::GetShortValue(void){
if (currentShortValue &gt;= shortValues.GetElementCount())
return 0;
else
return (shortValues[currentShortValue++]);
}
void Visitor::AddUnsignedShortValue(unsigned short value){
unsignedShortValues.AddElement(value);
}
unsigned short Visitor::GetUnsignedShortValue(void){
if (currentUnsignedShortValue &gt;= unsignedShortValues.GetElementCount())
return 0;
else
return (unsignedShortValues[currentUnsignedShortValue++]);
}
void Visitor::AddLong64Value(long64 value){
long64Values.AddElement(value);
}
long64 Visitor::GetLong64Value(void)
{
if (currentLong64Value &gt;= long64Values.GetElementCount())
return 0;
else
return (long64Values[currentLong64Value++]);
}
void Visitor::AddUnsignedLong64Value(ulong64 value){
unsignedLong64Values.AddElement(value);
}
ulong64 Visitor::GetUnsignedLong64Value(void){
if (currentUnsignedLong64Value &gt;= unsignedLong64Values.GetElementCount())
return 0;
else
return (unsignedLong64Values[currentUnsignedLong64Value++]);
}
// Compsite Message implementation.
// Constructor calls the parent constructor, passing the type parameter.
CompositeMessage::CompositeMessage(MessageType type) : Message(type){}
CompositeMessage::~CompositeMessage(void){}
void CompositeMessage::Compress(Compressor &amp;data) const{}
bool CompositeMessage::Decompress(Decompressor &amp;data) {return true;}
void CompositeMessage::Add(CompositeMessage * subnode) {}
void CompositeMessage::Visit(C4::Visitor * visitor) const {}
void CompositeMessage::FillVisit(C4::Visitor * visitor){}
/*
Creates a Visitor object and passes it to the Visit method, which
is implemented differently depending on what subclass of CompositeMessage
is currently used. When passed, the Visitor is returned.
*/
Visitor * CompositeMessage::GetData(void) const {
Visitor * visitor = new Visitor();
Visit(visitor);
return visitor;
}
// LeafMessage constructor, calls the parent CompositeMessage constructor
// passing the type parameter to it.
LeafMessage::LeafMessage(MessageType type) : CompositeMessage(type){}
LeafMessage::~LeafMessage(void){}
void LeafMessage::Compress(Compressor&amp; data) const {}
bool LeafMessage::Decompress(Decompressor&amp; data) {return true;}
void LeafMessage::Visit(Visitor * visitor) const {}
void LeafMessage::FillVisit(Visitor * visitor) {}
/*
ComposedMessage implementation.
*/
ComposedMessage::ComposedMessage(MessageType type) : CompositeMessage(type) {}
// deletes all the subnodes (if any) recursively.
ComposedMessage::~ComposedMessage(void)
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a]) delete subnodes[a];
}
}
// Adds the given element to the subnode array.
void ComposedMessage::Add(CompositeMessage * subnode)
{
subnodes.AddElement(subnode);
}
// Passes the Compressor to all subnodes&#8217; Compress methods.
void ComposedMessage::Compress(Compressor&amp; data) const
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a]) subnodes[a]-&gt;Compress(data);
}
}
// Passes the Decompressor to all subnodes&#8217; Decompress methods.
bool ComposedMessage::Decompress(Decompressor &amp;data)
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a])
{
if (!(subnodes[a]-&gt;Decompress(data)))
return false;
}
}
return true;
}
// Passes the Visitor object to all subnodes&#8217; Visit methods.
void ComposedMessage::Visit(Visitor * visitor) const
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a])
subnodes[a]-&gt;Visit(visitor);
}
}
// Passes the Visitor object to all subnodes&#8217; FillVisit methods.
void ComposedMessage::FillVisit(Visitor *visitor)
{
long count = subnodes.GetElementCount();
for (natural a = 0; a &lt; count; a++)
{
if (subnodes[a])
subnodes[a]-&gt;FillVisit(visitor);
}
}
/*
BoolMessage implementation
*/
BoolMessage::BoolMessage(bool val) : LeafMessage(kMessageBool)
{
value = val;
}
BoolMessage::BoolMessage(MessageType type, bool val) : LeafMessage(type)
{
value = val;
}
BoolMessage::~BoolMessage(void) {}
void BoolMessage::Compress(Compressor&amp; data) const
{
data &lt;&lt; value;
}
bool BoolMessage::Decompress(Decompressor&amp; data)
{
data &gt;&gt; value;
return (true);
}
void BoolMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddBoolValue(value);
}
void BoolMessage::FillVisit(Visitor *visitor)
{
value = visitor-&gt;GetBoolValue();
}
/*
LongMessage implementation
*/
LongMessage::LongMessage(long val) : LeafMessage(kMessageLong)
{
value = val;
}
LongMessage::LongMessage(MessageType type, long val) : LeafMessage(type)
{
value = val;
}
LongMessage::~LongMessage(void) {}
void LongMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool LongMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void LongMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddLongValue(value);
}
void LongMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetLongValue();
}
/*
UnsignedLongMessage implementation
*/
UnsignedLongMessage::UnsignedLongMessage(unsigned long val) : LeafMessage(kMessageUnsignedLong)
{
value = val;
}
UnsignedLongMessage::UnsignedLongMessage(unsigned long val, MessageType type) : LeafMessage(type)
{
value = val;
}
UnsignedLongMessage::~UnsignedLongMessage(void) {}
void UnsignedLongMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool UnsignedLongMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void UnsignedLongMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedLongValue(value);
}
void UnsignedLongMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedLongValue();
}
/*
Long64Message implementation
*/
Long64Message::Long64Message(long64 val) : LeafMessage(kMessageLong64)
{
value = val;
}
Long64Message::Long64Message(MessageType type, long64 val) : LeafMessage(type)
{
value = val;
}
Long64Message::~Long64Message(void) {}
void Long64Message::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool Long64Message::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void Long64Message::Visit(Visitor * visitor) const
{
visitor-&gt;AddLong64Value(value);
}
void Long64Message::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetLong64Value();
}
/*
UnsignedLong64Message implementation
*/
UnsignedLong64Message::UnsignedLong64Message(ulong64 val) : LeafMessage(kMessageUnsignedLong64)
{
value = val;
}
UnsignedLong64Message::UnsignedLong64Message(MessageType type, ulong64 val) : LeafMessage(type)
{
value = val;
}
UnsignedLong64Message::~UnsignedLong64Message(void) {}
void UnsignedLong64Message::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool UnsignedLong64Message::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void UnsignedLong64Message::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedLong64Value(value);
}
void UnsignedLong64Message::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedLong64Value();
}
/*
CharMessage implementation
*/
CharMessage::CharMessage(char val) : LeafMessage(kMessageChar)
{
value = val;
}
CharMessage::CharMessage(MessageType type, char val) : LeafMessage(type)
{
value = val;
}
CharMessage::~CharMessage(void) {}
void CharMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool CharMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void CharMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddCharValue(value);
}
void CharMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetCharValue();
}
/*
UnsignedCharMessage implementation
*/
UnsignedCharMessage::UnsignedCharMessage(unsigned char val) : LeafMessage(kMessageUnsignedChar)
{
value = val;
}
UnsignedCharMessage::UnsignedCharMessage(MessageType type, unsigned char val) : LeafMessage(type)
{
value = val;
}
UnsignedCharMessage::~UnsignedCharMessage(void) {}
void UnsignedCharMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool UnsignedCharMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void UnsignedCharMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedCharValue(value);
}
void UnsignedCharMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedCharValue();
}
/*
StringMessage implementation
*/
StringMessage::StringMessage(const char *val) : LeafMessage(kMessageString)
{
value = val;
}
StringMessage::StringMessage(MessageType type, const char *val) : LeafMessage(type)
{
value = val;
}
StringMessage::~StringMessage(void) {}
void StringMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool StringMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void StringMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddStringValue(value);
}
void StringMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetStringValue();
}
/*
ShortMessage implementation
*/
ShortMessage::ShortMessage(short val) : LeafMessage(kMessageShort)
{
value = val;
}
ShortMessage::ShortMessage(MessageType type, short val) : LeafMessage(type)
{
value = val;
}
ShortMessage::~ShortMessage(void) {}
void ShortMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool ShortMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void ShortMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddShortValue(value);
}
void ShortMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetShortValue();
}
/*
UnsignedShortMessage implementation
*/
UnsignedShortMessage::UnsignedShortMessage(unsigned short val) : LeafMessage(kMessageUnsignedShort)
{
value = val;
}
UnsignedShortMessage::UnsignedShortMessage(MessageType type, unsigned short val) : LeafMessage(type)
{
value = val;
}
UnsignedShortMessage::~UnsignedShortMessage(void) {}
void UnsignedShortMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool UnsignedShortMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void UnsignedShortMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddUnsignedShortValue(value);
}
void UnsignedShortMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetUnsignedShortValue();
}
/*
FloatMessage implementation
*/
FloatMessage::FloatMessage(float val) : LeafMessage(kMessageFloat)
{
value = val;
}
FloatMessage::FloatMessage(MessageType type, float val) : LeafMessage(type)
{
value = val;
}
FloatMessage::~FloatMessage(void) {}
void FloatMessage::Compress(Compressor &amp;data) const
{
data &lt;&lt; value;
}
bool FloatMessage::Decompress(C4::Decompressor &amp;data)
{
data &gt;&gt; value;
return (true);
}
void FloatMessage::Visit(Visitor * visitor) const
{
visitor-&gt;AddFloatValue(value);
}
void FloatMessage::FillVisit(Visitor * visitor)
{
value = visitor-&gt;GetFloatValue();
}
/*
Creates and returns a CompositeMessage containing two long values and two string values.
Usage:
Creating new filled ServerInfoMessage composite message:
// parameters are all the params you want to send.
CompositeMessage * message = MessageTypeManager::GetServerInfoMessage(playerCount, maxPlayerCount, gameName, worldName);
TheMessageMgr-&gt;SendMessage(addressee, *message);
// (note that there should be a star in front of the &#8216;message&#8217; param in the sendmessage method, since the
// GetServerInfoMessage method returns a pointer to the message, whereas the SendMessage method expects
// a reference instead.
// Also, the message should probably be deleted after this, but I dunno if the message is sent right
// away or stored in a cache for a while, which could lead to unexpected results if the message is deleted.
Receiving incoming ServerInfoMessage composite message type:
CompositeMessage * msg = static_cast(message);
Visitor * v = msg-&gt;GetData();
long playerCount = v-&gt;GetLongValue();
long maxPlayerCount = v-&gt;GetLongValue();
String gameName = v-&gt;GetStringValue();
ResourceName worldName = v-&gt;GetStringValue();
// note that the order of inserting and extracting data of the same type should be the same on both
// the sending and receiving side.
*/
CompositeMessage * MessageTypeManager::GetServerInfoMessage(long playerCount, long maxPlayerCount, String gameName, ResourceName worldName)
{
CompositeMessage * message = new ComposedMessage(kMessageServerInfo);
message-&gt;Add(new LongMessage(playerCount));
message-&gt;Add(new LongMessage(maxPlayerCount));
message-&gt;Add(new StringMessage(gameName));
message-&gt;Add(new StringMessage(worldName));
return message;
}
/*
Creates and returns a GameInfoMessage composite message type, containing an unsigned long and a string value.
Usage:
CompositeMessage * message = MessageTypeManager::GetGameInfoMessage(multiplayerFlags, worldName);
TheMessageMgr-&gt;SendMessage(addressee, *message);
// extracting
CompositeMessage * msg = static_cast(message);
Visitor * v = msg-&gt;GetData();
unsigned long flags = v-&gt;GetUnsignedLongValue();
ResourceName world = v-&gt;GetStringValue();
*/
CompositeMessage * MessageTypeManager::GetGameInfoMessage(unsigned long flags, ResourceName world)
{
CompositeMessage * message = new ComposedMessage(kMessageGameInfo);
message-&gt;Add(new UnsignedLongMessage(flags));
message-&gt;Add(new StringMessage(world));
return message;
}
/*
Creates and returns an UpdateScoreMessage, which contains a single Long value.
Notice that in this case, a LongMessage is returned directly without first having
to put it into a ComposedMessage - the advantage of using a proper abstract class.
Receiving parties will just treat it like any other CompositeMessage, as in,
they won&#8217;t be able nor will they have to see the difference between the two.
Usage:
// send
TheMessageMgr-&gt;SendMessage(addressee, *MessageTypeManager::GetUpdateScoreMessage(playerScore));
// receive
long score = static_cast(message)-&gt;GetData()-&gt;GetLongValue();
*/
CompositeMessage * MessageTypeManager::GetUpdateScoreMessage(long playerScore)
{
return (new LongMessage(kMessageUpdateScore, playerScore));
}
/*
Creates and returns a new UpdateHealthMessage, which has the same structure of
GetUpdateScoreMessage. The only difference between the two is the message identification
number. We could make the two even simpler, by defining and implementing a
CreateLongMessage method, which takes a message identifier and an initial value,
and returns a LongMessage with that value. GetUpdateHealthMessage and GetUpdateScoreMessage
could then both call and return the return value of that GetLongMessage method, passing
their own message type identifier to the method. We won&#8217;t do that in here though,
to keep things straightforward for now.
Usage:
// send
TheMessageMgr-&gt;SendMessage(addressee, *MessageTypeManager::GetUpdateHealthMessage(playerHealth));
// receive
long playerHealth = static_cast(message)-&gt;GetData()-&gt;GetLongValue();
*/
CompositeMessage * MessageTypeManager::GetUpdateHealthMessage(long playerHealth)
{
return new LongMessage(kMessageUpdateHealth, playerHealth);
}
/*
Creates and returns a ClientOrientation CompositeMessage, which contains two float values.
Usage:
Send:
TheMessageMgr-&gt;SendMessage(addressee, MessageTypeManager::GetClientOrientationMessage(azimuth, altitude));
Receive:
Visitor * v = static_cast(message)-&gt;GetData();
float azimuth = v-&gt;GetFloatValue();
float altitude = v-&gt;GetFloatValue();
*/
CompositeMessage * MessageTypeManager::GetClientOrientationMessage(float azimuth, float altitude)
{
CompositeMessage * message = new ComposedMessage(kMessageClientOrientation);
message-&gt;Add(new FloatMessage(azimuth));
message-&gt;Add(new FloatMessage(altitude));
return message;
}
</div></summary>
  </entry>

  <entry>
    <title>Zend Framework</title>
    <link href="http://greatjustice.info/zend-framework/"/>
    <id>http://yoursite/article/?i=9927188f727b5372d154ce9c51b6332d</id>
    <updated>2008-10-03T03:01:05-07:00</updated>
    <author>
      <name>http://greatjustice.info/zend-fr</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There are numerous web application frameworks written in and for PHP on the market nowadays, most of them free and/or open source, most of them following or supporting the MVC paradigm. This summer, I&#8217;m going to go and attempt to make a website using one of the newer frameworks out there: the Zend Framework. Made (or at least started / supported by) the people / company that also does the PHP language itself, it promises a solid framework for web application development, &#8216;extreme simplicity and productivity&#8217; (from the website), up-to-date with the latest internet technologies, etcetera.
In this post (and following posts), I will dive into Zend Framework, describe its various loosely-coupled components, and make an attempt at judging the framework.

For this summer vacation, I had decided to start my own website project, just to keep up-to-date and whatnot. Since PHP is the most supported scripting language (and currently supported by my relatively cheap host), I decided to do it in that - much less hassle trying to get it online. Although PHP isn&#8217;t my favorite language, I decided to give it another serious try, with everything I&#8217;ve learned of OO programming and design during the last few years.
Earlier, I&#8217;ve played around with Ruby on Rails, the web application framework that sparked an enormous flood in MVC frameworks in various programming languages - amongst which PHP. I even made a simple site with that, got some hosting for it (which was quite more expensive than my current host), and attempted to put it online&#8230; but that failed.
Later, I played around with CakePHP, a very popular PHP framework that, as other frameworks do as well, offers an MVC structure, an object-relational mapper, AJAX support, and all that and then some. I didn&#8217;t finish the website I started to built with it (due to uncertainties with the people that were going to use / run / operate it and my own lack of interest), so I am not able to properly judge CakePHP. I was annoyed by how you insert variables in templates though - when I attempted it, you had to echo an array index from an object field:
$something-&gt;post['Post'];
or something like that - I can&#8217;t remember. Looking at the current quickstart,  they&#8217;ve changed it to echo-ing a structure like
$post['Post']['id'];
but that still isn&#8217;t to my liking - it&#8217;s an array in an array in an equally-named variable. If there are multiple posts, which is the only reason I can think of why you&#8217;d use a two-dimensional array, at least call your variable $posts (plural), and run through all the posts with a foreach loop or something.
Anyways, that was probably more than a year ago. So this summer, I finally decided to start working on my own website and, following some rumours on the internets about Zend Framework, I decided to give it a try.
The Zend Framework is in a lot of respects the same as all those other PHP frameworks out there, having a database abstraction layer, MVC support, AJAX support, and all that. The main thing that ZF stands out for however is that it&#8217;s all loosely-coupled - using one component of Zend Framework, for example the database layer, does not mean you also have to use their MVC component, and vice-versa. There&#8217;s a list of components of the Zend Framework in the programmer&#8217;s documentation, and for the biggest part, they all work independently of each other. For example, if you want to configure your database connection (using Zend_Db), you can do that by passing an array of the configuration parameters, or you can use an instance of Zend_Config, which can also be initialized in multiple ways (by using an ini or XML file, or by passing a PHP array). These decouplings and lack of dependencies between Zend Framework components is one of the major points in the entire framework. It doesn&#8217;t force you to use one or the other. Want to use your own controller structure? No problem. Want to use a third-party database abstraction layer? No problem either.
Zend doesn&#8217;t force you to use anything, it leaves you with the choice. And I believe that is a very good philosophy.
So far, I&#8217;ve spent a good week or so on the framework, progressing through the development by reading the documentation on one component, then building part of my application using that, followed by reading up on another component, and intergrating that into my application. It&#8217;s relatively easy to remodel an existing application to use Zend Framework components, or to add additional functionality to your program. Which I find a nice way of working, since you can take learning the framework one step at a time, whenever you&#8217;re ready for it.
So far, I&#8217;ve only used a small part of the Zend Framework - Zend_Controller, Zend_Db, Zend_Form, Zend_Filter,  and Zend_Validator conciously. Some more components are used unconciously, such as Zend_View and whatnot, but it&#8217;s possible to replace those as well. As such, I&#8217;m nowhere near providing an accurate description or review of the framework. However, in the week or so I have noticed several things, both positive and negative.
First, there&#8217;s quite a lot and thorough description of each component in the Zend_Framework, which explain the biggest parts of each component. There&#8217;s also a complete API available, although the documentation on that isn&#8217;t very extensive - three-worded method descriptions and such, for example. With that, the documentation is just &#8216;good&#8217;, not perfect. But since the framework is still in development, with the 1.6 version being released as a release candidate not too long ago, I&#8217;m sure that&#8217;ll come along soon.
Next, there are serious demands for new framework components. They have to have an 80% test coverage, proper documentation, adhere to the coding standards, and so forth. The test coverage requirement is, in my perspective, especially valueable, since it gives some degree of guarantee that the framework is good in terms of quality. I haven&#8217;t actually seen the tests (or even executed them) yet, but I do plan on writing tests for my own application, once I have a basic version done.
However, not everything is fine and dandy with the Zend Framework. While it does offer a large set of components, it isn&#8217;t really intended to be a full website framework. For example, it isn&#8217;t shipped with an object-relational mapper (yet), or with scaffolding purposes, which, for other frameworks, are often used for advertising purposes (as in: lookie me! I can make a blog in 5 minutes!). This means that some components, such as object / relational communications have to be written by the developer himself. The Zend Framework makes the development of a website a lot easier, but doesn&#8217;t take all the work from the developer. This can be seen as both a good and a bad thing. It&#8217;s good because it allows a lot of freedom and control for developers, allowing them to control pretty much every aspect of their website, without relying on auto-generated code or underlying functionality. It&#8217;s bad however because it&#8217;s not very easy to learn for new users. The latter part can probably be solved by both extensive documentation (a full tutorial isn&#8217;t yet available) and frameworks built on top of the Zend Framework, that do add features such as scaffolding to the framework. Such features might be added to the framework itself in a future date.
All in all, I like Zend Framework. It doesn&#8217;t seem to be aimed entirely at new developers, isn&#8217;t pretentious or promising instant websites, but offers a professional framework for serious developers that know what they&#8217;re doing, without forcing their hand into using components that may not be applicable for their particular situation. I&#8217;m also unable to judge whether the Zend Framework is suitable for (relatively) new programmers either. I&#8217;m not having any serious learning problems with it, since I like to tell myself I know proper object-oriented programming, but I can imagine that new programmers will have problems with it, due to it giving a lot of freedom, requiring a lot of design knowledge, and the absence of step-by-step guides for building a full website.
In the near future, I&#8217;ll (probably) be writing some more articles concerning the Zend Framework and/or components therein.
EDIT: My bad, the Zend Framework does have some sort of object/relational mapper, in the form of the Zend_Db_Table and Zend_Db_Table_Row classes, which represent a database table and/or table row. The latter one in specific is the OR-mapper, and allows you to call methods like save() to store a row into the database. I&#8217;ll try and write an article on it once I figure it out properly for myself and I cba.</div></summary>
  </entry>

  <entry>
    <title>The Lost Art of Bitmasks</title>
    <link href="http://greatjustice.info/the-lost-art-of-bitmasks/"/>
    <id>http://yoursite/article/?i=fecf81af43ccbcd6973a5cc244c09de8</id>
    <updated>2008-10-03T03:01:05-07:00</updated>
    <author>
      <name>http://greatjustice.info/the-los</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In this article, I will attempt to explain the so-called bitmasks, and the application of the binary operators (such as &amp;, |, &lt;&lt; and &gt;&gt;) found in pretty much every programming language. I myself have been in my education for four years now, but only last year or so did I encounter a practical application for using them. The title is as such perhaps just personal, seeing that I don&#8217;t really know the level of most modern-day programmers or whether they&#8217;re familiar with binary operations, but in my own experience, more emphasis is put on high-level structures and techniques, compared to low-level data storage, management and manipulation. This article will provide an introduction to binary operators, as well as how and when they can be applied - in a basic fashion, I&#8217;m sure that a lot more advanced applications for these techniques can be thought up.

I&#8217;m fairly sure that every beginning programmer will read through the introductionary text of a new programming language and encounter several operators whose function remains unknown - I&#8217;m referring to the &amp;, |, &lt;&lt; and &gt;&gt; operators, which are present in pretty much every programming language. These operators are the binary AND, binary OR, and the left and right bitshift operators. Some will research further and, if they&#8217;re familiar with binary numbers (i.e. how numbers are represented in a processor, on the lowest level, with ones and zeroes), might also discover what it is they do exactly on a value.
However, a practical application for those doesn&#8217;t always make itself apparent. For me personally, it took three years (or four, dunno exactly) before I finally encountered an application for it. This was whilst I was working on Clan Arena / the C4 engine, whose code contains a relatively large amount of binary operators and functionality.
In C4, the application of these operators is numerous, but it often boils down to one thing - setting and reading properties of an object, for example a renderable 3D model. One property of a model was how it was rendered - render its wireframe, textures, shadow, specific shadow mode, and I dunno what else. Those are just examples btw, I&#8217;m not actually sure how they were really used.
The point with that particular application was that you could assign several settings to a model, whilst internally, each setting was stored in just a single, numerical variable. This means that you could set a number of &#8216;flags&#8217;, as they&#8217;re also referred to, to a single object.
The easiest comparison is with booleans. Pretty much everyone knows the boolean true / false logic, so that shouldn&#8217;t need any more explanation. Let&#8217;s say you&#8217;re writing a 3D engine and you&#8217;re at the part where to decide which part of a model to render - wireframe, texture, shadow, etc. A model, in this case, can indicate what it wants the engine to render, i.e. the model has a set of properties - let&#8217;s call em renderWireframe, renderTexture, and renderShadow, all boolean variables.
For each rendering pass, the engine will check these three variables and render accordingly. Simple enough.
Now, with bitmasks and binary operators, you could store these three (and many more, up to 32 or 64) variables into just one single variable, an integer. This is a prime example of data encapsulation in OOP environments - from the outside, the renderable object has a few methods, say, getRenderShadow(), getRenderWireframe(), and getRenderTexture(), but on the inside, these three booleans are all stored into a single variable.
The easiest way to picture this is to rotate the three booleans to a horizontal orientation. Let&#8217;s say the number 1 is the boolean true, and 0 is the boolean false (which, btw, is perfectly applicable to C/C++ and other languages in that order). You&#8217;d get some vars like:
bool renderWireframe = 0;
bool renderTexture = 1;
bool renderShadow = 1;
In this example, we want to render the model&#8217;s texture and shadow, but not the wireframe. When you take the values, rotate them horizontally, you&#8217;d get the following value:
011
A binary number which, if you happen to know binary, can also be interpreted as the number 3, thus reducing the amount of variables used to store the rendering information from 3 to 1. You may think that this isn&#8217;t a major improvement, but imagine you have to send the rendering variables through a Message, as I&#8217;ve described in an earlier post: Next to the Model object&#8217;s three variables, you&#8217;d also get a Message object with the same three variables.
In the default C4 implementation, this&#8217;ll take a few minutes to create. When you reduce the amount of variables in the Model to 1, you also get a Message with just 1 variable to send - which takes less time to write , and reduces the overhead of packing / unpacking the message by a factor 3 at most (probably a lot less, seeing that the original booleans took up just 3 bits in memory, compared to the 32 or 64 bits an integer would take up). Multiply this saving by the amount of times the message is sent back and forth, and you&#8217;ll notice a major improvement (logically speaking, that is, it&#8217;ll probably save amounts that can only be measured in nanoseconds, something you&#8217;ll hardly notice)
This particular example is probably easy to imagine, but can easily be converted to the inner workings of a program itself - Objects send each other messages all the time, in the form of method invocations and the passing of other Objects. Reduce the amount of variables, and you get less method invocations, less memory access overhead, etcetera.
In a follow-up article, I&#8217;ll explain how I&#8217;ve used this technique for an access control system for a PHP-based website / application. For now though, I&#8217;ll try to explain how to use the system described above.
Usage
There&#8217;s basically three operations you&#8217;ll need to know in order to work with binary variables / bitmasks: Reading, writing, and deleting / unsetting. Reading involves checking a variable if it&#8217;s got a certain value - in the above example, for example, you&#8217;ll want to check whether to render textures or not, and in a later stage, whether to render shadows or not. Writing is also important, since you&#8217;ll have to set the value at some point. Finally, unsetting involves removing a value from the variable.
We&#8217;ll start by setting a flag / bitmask in a variable.
First, you&#8217;ll have to declare a variable that contains the information. In this case, we&#8217;ll use C/C++ datatypes, but this technique applies to pretty much every programming language. We&#8217;ll initialize it to 0.
int var = 0;
Note that the binary representation of this number is 00000000 in an 8-bit system (we&#8217;ll use just 4 bits for this example purpose, in a modern-day system this&#8217;ll probably be 16, 32, 64 or even 128 bits).
Second, we&#8217;ll have to have a base value for all possible settings that can be set. As in, we&#8217;ll want to declare a few constant values that represent the settings. These constants, and this is important, have to be a power of 2, like 1, 2, 4, 8, 16, 32, 64, 128, etcetera. If you translate those to binary, you get sequences like 0001, 0010, 0100 and 1000 - note that each binary number has just one 1 set, the rest is 0. We&#8217;ll define the constants as such:
const int renderWireframe = 1;
const int renderTexture = 2;
const int renderShadow = 4;
In C/C++ and most other languages, you can simplify this action by using the bitshift operator (&lt;&lt;). This will basically move all 1&#8217;s in a binary number one space to the left, so that 0001 &lt;&lt; 1 (bitshift 0001 with 1 space) will result in 0010, as shown in the example below. This however doesn&#8217;t work in all languages - PHP, for example, has problems with assigning the outcome of an operator to a constant. You can just use the notation above, the result is the same.
const int renderWireframe = 1 &lt;&lt; 0; // 1
const int renderTexture = 1 &lt;&lt; 1;   // 2
const int renderShadow = 1 &lt;&lt; 2;// 4
In this case, you won&#8217;t have to manually calculate the power of 2 yourself, which, at least for higher numbers, is convenient - and you don&#8217;t want to risk miscalculations, not even with one number, since it&#8217;ll cause unexpected results.
I&#8217;ll explain the reasoning behind this in a bit, if you don&#8217;t get it by then. First though, we&#8217;ll write a value into our integer variable we declared earlier.
Assignment
 To assign a value to a binary variable, you&#8217;ll need to use the binary OR operator - the single | character, like so:
var = var | renderTexture;
(note that some languages also have the |= operator, which can also be used instead.) The OR operator basically says something like: &#8216;For each number in the binary representation of the resulting variable, set to 1 if either var or renderTexture also has a 1 at that position&#8217;. A calculus notation will clarify (I hope):
0000
0010
---- |
0010

0 OR 0 = 0
0 OR 0 = 0
0 OR 1 = 1
0 OR 0 = 0
(feel free to replace 0 and 1 with false and true, and the | operator with the || operator, which compares the variables on a true/false level, a step higher than the binary level)
We&#8217;ve added renderTexture to the var, indicating we&#8217;ll want to render the texture. Let&#8217;s also add the renderShadow one:
var = var | renderShadow;
Which looks like
0010
0100
---- |
0110

0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
0 OR 0 = 0
Hopefully, the reasoning behind assigning only powers of 2 to the constants become clear now - assign anything but a power of 2, and you could get multiple flags set in the variable, which isn&#8217;t what you intend. Unless you do, of course.
Now, our variable called var has a value of 0110, which, translated back to the decimal system, is 6. Note that 6 is neither the value of the renderTexture constant, nor the value of the renderShadow constant - it&#8217;s a combination of the two. It also isn&#8217;t a power of 2. Because of this, you can&#8217;t compare the value with one of the constants using the == operator directly - you&#8217;ll have to extract the value from the variable, or, to be more precise, check if the value you&#8217;re checking for is contained in the variable.
Querying
To do this, we use the binary AND operator, &amp;, on both the var and the constant, and check if the result is anything but 0. Let&#8217;s check if our variable has the renderShadow flag set. Note that AND works the same as OR, with the exception that the resulting binary number is only set to 1 if both the first AND the second binary number at the position is 1.
0110
0100
---- &amp;
0100
0100 is not 0, so we can safely say that the renderShadow flag is set inside the variable. I said earlier to see if the variable is simply &#8216;anything but 0&#8242;, but the above example indicates that the result is actually equal to the renderShadow constant - why not compare it with that? There&#8217;s a number of reasons for that, actually, the primary one being that it&#8217;s a lot simpler. What&#8217;s easier to type:
if ((var &amp; renderShadow) != 0)
or
if ((var &amp; renderShadow) != renderShadow)
?
The result is in both cases the same - true in this particular example - but the former is a lot easier to write. In fact, in a lot of languages that are either typeless or semi-loosely typed, in which a regular int can, for example, also be interpreted as a boolean, such as C/C++, you could also just do
if (var &amp; renderShadow)
and leave out the comparison entirely - in C/C++ and PHP (haven&#8217;t tried this in other languages yet), anything but 0 is interpreted as a boolean true, when used in an if-statement.
However, it&#8217;s considered bad practice to use it in this way, since it may cause confusion and doesn&#8217;t work this way in all languages. Not only that, but it confuses one type with another - whilst an integer can be interpreted and used as a boolean, they&#8217;re logically speaking two entirely different things. I made a mistake when I tried to put the result of one of these operations into a variable - instead of the result (a boolean true or false), the variable was set to the numerical value of the result (4 in the above example), producing odd, unexpected results.
Querying multiple masks
You should note however that you can only check for one value at a time using this method (using the comparison to 0), even though you&#8217;ve learned how to combine two binary values with each other earlier using the OR operator. The reason is that, when comparing a variable AND-ed with a combination of two values, the resulting value will be a non-0 value even when just one of the two flags is set. This can be prevented by comparing the resulting variable with the combination value instead of checking if it&#8217;s not 0 . An example:
var = 0;
var = var | renderTexture; // set var to 0010

// check if var is set to both renderTexture and renderShadow
if ((var &amp; (renderTexture | renderShadow) != 0)

// first we combine the two constants:
0010 // renderTexture
0100 // renderShadow
---- |
0110

// then we do the comparison:
0110 // renderTexture | renderShadow
0010 // var
---- &amp;
0010
0010 is 2, is not 0, so the comparison would return true - even though renderShadow wasn&#8217;t set. Compare it with the combination of the two instead of &#8216;higher than 0&#8242;, and you&#8217;ll get the right result:
if ((0010 &amp; 0110) == (renderTexture | renderShadow))
0010 &amp; 0110 = 0010
0010 &amp; 0100 = 0110

// or, in full

if ((var &amp; (renderTexture | renderShadow)) == (renderTexture | renderShadow))
0010 is not equal to 0110, so the above comparison returns false, which is what we expected. You&#8217;ll have to do some more typing to get this to work though, and do the or-ing of the two constants twice (unless you place the or-ed version in a local variable or, if you do the combined comparison a lot, a constant on its own).
int cmp = (renderTexture | renderShadow);
if ((var &amp; cmp) == cmp) {}
Unsetting
The third and final operation we&#8217;ll want to be able to perform, is to unset a flag from the variable. To do this, we AND the variable with the inverse of the mask. Previously, we did the AND-operator, that turned 0100 and 0110 into 0100, since only the second 1 was set and both numbers have to be 1 in order to have a 1 in the same position in the result. To unset a variable however, we&#8217;ll want the inverse to happen - set the value to 0 if both numbers are 1, i.e. the position in the variable has to be set to 0 at the position where the flag is 1.
If we have a value 0110, and a mask 0100, and we want to unset the mask from the value (i.e. remove the second 1 in the value), we use the inverse of the mask and AND that with the value.
We take the mask 0100 and we inverse it, which can be done with the ~ operator in most languages (bitwise NOT). The inverse of 0100, ~0100, is 1011. ANDing that with the value 0110, and we get:
0110
1011
---- &amp;
0010
or the value minus the flag value.
(another use of the binary NOT operator is to get the maximum value an integer can have - simply echo ~0, the binary NOT of 0, and you get a binary value of all 1&#8217;s, or the maximum integer value)
That&#8217;s about all there is to binary operators. As I said in the beginning, I&#8217;ll attempt to describe an application of this technique with a real-world example, by using the bitmask technique to define roles for users, and permissions belonging to those roles. The major advantage of using bitmasks in such a manner is that of database storage - you only need one database column to describe everything a user having a role can do. But more on that in the follow-up.</div></summary>
  </entry>

  <entry>
    <title>Using Bitmasks in a Groups Permission Sy</title>
    <link href="http://greatjustice.info/using-bitmasks-in-a-groups-permission-system/"/>
    <id>http://yoursite/article/?i=71f41aa069960cdec4b487bc6aa23352</id>
    <updated>2008-10-03T03:01:05-07:00</updated>
    <author>
      <name>http://greatjustice.info/using-b</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As promised in my previous post, this article will describe a practical application of bitmasks, in this particular case for usage in a permission system on a webapplication. This particular application is a social network site, in which a user can create a joinable group. Each group has four usergroups - Guests, Members, Moderators, and Administrators, and as a special group with no specific traits of its own, Creator(s) (i.e. the person(s) that created the group).
Each usergroup has a set of permissions in each group - so basically, you have to be able to store a usergroup&#8217;s permissions on a per-group basis. In this article, I&#8217;ll explain how I&#8217;ve used bitmasks and the associated operators as explained in the previous article to store those permissions, as well as the usergroup(s) a particular user belongs to in a specifc group. The bottom line is that by storing the permission a usergroup has in a bitmask, you end up with a lot less database usage. But that&#8217;ll be explained in this article.
First though, a case study. This is actually a good idea for pretty much every software application, both as a whole and its parts - analyze what you&#8217;re trying to do. In this case, I wanted to create a social network site of sorts (using the Zend Framework) with, next to the obvious user profiles and user-to-user communication, a &#8216;groups&#8217; system, where users can create groups, clubs, or whatnot, each with its own discussions (or &#8216;threads&#8217;, you could basically also see it as a forum where users can create their own sections). More specifically, the owner / Administrator of a Group should be able to determine the access people have to their own groups - for example, a private group, an invite-only group, a read-only group, etcetera.
To implement this, a permission system would have to be setup. I was already pretty sure I&#8217;d use a default set of usergroups (Creators, Administrators, Moderators, Members and groupless, Guests), also called Roles, which more properly describes the per-group Role a User has - in group A, a User may just be a visiting Guest, whilst in group B the user would be a Moderator, and in C a Member, etc.
Next to that, I also figured that one User may fulfill more than one Role - in first instance the Creator / Administrator combination, where a Creator in its own doesn&#8217;t have any particular rights or duties, but when combined with the Administrator role, a Creator rises above the &#8216;regular&#8217; Administrator rank, in that he cannot be removed from the group by other Administrators. In retrospect, allowing every user to have more than one Role at a time might&#8217;ve been a little overkill, but it&#8217;s quite manageable in terms of the database storage required to associate a User with a Group.
In the database, there&#8217;s a link table, GroupUsers, that contains the group ID, the user ID, and the Role, the latter being a regular integer value. Just one column to indicate the user&#8217;s Role, no matter how many Roles the user has.
Next to assigning Roles to Users on a per-group basis, a Role would also need to have a set of Permissions, also on a per-group basis. In other words, in one group a Member could, for example, create new threads, whilst in another a Member could only reply to threads, all based on the choice of the Administrator(s) of that particular group.
So another requirement was that per Group, the permissions of a Role would have to be stored.
The Permissions are basically a list of sorts, containing items such as
(users with this Role can:)

View the group
View threads
Edit threads
Create new threads
Reply to threads
Edit own posts
Edit other people&#8217;s posts
etc

The permissions each Role has can be determined and set with the above list of permissions. Next to that, it&#8217;s relatively easy to extend these permissions.
The problem however is storage. In a regular system, one might say that the Role has a list of boolean permission values in that Group - canViewGroup, canViewThreads, canEditThreads, etcetera. Translating that to a database schema is also easy - just add boolean columns canViewGroup, canViewThreads, etcetera, with values 0 or 1 in them.
However, this makes the Groups table, in which we can store the permissions for each group, needlessly long - for each role + permission, a column is needed, so with just the above 7 permissions, 28 columns would be needed to store these. One of the base rules of database design is to make your database tables as narrow as possible - as few columns as possible. The narrower the table, the less data has to be processed and searched through, the faster access is.
In order to solve this particular problem, bitmasks were used. Instead of storing each permission as its own boolean value, each permission has its own unique mask - as described in the previous article. The permissions itself is stored in a numerical value, both in the program&#8217;s code itself (the Group object) and in the database. Instead of having the amount of roles times the amount of permissions in database columns for each Group, you can now do with just one column per usergroup. Here&#8217;s how it&#8217;s done. We keep everything in the Group object, since that&#8217;s where the Roles&#8217;  Permissions are stored. You could opt to put the storage of Roles in a separate object, but it makes no functional or logical difference (there&#8217;s a 1-to-1 relationship between a Group and its permissions).
In the Group object, we put the numerical values that store the permissions for each usergroup, and we define a list of constants that represent the bitmasks (or &#8216;flags&#8217;) for each permission. Note again that all permissions are powers of 2, as explained in the other article. Note also the usage of class-level constants, introduced in PHP 5 (I believe).
class Group
{
	const PERM_VIEW_GROUP = 1;
	const PERM_VIEW_THREADS = 2;
	const PERM_EDIT_THREADS = 4;
	const PERM_CREATE_THREADS = 8;
	const PERM_REPLY_THREADS = 16;
	const PERM_EDIT_OWN_POSTS = 32;
	const PERM_EDIT_OTHER_POSTS = 64;

	private $administratorPermissions = 0;
	private $moderatorPermissions = 0;
	private $memberPermissions = 0;
	private $guestPermissions = 0;

}
For each Role, methods can be defined that set, unset, add or remove permissions to a certain usergroup. 
 
	// sets the Administrator role's permissions to the given value.
	public function setAdministratorPermissions($perms)
	{
		$this-&gt;administratorPermissions = $perms;
	}

	// returns the Administrator role's permissions
	public function getAdministratorPermissions()
	{
		return $this-&gt;administratorPermissions;
	}

	// Adds a permission to the Administrator role.
	public function addAdministratorPermission($perm)
	{
		// we use the |= operator, which is equal to $value = $value | $perm
		$this-&gt;administratorPermissions |= $perm;
	}

	// Removes / unsets the given permission from the Administrator role's permissions.
	public function removeAdministratorPermission($perm)
	{
		$this-&gt;administratorPermissions &amp;= ~$perm
	}

	// checks if the Administrator role has the given permission
	public function getAdministratorPermission($perm)
	{
		return (($this-&gt;administratorPermissions &amp; $perm) != 0);
	}
Rinse and repeat for the other usergroups. Of course, all this could be condensed into even smaller chunks. You could also, to further redue the storage used for permission, create additional permission masks, the full set for each usergroup - i.e. MODERATOR_PERM_CAN_VIEW_THREAD, etc. However, you&#8217;ll probably run up against the limitations of the system - i.e. that a number can only contain so much bits before it overflows. If you have only a few permissions, you could chuck it all into a single value, but if you have more (more than 8), use separate variables.</div></summary>
  </entry>

  <entry>
    <title>VDrift 2010-06-30 Release, Linux source,</title>
    <link href="http://vdrift.net/article.php?story=20100714200428239"/>
    <id>http://yoursite/article/?i=c3a97a875d6afe5c2c00e685843540a0</id>
    <updated>2010-07-15T01:05:29-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20100714200428</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">VDrift 2010-06-30 has been released for Windows and Linux (source). Download links are available on the main http://vdr...</div></summary>
  </entry>

  <entry>
    <title>New car website cars.vdrift.net online</title>
    <link href="http://vdrift.net/article.php?story=20090822162358294"/>
    <id>http://yoursite/article/?i=d9fad581b15cccbed1f8f00be8031389</id>
    <updated>2009-08-22T17:30:51-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090822162358</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">VDrift user nomoo suggested that VDrift should have a cars database website similar to racer-xtreme.com. Great idea! The site will allow artists to...</div></summary>
  </entry>

  <entry>
    <title>VDrift 2009-06-15 Release, Linux source,</title>
    <link href="http://vdrift.net/article.php?story=20090617174343358"/>
    <id>http://yoursite/article/?i=b6c660b8eb503edc26259f011d84ecac</id>
    <updated>2009-06-18T17:30:59-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090617174343</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">VDrift 2009-06-15 has been released for Windows and Linux (source) UPDATE: and OSX.  Download links are available on the main ...</div></summary>
  </entry>

  <entry>
    <title>VDrift 2009-06-15 Release, Linux source </title>
    <link href="http://vdrift.net/article.php?story=20090617174343358"/>
    <id>http://yoursite/article/?i=736968034da114b3080a5188843b59d2</id>
    <updated>2009-06-17T18:32:57-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090617174343</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">VDrift 2009-06-15 has been released for Windows and Linux (source).  Download links are available on the main http://vd...</div></summary>
  </entry>

  <entry>
    <title>Website Upgrade</title>
    <link href="http://vdrift.net/article.php?story=20090614173237828"/>
    <id>http://yoursite/article/?i=1b08c04432044faf05efd763889a02e0</id>
    <updated>2009-06-14T18:01:28-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090614173237</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The VDrift website is undergoing an upgrade.  Many links or features may not work initially.  Please bear with us....</div></summary>
  </entry>

  <entry>
    <title>Model conversion</title>
    <link href="http://vdrift.net/article.php?story=20090528205156478"/>
    <id>http://yoursite/article/?i=ac3314b8c251e13e5dee61f21bf5fe4c</id>
    <updated>2009-05-28T21:31:01-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090528205156</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In SVN R2475, I added a command line utility called &quot;modelconvert&quot; in the VDrift/tools folder.  At the moment, it allows conversion betwe...</div></summary>
  </entry>

  <entry>
    <title>Numerical Integration</title>
    <link href="http://vdrift.net/article.php?story=20090404114712250"/>
    <id>http://yoursite/article/?i=10556a3150eea758e3041887a3cd3588</id>
    <updated>2009-04-04T12:02:00-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090404114712</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I have re-written the VDrift wiki article on numerical integration based on more in-depth testing that I've done.
 ...</div></summary>
  </entry>

  <entry>
    <title>VDrift featured in AutoSimSport Magazine</title>
    <link href="http://vdrift.net/article.php?story=20090323191834991"/>
    <id>http://yoursite/article/?i=5e87639a876ebe43d6784a3277ab1a50</id>
    <updated>2009-03-23T20:02:04-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090323191834</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">VDrift is featured in AutoSimSport Magazine - Volume 5, Issue 1.  Head on over to their website and check it out: ...</div></summary>
  </entry>

  <entry>
    <title>VDrift 2009-02-15 Release, Mac OSX</title>
    <link href="http://vdrift.net/article.php?story=20090310125146398"/>
    <id>http://yoursite/article/?i=fc6619c5853b03fb967cb445297aaeed</id>
    <updated>2009-03-10T13:31:11-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?story=20090310125146</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The 2009-02-15 release for Mac OSX is now available.  Download links at the top of this page have been updated for the new release.</div></summary>
  </entry>

  <entry>
    <title>VDrift 2009-02-15 Release, Linux source </title>
    <link href="http://vdrift.net/article.php?story=20090215220541245"/>
    <id>http://yoursite/article/?i=0fe4ec2a081789db3f9cee383ce46102</id>
    <updated>2009-02-15T22:30:48-08:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I've just uploaded linux source and windows releases for 2009-2-15.  This is the first release with the refactored code, and I think it's a big imp...</div></summary>
  </entry>

  <entry>
    <title>Bullet building, plus VDrift release get</title>
    <link href="http://vdrift.net/article.php?story=20090201205854198"/>
    <id>http://yoursite/article/?i=ec1fd129084a8715d1476e9a3d91ae4e</id>
    <updated>2009-02-01T22:30:42-08:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I totally changed the way Bullet is integrated into VDrift:
http://vdrift.net/Forum/vie...</div></summary>
  </entry>

  <entry>
    <title>Vdrift 2008-05-08 on FreeBSD</title>
    <link href="http://vdrift.net/article.php?story=20090116042200299"/>
    <id>http://yoursite/article/?i=97e3136a38ce40ef680ce4c12dbadee5</id>
    <updated>2009-01-16T04:30:41-08:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The vdrift anf vdrift-data ports were updated on FreeBSD. You can see more information at:

http:...</div></summary>
  </entry>

  <entry>
    <title>Bouncy camera mounts in SVN R2297</title>
    <link href="http://vdrift.net/article.php?story=200901112149124"/>
    <id>http://yoursite/article/?i=fa8c7031446456bae7e407af7290b014</id>
    <updated>2009-01-11T22:30:43-08:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">After playing a bit of Race07 (a simbin game), I decided to try implementing a &quot;bouncy&quot; camera for the hood and driver views in VDrift to...</div></summary>
  </entry>

  <entry>
    <title>Upgrading to Bullet 2.73 in R2260</title>
    <link href="http://vdrift.net/article.php?story=20081217115808798"/>
    <id>http://yoursite/article/?i=bddabbc09b23840c84c52aa67bbc92ec</id>
    <updated>2008-12-17T12:01:37-08:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Revision 2260 of the VDrift SVN trunk upgrades to bullet 2.73.  See directions for compiling here: ...</div></summary>
  </entry>

  <entry>
    <title>Fixes in SVN since the refactor was move</title>
    <link href="http://vdrift.net/article.php?story=20081119204410798"/>
    <id>http://yoursite/article/?i=d7e17bb602396a4cf5eb201a962db12b</id>
    <updated>2008-11-19T21:30:56-08:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As of R2225, here's a list of some of the recent fixes in SVN since the refactor was moved to the trunk:
* console logging is now saved to ~/.vdrif...</div></summary>
  </entry>

  <entry>
    <title>Refactor moved to trunk!</title>
    <link href="http://vdrift.net/article.php?story=20081021090034466"/>
    <id>http://yoursite/article/?i=d0276737f93cfa532300df3bc241a4c9</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The refactor is complete enough that I have moved it back to the trunk.  Hopefully people can give it a try and let me know how it works out.  Only...</div></summary>
  </entry>

  <entry>
    <title>Refactor Status Report 9/9/08</title>
    <link href="http://vdrift.net/article.php?story=20080909221235626"/>
    <id>http://yoursite/article/?i=f7c6677fc6dcfbf2b7f8445a3837b281</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It's been a little while since I've posted an update on the refactor status, so here goes.  Progress has been steady and I've mainly been working o...</div></summary>
  </entry>

  <entry>
    <title>VDrift 08-05-08 Release</title>
    <link href="http://vdrift.net/article.php?story=20080805202755765"/>
    <id>http://yoursite/article/?i=02525584f3c1f822ed835b43e3c993a9</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The code is stable, and I'm busy working on the refactor, so it's a good time for a release.

I'll update the &quot;Current VDrift releases&quot; t...</div></summary>
  </entry>

  <entry>
    <title>Refactor Status Report 7/26/08</title>
    <link href="http://vdrift.net/article.php?story=20080726154545527"/>
    <id>http://yoursite/article/?i=63193f9478738b656ad54db8feca0ba2</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It's been exactly a month since I last posted about the refactor!

I'm pleased to announce that as of rev 2078 I've gotten basic driving working.

...</div></summary>
  </entry>

  <entry>
    <title>Refactor Status Report 6/26/08</title>
    <link href="http://vdrift.net/article.php?story=20080626072511291"/>
    <id>http://yoursite/article/?i=d51eb9f155b6951bccaf785cb5ee7c93</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here's a progress update on the code refactor.  Most of the core subsystems (input, models, textures, math, collision, etc) are in place; the only ...</div></summary>
  </entry>

  <entry>
    <title>Wiki Article on Numerical Integration Me</title>
    <link href="http://vdrift.net/article.php?story=20080519223226308"/>
    <id>http://yoursite/article/?i=a681e5bef239982fc22461e15687db92</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I did some research into numerical integration methods and have posted the results of my experiments in a wiki page: ...</div></summary>
  </entry>

  <entry>
    <title>Code Refactoring</title>
    <link href="http://vdrift.net/article.php?story=20080425194941287"/>
    <id>http://yoursite/article/?i=f8056e0b80c17341ed99c2fa0002ba4c</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hacking on VDrift has been getting harder and harder.  Each new feature that is added requires more work and makes it that much more difficult to a...</div></summary>
  </entry>

  <entry>
    <title>Web sites: Issues and SVN browser</title>
    <link href="http://vdrift.net/article.php?story=web-sites-issues-svn"/>
    <id>http://yoursite/article/?i=37b0aab283b1ff8d8a715d35aa856c63</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It seems worth posting that VDrift has two web sites that have recently been added or updated. We used to have a Subversion repository browser but ...</div></summary>
  </entry>

  <entry>
    <title>VDrift 2008-02-23 Release Candidate 1 fo</title>
    <link href="http://vdrift.net/article.php?story=20080226104248930"/>
    <id>http://yoursite/article/?i=154e71e93f799f731c93edf5ceccd515</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This is not an official release, just a working build that can be tested before the actual release. [ ...</div></summary>
  </entry>

  <entry>
    <title>VDrift 2008-02-23 Release Candidate 1 fo</title>
    <link href="http://vdrift.net/article.php?story=2008-02-23-RC1-win32"/>
    <id>http://yoursite/article/?i=589f9fc3159f746dcda4dbaf41385cc8</id>
    <updated>2008-10-30T15:00:17-07:00</updated>
    <author>
      <name>http://vdrift.net/article.php?st</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The Windows build has been updated and an installer package is ready to download. This is not an official release, just a working build that can be...</div></summary>
  </entry>

  <entry>
    <title>Xcode/GLUT Tutorial</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951761/xcodeglut-tutorial.html"/>
    <id>http://yoursite/article/?i=c8251d4f3be0fae257bbc8a115bcf356</id>
    <updated>2009-03-04T13:33:05-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/OneSadCookie/~3/233</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This was the most popular thing on my old site.  I've updated it for Xcode 3 on Leopard, but that means that the instructions may be a little misleading for Xcode 2 or earlier...</div></summary>
  </entry>

  <entry>
    <title>Xcode/GLUT Tutorial</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/6kX4_g-aliw/xcodeglut-tutorial.html"/>
    <id>http://yoursite/article/?i=39b48e8997353cf01ee4935123461ca2</id>
    <updated>2009-02-28T21:10:48-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/OneSadCookie/~3/6kX</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This was the most popular thing on my old site.  I've updated it for Xcode 3 on Leopard, but that means that the instructions may be a little misleading for Xcode 2 or earlier...</div></summary>
  </entry>

  <entry>
    <title>Xcode/GLUT Tutorial</title>
    <link href="http://blog.onesadcookie.com/2007/12/xcodeglut-tutorial.html"/>
    <id>http://yoursite/article/?i=5870bf35657c425c2de6001650a32195</id>
    <updated>2009-02-28T13:59:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/xcodeglut-tut</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This was the most popular thing on my old site.  I've updated it for Xcode 3 on Leopard, but that means that the instructions may be a little misleading for Xcode 2 or earlier...</div></summary>
  </entry>

  <entry>
    <title>install_name Magic</title>
    <link href="http://blog.onesadcookie.com/2008/01/installname-magic.html"/>
    <id>http://yoursite/article/?i=f85488e74045d358e09bd1b2f6f76b59</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/01/installname-m</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mac OS X application packages allow you to embed frameworks and dynamic libraries within your application, making it easy to comply with the LGPL or use a third-party library without infringing on your users' convenience.  However, actually making this work isn't as straightforward as perhaps it should be...Dynamic libraries (and frameworks, same thing) on Mac OS X include an "install_name".  This is the absolute path that the library expects to reside at.  When a program is linked, the install_names from any dynamic libraries it links against are copied into the program, and dyld looks for the libraries at these paths when the program is run.That means that in order to embed a dynamic library into your application bundle, your program must contain an install_name for the library which points to a path inside the application bundle, and the easiest way to get the correct path into your program is to have the correct install_name in the library itself.Wait, didn't I just say that the install_name is an absolute path?  How can it point into the application bundle, when you don't know where the application bundle is?  Fortunately there's a special token @executable_path that can appear at the beginning of an install_name that refers to the absolute path of the program loading the library.Where does all this leave us?If possible, you'll build your dynamic library with the appropriate install_name$ gcc foo.c -dynamiclib -o libfoo.dylib -install_name @executable_path/../Libraries/libfoo.dylib
$ otool -L libfoo.dylib 
libfoo.dylib:
 @executable_path/../Libraries/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
Then you'll link your application as normal, and when you put the library in Contents/Libraries everything will just workIf building the dynamic library appropriately isn't an option (a closed-source third-party library for example), don't worry.  It's the install_name copied to your program that's really important, and that can be fudged.  You'll link your application with the -headerpad_max_install_names flag, then edit it with install_name_tool.$ gcc main.c -L. -lfoo -headerpad_max_install_names
$ otool -L a.out
a.out:
 /usr/local/lib/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
$ install_name_tool -change /usr/local/lib/libfoo.dylib @executable_path/../Libraries/libfoo.dylib a.out
$ otool -L a.out
a.out:
 @executable_path/../Libraries/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)</div></summary>
  </entry>

  <entry>
    <title>CFPreferences keys for OpenGL</title>
    <link href="http://blog.onesadcookie.com/2008/01/cfpreferences-keys-for-opengl.html"/>
    <id>http://yoursite/article/?i=10c260ecefc8325ed89cff7cc2ba9157</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/01/cfpreferences</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mac OS X's OpenGL framework (only Leopard tested) reads a bunch of values from defaults at app startup.  They are:Integer valuesColorBufferSizeKey
DepthBufferSizeKey
MultisampleKey
RendererIDKey
ThreadedEngineKey
AcceleratedMethodKey
MaxSwapsInFlightKeyBoolean valuesColorBufferSizeEnableKey
DepthBufferSizeEnableKey
VBLSyncEnableKey
MultisampleEnableKey
RendererIDEnableKey
AllowOfflineKeyI haven't been able to make these do anything... anyone know how to use them?</div></summary>
  </entry>

  <entry>
    <title>A Delicious Limerick</title>
    <link href="http://blog.onesadcookie.com/2008/02/delicious-limerick.html"/>
    <id>http://yoursite/article/?i=a293ad25003b293991b2b91af67611a9</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/02/delicious-lim</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">How does he create all that buzz?
Wil Shipley says "Easy, it's 'cuz
    "for Delicious Lib'ry,
    "I've the weight of Mike Lee!
"Who says size doesn't matter?  It does!"With apologies to Mike (and Wil), and thanks to limerickdb</div></summary>
  </entry>

  <entry>
    <title>Multithreaded libcurl Crash</title>
    <link href="http://blog.onesadcookie.com/2008/02/multithreaded-libcurl-crash.html"/>
    <id>http://yoursite/article/?i=41da4dbe7110484f617399f0f1b247eb</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/02/multithreaded</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Thread 0 Crashed:
0   libcurl.4.dylib                0x00391e1c curl_unescape + 78
1   libcurl.4.dylib                0x003929c0 curl_unescape + 3058
2   libcurl.4.dylib                0x00393978 curl_mvsnprintf + 55
3   libcurl.4.dylib                0x003850f9 Curl_failf + 63
4   libcurl.4.dylib                0x0037d8da Curl_resolv + 95
Apparently CURLOPT_NOSIGNAL is very important in multithreaded programs...</div></summary>
  </entry>

  <entry>
    <title>Leopard doesn't verify code signatures?</title>
    <link href="http://blog.onesadcookie.com/2008/02/leopard-doesnt-verify-code-signatures.html"/>
    <id>http://yoursite/article/?i=1b7b26202dc9d2ad62b0f279150dcdff</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/02/leopard-doesn</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">With all the fuss about code signatures in Leopard, I expected that the system would verify signed applications when they're launched, and prompt the user if the signature is incorrect.  It doesn't.To test this, first verify that TextEdit's signature is valid:codesign -v /Applications/TextEdit.app/(It should print nothing).  Then edit /Applications/TextEdit.app/Contents/Info.plist.  Make sure the edit is simple enough that you can undo it - changing the version number is an easy option.  Now verify the signature again:codesign -v /Applications/TextEdit.app/
/Applications/TextEdit.app/: code or signature modifiedNow open TextEdit.  It opens without warning.  We could have replaced the executable with malicious code, and we wouldn't have been warned.Make sure you revert your change to Info.plist and re-verify the application.Since Tiger doesn't have any safeguards of this kind, obviously the situation is no worse than Tiger, but I don't understand what the point of code signing is if the OS doesn't make use of it to make the user's experience that little bit safer.</div></summary>
  </entry>

  <entry>
    <title>ImageIO is not thread-safe</title>
    <link href="http://blog.onesadcookie.com/2008/02/imageio-is-not-thread-safe.html"/>
    <id>http://yoursite/article/?i=031b511a0b399e6a7094d429690191b8</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/02/imageio-is-no</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This post is wrong.  See ImageIO is thread-safe after all for correction.I can't find any documentation one way or another, and assumed that as a modern API it was OK to call ImageIO from multiple background threads.  It appears that this is not the case.  CGCreateImageSourceFromURL fails randomly if you do; always calling it from the main thread appears to work.Radar 5759067 requests that this preferably be fixed, or if not, at least documented.</div></summary>
  </entry>

  <entry>
    <title>ImageIO is thread-safe after all</title>
    <link href="http://blog.onesadcookie.com/2008/02/imageio-is-thread-safe-after-all.html"/>
    <id>http://yoursite/article/?i=26376d32232605f1bccd38be8be00022</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2008/02/imageio-is-th</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In ImageIO is not thread-safe I reported a problem with ImageIO and threading.  I now believe my analysis was wrong, and ImageIO is thread-safe after all.  Serializing my ImageIO loading had the effect of hiding the race condition in my own code, so the error became very rare.  My apologies to anyone misled by the post, and to anyone at Apple who had to deal with my bug report.</div></summary>
  </entry>

  <entry>
    <title>Ruby.framework broken in MacOSX10.5.sdk</title>
    <link href="http://blog.onesadcookie.com/2007/12/rubyframework-broken-in-macosx105sdk.html"/>
    <id>http://yoursite/article/?i=665b66b1929aeb4cab80744f804ecb5d</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/rubyframework</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you're trying to build against Ruby.framework on Mac OS X 10.5 you may have come across a problem with the SDK.  This manifests itself as this error:gcc test.c -framework Ruby -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
ld: framework not found Ruby
collect2: ld returned 1 exit statusThis appears to be fixable like this:cd /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/Current
sudo ln -s usr/lib/libruby.dylib RubyI don't know whether that's the right fix, but it seems to do the trick.  Radar 5661551.</div></summary>
  </entry>

  <entry>
    <title>GCC Warning Flags</title>
    <link href="http://blog.onesadcookie.com/2007/12/gcc-warning-flags.html"/>
    <id>http://yoursite/article/?i=330b3c9ebe707ef98e6d34368904be83</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/gcc-warning-f</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Xcode's default warning settings are useless, not informing you of many real problems in your source code.  I compile all my code with this set of warning flags:-Wall -Wextra -Wno-unused-parameter -Wnewline-eof -Werror-WallThese are warnings that always indicate a problem with your code.  I have no idea why they''re not enabled by default.-WextraAlso known as -W.  These are warnings that indicate potential problems with your code.  They will often appear in code that's correct, but they will also often expose code that's incorrect.-Wno-unused-parameter-Wextra warns about unused parameters to functions.  Since this is a common occurrence in object-oriented code, I prefer not to see these warnings.-Wnewline-eofWarns if a source file doesn''t end with a newline character.  If you're just coding for the Mac, you can ignore this one, but GCC on Linux will error in this  situation, so if you're writing portable code, it's nice to know about it.-WerrorTreats all warnings as errors.  To make sure your code is top quality!  It's easy to lose warnings in files that aren't changed often.  It's impossible to lose errors.</div></summary>
  </entry>

  <entry>
    <title>Finding Your App's Files</title>
    <link href="http://blog.onesadcookie.com/2007/12/finding-your-apps-files.html"/>
    <id>http://yoursite/article/?i=117d0432b0fc68eb6e067e670a6f241c</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/finding-your-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The current working directory for your application depends on how it was run, and what API you're using:If your application is using GLUT, the current working directory is your bundle's Resources directory.If your application is using SDL, the current working directory is the directory containing your application bundle, by default.  This is set in SDLMain.m.  You may wish to change it (see below).If you run your application from Xcode, the current working directory is the directory containing your application bundle.If you run your application from Finder, the current working directory is /If you run your application from the command-line, the current working directory is the current working directory of the controlling shell.Generally, you'll want the current working directory to be your bundle's Resources directory.  You'll set it correctly once at startup.CocoaNSString *resourcePath = [[NSBundle mainBundle] resourcePath];
[[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath];CoreFoundationCFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
char path[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
{
    // error!
}
CFRelease(resourcesURL);
chdir(path);</div></summary>
  </entry>

  <entry>
    <title>iDevGames is Back</title>
    <link href="http://blog.onesadcookie.com/2007/12/idevgames-is-back.html"/>
    <id>http://yoursite/article/?i=4dda21331a514bb30ef66748d397975a</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/idevgames-is-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Carlos blames "IP address issues".  I'm skeptical.</div></summary>
  </entry>

  <entry>
    <title>CreateMacGames Lives!</title>
    <link href="http://blog.onesadcookie.com/2007/12/createmacgames-lives.html"/>
    <id>http://yoursite/article/?i=bbcc594c1d51d58a4122c767683bfe0e</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/createmacgame</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Well... kinda.  Boards at http://cmg.onesadcookie.net.</div></summary>
  </entry>

  <entry>
    <title>iDevGames is Down</title>
    <link href="http://blog.onesadcookie.com/2007/12/idevgames-is-down.html"/>
    <id>http://yoursite/article/?i=84d9da7963c90b7fd7dcafbfe7319a7f</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/12/idevgames-is-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">iDevGames is down (as usual) and there's no sign of Carlos (as usual).  Until stuff gets fixed, head over to #idevgames on FreeNode.  Colloquy is a good IRC client if you haven't used one before.Further bulletins as events warrant.</div></summary>
  </entry>

  <entry>
    <title>Choosing a Programming Language</title>
    <link href="http://blog.onesadcookie.com/2007/11/choosing-programming-language.html"/>
    <id>http://yoursite/article/?i=f45bbf78da6dea9d9a73fed3021ee357</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/choosing-prog</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was originally written for iDevGames and CreateMacGames (no longer in existence), but I'm republishing it here as a complement to my "Why not C++" post.  It's not exactly what I'd say today (Haskell's a lot harder to master than I make out, and a lot better at I/O than I make out) but I think it's still a good read.Like Moths to a Naked FlameAn oft-asked question by beginner programmers is, "What language should I use?".  The answers that are given vary, but usually involve heavy recommendations of C and C++.  And that's where it stops.  The student learns the recommended language, and never stops to consider what else they might learn.Time passes, the bright-eyed student becomes something of a guru herself, and when it comes their turn to answer the inevitable question for the next generation, she's hemmed in by her own experience.  "C or C++", comes the stern reply, and another generation marches blinkered toward the same fate.Why must this always be the case?  Why is it so difficult to leave the beaten track?  Why, when it comes time to start a new project, is the question always "How can this be done in C++?", rather than "What language would make this project easier?"?Why Computers are Better than People, Reason #457The point many people miss, here, is that computer languages aren't like human languages.  It might take you a lifetime to master Japanese.  You're looking at maybe a week for Python.  One week to mastery.  Not "good morning" and "my name is Ellie" clumsy beginnings; not even mere competent conversation; we're talking complete, total and utter mastery.Pick a difficult language, say Perl, and we might be in two-week territory.How about a completely different paradigm; a whole new way of thinking?  It shouldn't take a month to master Haskell.There's no reason to limit yourself by the languages you know ? the effort to acquire a new one is miniscule, while the pay-offs can be tremendous.On Round Pegs and Square HolesEvery new project gives the opportunity to start afresh; to reevaluate preconceptions; to apply knowledge gained during the execution of the last.  The choice of a programming language is no different.The decisions made now will have a profound impact on the outcome of this latest venture.  The choice of language(s) will affect how easy it is to produce the program in the first place; it will affect how easy it is to modify the program later; it may even affect how easy it is for the program's users to customize your program to their liking.  Why ignore the choice given you?People don't like to ask the difficult questions.  The questions like "Why are we using C (a language for writing high-performance code) to create a desktop office suite (where performance requirements are very low)?".  The questions like "Why are we using Java (a language for writing high-level reusable code with low performance requirements) to write a software 3D renderer supposed to run in real-time?".  The questions like "Why are we using Haskell (a language good for complex mathematical computation, but poor at I/O) to write a file-format translator?".  The questions like "Why are we using Perl (a language good for text-processing) to write an image-editing program?".Would you fire your builder if she tried to drill a hole in your wall with a spanner?Choosing the Right Tool for the JobEvery language has its strengths and weaknesses; it has areas where it particularly shines, and areas where you'll only be fighting the language to try and accomplish anything.When you start your next project, stop and think for a while.  List the requirements you have for your programming language, and match them up against actual languages.  Chances are you won't find an exact match, but this should help focus your attention on a small group of languages that are more suited to your task than the others.Color-Coordination; or When a Track-Suit isn't EnoughOne problem you've likely encountered having followed the advice of the previous paragraph is that different parts of your program have different requirements.  If you're writing a game, for example, you'll probably have a large portion of your program (containing AI, game logic, user interface, &amp;c.) which needs to be easy to build and easy to change, but where performance isn't critical.  Unfortunately, you'll also have a small, hard core of the functionality (probably graphics and physics routines) where performance is of the utmost importance.As with clothing, not everything has to be the same color.  As with food, you're allowed to have more than one flavor in a meal.  In programming, you don't have to use the same language throughout the entire program.  There are ways and means of embedding almost all languages in other languages, even if it involves going via C on the way.  This way you can enjoy the benefits of each language in the areas suited to it, without succumbing to its weak areas.Beware the fashion police, however ? too many different languages in one project will quickly tie you up in the mess of integration, rather than letting you get on with using your chosen languages.  I still have visions of my high-school English teacher, whose favorite color combination was yellow, lime green, turquoise and hot pink.  You don't have to be like her!Forging a New PathTake off your blinkers!  Look around you!  Marvel at the vast array of possibilities!  Dare to find the language which makes your task easier!And when you, in turn, get asked "Which language should I learn?", do the right thing ? ask a question in return: "What do you want to create today?".</div></summary>
  </entry>

  <entry>
    <title>I Broke GCC</title>
    <link href="http://blog.onesadcookie.com/2007/11/i-broke-gcc.html"/>
    <id>http://yoursite/article/?i=fb65d38851786c960aa692e35c9ed2fd</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/i-broke-gcc.h</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">CookieJar:Desktop keith$ cat test.mm 
template &lt;typename S&gt;
void swap_struct(S *s)
{
    const char *encoding = @encode(S);
    // ...
}
CookieJar:Desktop keith$ gcc test.mm 
test.mm: In function ?void swap_struct(S*)?:
test.mm:4: internal compiler error: Bus error
Please submit a full bug report,
with preprocessed source if appropriate.
See &lt;URL:http://developer.apple.com/bugreporter&gt; for instructions.Darn.  That would've been a cool piece of code.  Oh well, a macro will suffice.Radar 5619052.</div></summary>
  </entry>

  <entry>
    <title>Why not C++?</title>
    <link href="http://blog.onesadcookie.com/2007/11/why-not-c.html"/>
    <id>http://yoursite/article/?i=69d2239d3a82e9b54b94f8f40e0ff251</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/why-not-c.htm</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This was originally posted on iDevGames, but since people are constantly asking me why I hate C++ so much, I thought it should be posted here too.My philosophy is that at any given time, there are three things that you may care about when programming.  From least common to most common:You want to write fast code.You want to write correct code.You want it to be easy to write code.Unfortunately, these tend to work against each other.If you want to write fast code, you need a language which takes you close to the hardware.  It needs to provide a fairly direct mapping between the "high-level" source and the assembly, so that you can pinpoint problems in the assembly and know exactly what needs to change in the high-level code to fix them.  The only language I've ever used which does this is C.  With C++, as soon as you get into references, copy constructors, operator overloading, etc. there is too much going on for that direct correlation between source and assembly to exist.If you want to write correct code, you need a language which prevents you from making as many errors as possible.  That implies a strict static type system, array bounds checking, an inability to poke around directly at bits and bytes in memory, etc.  Obviously, C++ doesn't fit that bill; the closest language I've found is Haskell.  Java's unchecked exceptions rule it out, though there are tools that can help with that.If you want it to be easy to write code, you need a language that allows you to express what you want; that doesn't tie you down to rigid typing structures, or keep you fiddling with minutiae like memory management.  This tends to mean a highly dynamic object-oriented language.  Unsurprisingly, since this is the most common category for code to be in, this is the category with the most appropriate languages in it.  Ruby and Python are two obvious ones.  C++ is far too static, and keeps you far too immersed in low-level details to be useful here.Of course, any given project is likely to consist of parts which fall into each of these three categories, which leads many people to seek a "compromise language" - one which is "fast enough", "safe enough" and "easy enough".  Ultimately, I believe such languages are always a waste of time.  You will spend more time optimizing the bits that need optimizing, more time fixing bugs in the critical sections of the code, and much, much more time trying to design your software in such a way that you can actually build it, than if you were using the appropriate language for each part.These languages are not difficult to tie together.  All have easy ways to interact with C, which can be used as a thin layer of glue to stick them all together.  The boundaries between the sections of code with different requirements tend to be reasonably well-defined, and you can therefore avoid crossing your language boundaries too often.If you're using the right language for the job, your code will be as clear, concise, and well-designed as it's possible for it to be.  To use the favorite vehicle analogy, you wouldn't try to use a Ford Ka as a personnel carrier in a war zone, and you wouldn't drive to the shops to get the groceries in an APC.  Either might "work", but you'd be better off with two separate vehicles.And please, don't try the argument that "it's easy for me to write C++" or "I don't waste time fighting C++'s memory management and lack of dynamicity" or "I don't make bugs these days"; it's well known that people are notoriously bad at analyzing their own productivity.  There are simple studies and metrics that prove that programmers are more productive in more dynamic languages, and write safer code in safer languages.</div></summary>
  </entry>

  <entry>
    <title>GCC Predefined Macros</title>
    <link href="http://blog.onesadcookie.com/2007/11/gcc-predefined-macros.html"/>
    <id>http://yoursite/article/?i=a9c38e5996b3804b0606635ea2e1fabb</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/gcc-predefine</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As a follow-up to my earlier post on macros for detecting compilers, OSes and hardware, here's an easy way to find all the macros GCC is predefining for you:echo | gcc -dM -E -x objective-c -arch ppc -mmacosx-version-min=10.3 -Obviously, substitute the appropriate language, architectures, and minimum Mac OS X version.  The languages are c, objective-c, c++ and objective-c++.  The architectures (as of Leopard) are ppc, i386, ppc64 and x86_64.</div></summary>
  </entry>

  <entry>
    <title>5MB of logged iChats = ...</title>
    <link href="http://blog.onesadcookie.com/2007/11/5mb-of-logged-ichats.html"/>
    <id>http://yoursite/article/?i=d50234089c7f28721a4e9ac45b05ff24</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/5mb-of-logged</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I was looking for a URL, and all I knew was that it was probably sent to me by a particular person on iChat.  I found the iChat logs, found the chats with this person (126 documents, about 5MB on disk) and opened 'em all up.Bad idea.When, after about ten minutes, iChat was using 400MB of RPRVT memory and was still not responsive, I force quit.Bad idea.Turns out iChat (on Leopard only?) saves the state of all its documents, and reopens them when it relaunches.  I reopened iChat, and it became instantly unresponsive, doing exactly the same thing.  So, I left it to finish opening all the documents, then option-clicked a close box.  It closed all the windows quite happily, but has been unresponsive since.  If I force quit now, will it reopen all those documents next time I open it?</div></summary>
  </entry>

  <entry>
    <title>As if Quesa wasn't a bad enough idea...</title>
    <link href="http://blog.onesadcookie.com/2007/11/as-if-quesa-wasnt-bad-enough-idea.html"/>
    <id>http://yoursite/article/?i=fd39e2999f67ab118038c0515aacd49d</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/as-if-quesa-w</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Please kill me now.</div></summary>
  </entry>

  <entry>
    <title>Re: Apple and Gaming: being constructive</title>
    <link href="http://blog.onesadcookie.com/2007/11/re-apple-and-gaming-being-constructive.html"/>
    <id>http://yoursite/article/?i=9b3c6c87d9cc10d0a8467b66e046b4b3</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/re-apple-and-</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In response to a rapidly-derailed thread on the mac-games-dev list.  Everything I was going to say has been said already, but I still feel the need to vent!What can Apple do to help Mac game developers?  They can carry on doing exactly what they are.The Mac is a computer for users.  It always has been, and hopefully it always will be.  That means that in any situation, the user comes first.  It means that developers need to abandon their arrogant Windows ways when they come to the platform, put the users first, and write games that play nicely with the rest of the system.A game is just another application.  It doesn't get special treatment.  It should run off a disk image, install with a drag and drop, store its hidden files in ~/Library/, use the system's concept of user accounts rather than hacking on its own, use as little battery power as possible on laptops, leave the user's windows where they are, and so forth.  These are all non-negotiable parts of being a Macintosh application, and there is absolutely no need for a game to violate them.  If you think you have a good reason why these won't work for you, you don't.  Think again, there's a better solution.If Apple were to ship a gaming SDK, it would give the false impression that games are somehow special, deserving of extra attention, subject to special exceptions.  They're not.Games can perform self-update in the same way that Sparkle-enabled applications already do.  Games can download content automatically to a location in ~/Library/.  If the game wants to enable a competitive high-score table between user accounts, it can ask for administrator permission to create that table in /Library/Application Support.  These are things which are well-known to application programmers, and don't occasion complaint.  Why do game developers think they're special?</div></summary>
  </entry>

  <entry>
    <title>LSMinimumSystemVersion</title>
    <link href="http://blog.onesadcookie.com/2007/11/lsminimumsystemversion.html"/>
    <id>http://yoursite/article/?i=d12ab7ef7ac1407814a5a33688da9cdf</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/lsminimumsyst</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I tried using the Info.plist key LSMinimumSystemVersion to require 10.4.11.  It doesn't work - even on 10.4.11, you're told you can't do that:If I change the app to require 10.4.8 instead it works fine.  I'm guessing that LaunchServices is using gestaltSystemVersion to get the system version, which returns 0x1049 for all of 10.4.9, 10.4.10 and 10.4.11... Perhaps Apple should follow their own advice about retrieving the system version...</div></summary>
  </entry>

  <entry>
    <title>Universal Binaries from Autotool'd Proje</title>
    <link href="http://blog.onesadcookie.com/2007/11/universal-binaries-from-autotoold.html"/>
    <id>http://yoursite/article/?i=808aa33f780684eb103f1090afcd0aea</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/universal-bin</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A frequent question I get is "how do I build a universal binary from an autotool'd project?".  Unfortunately, as with all things autotools, the answer isn't quite straightforward.  The best approach is to configure and make the project multiple times, once for each architecture you want in your UB, with different compiler settings each time.Since autotool'd projects vary widely, the details for each will differ, but at the least, you'll need to set the CFLAGS environment variable appropriately (eg. -arch ppc -isysroot /Developer/SDKs/MacOSX10.3.9.sdk -mmacosx-version-min=10.3), and pass the correct host for a cross-compile to configure (eg. .configure --prefix=`pwd`/build/ppc --host=powerpc-apple-darwin7).Once you've got a version for each architecture built, you can use lipo to join them together into a UB.If all that sounds like too much effort, my "Third-Party" project does it already for a few common open-source libraries, and the infrastructure there makes it easy to add more.</div></summary>
  </entry>

  <entry>
    <title>More Kiloplane Bugs</title>
    <link href="http://blog.onesadcookie.com/2007/11/more-kiloplane-bugs.html"/>
    <id>http://yoursite/article/?i=3769b177942a4545657f35ec75b7e722</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/more-kiloplan</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally, 10.5 comes out, and at last the GLSL rendering bugs that have plagued Kiloplane seem to be fixed across the board.  Celebrations all round.Today, Ellie got a new MacBook (the first Mac with an Intel GMA X3100), and I got to test Kiloplane there.  Guess what?  Modes 3 and 4 render incorrectly.  Sigh.</div></summary>
  </entry>

  <entry>
    <title>Info.plist Keys</title>
    <link href="http://blog.onesadcookie.com/2007/11/infoplist-keys.html"/>
    <id>http://yoursite/article/?i=2119e09db17d94c992a672a0ede97764</id>
    <updated>2009-02-28T07:31:08-08:00</updated>
    <author>
      <name>http://blog.onesadcookie.com/2007/11/infoplist-key</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apple has a list of Info.plist keys.  There's a bunch there that I didn't know about that look useful, in particular  ATSApplicationFontsPath and  LSMinimumSystemVersion(ByArchitecture).</div></summary>
  </entry>

  <entry>
    <title>ImageIO is thread-safe after all</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/Npw7yD54BzU/imageio-is-thread-safe-after-all.html"/>
    <id>http://yoursite/article/?i=1f27cfbfa0b0236fdd2d068283050b22</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In ImageIO is not thread-safe I reported a problem with ImageIO and threading.  I now believe my analysis was wrong, and ImageIO is thread-safe after all.  Serializing my ImageIO loading had the effect of hiding the race condition in my own code, so the error became very rare.  My apologies to anyone misled by the post, and to anyone at Apple who had to deal with my bug report.</div></summary>
  </entry>

  <entry>
    <title>ImageIO is not thread-safe</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/jPQcEwOofVY/imageio-is-not-thread-safe.html"/>
    <id>http://yoursite/article/?i=71af54995383b9b60f5d371bc56846bf</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This post is wrong.  See ImageIO is thread-safe after all for correction.I can't find any documentation one way or another, and assumed that as a modern API it was OK to call ImageIO from multiple background threads.  It appears that this is not the case.  CGCreateImageSourceFromURL fails randomly if you do; always calling it from the main thread appears to work.Radar 5759067 requests that this preferably be fixed, or if not, at least documented.</div></summary>
  </entry>

  <entry>
    <title>A Delicious Limerick</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/1957dY_WQZY/delicious-limerick.html"/>
    <id>http://yoursite/article/?i=ecdb4e33cf54bd2b0570fdd7888ac777</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">How does he create all that buzz?
Wil Shipley says "Easy, it's 'cuz
    "for Delicious Lib'ry,
    "I've the weight of Mike Lee!
"Who says size doesn't matter?  It does!"With apologies to Mike (and Wil), and thanks to limerickdb</div></summary>
  </entry>

  <entry>
    <title>Multithreaded libcurl Crash</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/Xb1aU8jspjc/multithreaded-libcurl-crash.html"/>
    <id>http://yoursite/article/?i=f52ab26685d051608d283b4cde431bf2</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Thread 0 Crashed:
0   libcurl.4.dylib                0x00391e1c curl_unescape + 78
1   libcurl.4.dylib                0x003929c0 curl_unescape + 3058
2   libcurl.4.dylib                0x00393978 curl_mvsnprintf + 55
3   libcurl.4.dylib                0x003850f9 Curl_failf + 63
4   libcurl.4.dylib                0x0037d8da Curl_resolv + 95
Apparently CURLOPT_NOSIGNAL is very important in multithreaded programs...</div></summary>
  </entry>

  <entry>
    <title>Leopard doesn't verify code signatures?</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/cIhprNfElIY/leopard-doesnt-verify-code-signatures.html"/>
    <id>http://yoursite/article/?i=22302a1060f66dcc9c9183dac1e8cc49</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">With all the fuss about code signatures in Leopard, I expected that the system would verify signed applications when they're launched, and prompt the user if the signature is incorrect.  It doesn't.To test this, first verify that TextEdit's signature is valid:codesign -v /Applications/TextEdit.app/(It should print nothing).  Then edit /Applications/TextEdit.app/Contents/Info.plist.  Make sure the edit is simple enough that you can undo it - changing the version number is an easy option.  Now verify the signature again:codesign -v /Applications/TextEdit.app/
/Applications/TextEdit.app/: code or signature modifiedNow open TextEdit.  It opens without warning.  We could have replaced the executable with malicious code, and we wouldn't have been warned.Make sure you revert your change to Info.plist and re-verify the application.Since Tiger doesn't have any safeguards of this kind, obviously the situation is no worse than Tiger, but I don't understand what the point of code signing is if the OS doesn't make use of it to make the user's experience that little bit safer.</div></summary>
  </entry>

  <entry>
    <title>CFPreferences keys for OpenGL</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/BVkq_LOiZpc/cfpreferences-keys-for-opengl.html"/>
    <id>http://yoursite/article/?i=1addaff280c679fc4ac12bb3aa718e54</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mac OS X's OpenGL framework (only Leopard tested) reads a bunch of values from defaults at app startup.  They are:Integer valuesColorBufferSizeKey
DepthBufferSizeKey
MultisampleKey
RendererIDKey
ThreadedEngineKey
AcceleratedMethodKey
MaxSwapsInFlightKeyBoolean valuesColorBufferSizeEnableKey
DepthBufferSizeEnableKey
VBLSyncEnableKey
MultisampleEnableKey
RendererIDEnableKey
AllowOfflineKeyI haven't been able to make these do anything... anyone know how to use them?</div></summary>
  </entry>

  <entry>
    <title>install_name Magic</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/KjgboB7BRiU/installname-magic.html"/>
    <id>http://yoursite/article/?i=ca239f29a6726a89ba1604deda4c27c7</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mac OS X application packages allow you to embed frameworks and dynamic libraries within your application, making it easy to comply with the LGPL or use a third-party library without infringing on your users' convenience.  However, actually making this work isn't as straightforward as perhaps it should be...Dynamic libraries (and frameworks, same thing) on Mac OS X include an "install_name".  This is the absolute path that the library expects to reside at.  When a program is linked, the install_names from any dynamic libraries it links against are copied into the program, and dyld looks for the libraries at these paths when the program is run.That means that in order to embed a dynamic library into your application bundle, your program must contain an install_name for the library which points to a path inside the application bundle, and the easiest way to get the correct path into your program is to have the correct install_name in the library itself.Wait, didn't I just say that the install_name is an absolute path?  How can it point into the application bundle, when you don't know where the application bundle is?  Fortunately there's a special token @executable_path that can appear at the beginning of an install_name that refers to the absolute path of the program loading the library.Where does all this leave us?If possible, you'll build your dynamic library with the appropriate install_name$ gcc foo.c -dynamiclib -o libfoo.dylib -install_name @executable_path/../Libraries/libfoo.dylib
$ otool -L libfoo.dylib 
libfoo.dylib:
 @executable_path/../Libraries/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
Then you'll link your application as normal, and when you put the library in Contents/Libraries everything will just workIf building the dynamic library appropriately isn't an option (a closed-source third-party library for example), don't worry.  It's the install_name copied to your program that's really important, and that can be fudged.  You'll link your application with the -headerpad_max_install_names flag, then edit it with install_name_tool.$ gcc main.c -L. -lfoo -headerpad_max_install_names
$ otool -L a.out
a.out:
 /usr/local/lib/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
$ install_name_tool -change /usr/local/lib/libfoo.dylib @executable_path/../Libraries/libfoo.dylib a.out
$ otool -L a.out
a.out:
 @executable_path/../Libraries/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)</div></summary>
  </entry>

  <entry>
    <title>Ruby.framework broken in MacOSX10.5.sdk</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/2CBtV48a8Zc/rubyframework-broken-in-macosx105sdk.html"/>
    <id>http://yoursite/article/?i=426922a7d9ef2a879ade44869800c5b4</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you're trying to build against Ruby.framework on Mac OS X 10.5 you may have come across a problem with the SDK.  This manifests itself as this error:gcc test.c -framework Ruby -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
ld: framework not found Ruby
collect2: ld returned 1 exit statusThis appears to be fixable like this:cd /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/Current
sudo ln -s usr/lib/libruby.dylib RubyI don't know whether that's the right fix, but it seems to do the trick.  Radar 5661551.</div></summary>
  </entry>

  <entry>
    <title>GCC Warning Flags</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/qsjm4SHnGyg/gcc-warning-flags.html"/>
    <id>http://yoursite/article/?i=02f8596f374715626c0ee92c10f186ca</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Xcode's default warning settings are useless, not informing you of many real problems in your source code.  I compile all my code with this set of warning flags:-Wall -Wextra -Wno-unused-parameter -Wnewline-eof -Werror-WallThese are warnings that always indicate a problem with your code.  I have no idea why they''re not enabled by default.-WextraAlso known as -W.  These are warnings that indicate potential problems with your code.  They will often appear in code that's correct, but they will also often expose code that's incorrect.-Wno-unused-parameter-Wextra warns about unused parameters to functions.  Since this is a common occurrence in object-oriented code, I prefer not to see these warnings.-Wnewline-eofWarns if a source file doesn''t end with a newline character.  If you're just coding for the Mac, you can ignore this one, but GCC on Linux will error in this  situation, so if you're writing portable code, it's nice to know about it.-WerrorTreats all warnings as errors.  To make sure your code is top quality!  It's easy to lose warnings in files that aren't changed often.  It's impossible to lose errors.</div></summary>
  </entry>

  <entry>
    <title>Finding Your App's Files</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/6fDxFXKI6As/finding-your-apps-files.html"/>
    <id>http://yoursite/article/?i=c8a42cf363810d1300fda3d31e1434a1</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The current working directory for your application depends on how it was run, and what API you're using:If your application is using GLUT, the current working directory is your bundle's Resources directory.If your application is using SDL, the current working directory is the directory containing your application bundle, by default.  This is set in SDLMain.m.  You may wish to change it (see below).If you run your application from Xcode, the current working directory is the directory containing your application bundle.If you run your application from Finder, the current working directory is /If you run your application from the command-line, the current working directory is the current working directory of the controlling shell.Generally, you'll want the current working directory to be your bundle's Resources directory.  You'll set it correctly once at startup.CocoaNSString *resourcePath = [[NSBundle mainBundle] resourcePath];
[[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath];CoreFoundationCFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
char path[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
{
    // error!
}
CFRelease(resourcesURL);
chdir(path);</div></summary>
  </entry>

  <entry>
    <title>iDevGames is Back</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/sI1mGUHiE18/idevgames-is-back.html"/>
    <id>http://yoursite/article/?i=e4c7aad041e8b5e3a7760f0d2bbb5e30</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Carlos blames "IP address issues".  I'm skeptical.</div></summary>
  </entry>

  <entry>
    <title>CreateMacGames Lives!</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/M99hzHO05zA/createmacgames-lives.html"/>
    <id>http://yoursite/article/?i=133bf4547baada23b35e4590663ca5d2</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Well... kinda.  Boards at http://cmg.onesadcookie.net.</div></summary>
  </entry>

  <entry>
    <title>iDevGames is Down</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/SPlKWcngCQk/idevgames-is-down.html"/>
    <id>http://yoursite/article/?i=8a60beccc6d9e5e5278c5dac2f285098</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">iDevGames is down (as usual) and there's no sign of Carlos (as usual).  Until stuff gets fixed, head over to #idevgames on FreeNode.  Colloquy is a good IRC client if you haven't used one before.Further bulletins as events warrant.</div></summary>
  </entry>

  <entry>
    <title>Choosing a Programming Language</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/v_IBk-9wx5s/choosing-programming-language.html"/>
    <id>http://yoursite/article/?i=cf3ae1698a968f9c592534d6b33bee32</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was originally written for iDevGames and CreateMacGames (no longer in existence), but I'm republishing it here as a complement to my "Why not C++" post.  It's not exactly what I'd say today (Haskell's a lot harder to master than I make out, and a lot better at I/O than I make out) but I think it's still a good read.Like Moths to a Naked FlameAn oft-asked question by beginner programmers is, "What language should I use?".  The answers that are given vary, but usually involve heavy recommendations of C and C++.  And that's where it stops.  The student learns the recommended language, and never stops to consider what else they might learn.Time passes, the bright-eyed student becomes something of a guru herself, and when it comes their turn to answer the inevitable question for the next generation, she's hemmed in by her own experience.  "C or C++", comes the stern reply, and another generation marches blinkered toward the same fate.Why must this always be the case?  Why is it so difficult to leave the beaten track?  Why, when it comes time to start a new project, is the question always "How can this be done in C++?", rather than "What language would make this project easier?"?Why Computers are Better than People, Reason #457The point many people miss, here, is that computer languages aren't like human languages.  It might take you a lifetime to master Japanese.  You're looking at maybe a week for Python.  One week to mastery.  Not "good morning" and "my name is Ellie" clumsy beginnings; not even mere competent conversation; we're talking complete, total and utter mastery.Pick a difficult language, say Perl, and we might be in two-week territory.How about a completely different paradigm; a whole new way of thinking?  It shouldn't take a month to master Haskell.There's no reason to limit yourself by the languages you know ? the effort to acquire a new one is miniscule, while the pay-offs can be tremendous.On Round Pegs and Square HolesEvery new project gives the opportunity to start afresh; to reevaluate preconceptions; to apply knowledge gained during the execution of the last.  The choice of a programming language is no different.The decisions made now will have a profound impact on the outcome of this latest venture.  The choice of language(s) will affect how easy it is to produce the program in the first place; it will affect how easy it is to modify the program later; it may even affect how easy it is for the program's users to customize your program to their liking.  Why ignore the choice given you?People don't like to ask the difficult questions.  The questions like "Why are we using C (a language for writing high-performance code) to create a desktop office suite (where performance requirements are very low)?".  The questions like "Why are we using Java (a language for writing high-level reusable code with low performance requirements) to write a software 3D renderer supposed to run in real-time?".  The questions like "Why are we using Haskell (a language good for complex mathematical computation, but poor at I/O) to write a file-format translator?".  The questions like "Why are we using Perl (a language good for text-processing) to write an image-editing program?".Would you fire your builder if she tried to drill a hole in your wall with a spanner?Choosing the Right Tool for the JobEvery language has its strengths and weaknesses; it has areas where it particularly shines, and areas where you'll only be fighting the language to try and accomplish anything.When you start your next project, stop and think for a while.  List the requirements you have for your programming language, and match them up against actual languages.  Chances are you won't find an exact match, but this should help focus your attention on a small group of languages that are more suited to your task than the others.Color-Coordination; or When a Track-Suit isn't EnoughOne problem you've likely encountered having followed the advice of the previous paragraph is that different parts of your program have different requirements.  If you're writing a game, for example, you'll probably have a large portion of your program (containing AI, game logic, user interface, &amp;c.) which needs to be easy to build and easy to change, but where performance isn't critical.  Unfortunately, you'll also have a small, hard core of the functionality (probably graphics and physics routines) where performance is of the utmost importance.As with clothing, not everything has to be the same color.  As with food, you're allowed to have more than one flavor in a meal.  In programming, you don't have to use the same language throughout the entire program.  There are ways and means of embedding almost all languages in other languages, even if it involves going via C on the way.  This way you can enjoy the benefits of each language in the areas suited to it, without succumbing to its weak areas.Beware the fashion police, however ? too many different languages in one project will quickly tie you up in the mess of integration, rather than letting you get on with using your chosen languages.  I still have visions of my high-school English teacher, whose favorite color combination was yellow, lime green, turquoise and hot pink.  You don't have to be like her!Forging a New PathTake off your blinkers!  Look around you!  Marvel at the vast array of possibilities!  Dare to find the language which makes your task easier!And when you, in turn, get asked "Which language should I learn?", do the right thing ? ask a question in return: "What do you want to create today?".</div></summary>
  </entry>

  <entry>
    <title>I Broke GCC</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/cz_84JGcAsw/i-broke-gcc.html"/>
    <id>http://yoursite/article/?i=3a23efe6f474000dc21ba0cc4cf3b5dd</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">CookieJar:Desktop keith$ cat test.mm 
template &lt;typename S&gt;
void swap_struct(S *s)
{
    const char *encoding = @encode(S);
    // ...
}
CookieJar:Desktop keith$ gcc test.mm 
test.mm: In function ?void swap_struct(S*)?:
test.mm:4: internal compiler error: Bus error
Please submit a full bug report,
with preprocessed source if appropriate.
See &lt;URL:http://developer.apple.com/bugreporter&gt; for instructions.Darn.  That would've been a cool piece of code.  Oh well, a macro will suffice.Radar 5619052.</div></summary>
  </entry>

  <entry>
    <title>Why not C++?</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/9eso62DLodg/why-not-c.html"/>
    <id>http://yoursite/article/?i=b5f5a789e669028b4b223949516b242f</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This was originally posted on iDevGames, but since people are constantly asking me why I hate C++ so much, I thought it should be posted here too.My philosophy is that at any given time, there are three things that you may care about when programming.  From least common to most common:You want to write fast code.You want to write correct code.You want it to be easy to write code.Unfortunately, these tend to work against each other.If you want to write fast code, you need a language which takes you close to the hardware.  It needs to provide a fairly direct mapping between the "high-level" source and the assembly, so that you can pinpoint problems in the assembly and know exactly what needs to change in the high-level code to fix them.  The only language I've ever used which does this is C.  With C++, as soon as you get into references, copy constructors, operator overloading, etc. there is too much going on for that direct correlation between source and assembly to exist.If you want to write correct code, you need a language which prevents you from making as many errors as possible.  That implies a strict static type system, array bounds checking, an inability to poke around directly at bits and bytes in memory, etc.  Obviously, C++ doesn't fit that bill; the closest language I've found is Haskell.  Java's unchecked exceptions rule it out, though there are tools that can help with that.If you want it to be easy to write code, you need a language that allows you to express what you want; that doesn't tie you down to rigid typing structures, or keep you fiddling with minutiae like memory management.  This tends to mean a highly dynamic object-oriented language.  Unsurprisingly, since this is the most common category for code to be in, this is the category with the most appropriate languages in it.  Ruby and Python are two obvious ones.  C++ is far too static, and keeps you far too immersed in low-level details to be useful here.Of course, any given project is likely to consist of parts which fall into each of these three categories, which leads many people to seek a "compromise language" - one which is "fast enough", "safe enough" and "easy enough".  Ultimately, I believe such languages are always a waste of time.  You will spend more time optimizing the bits that need optimizing, more time fixing bugs in the critical sections of the code, and much, much more time trying to design your software in such a way that you can actually build it, than if you were using the appropriate language for each part.These languages are not difficult to tie together.  All have easy ways to interact with C, which can be used as a thin layer of glue to stick them all together.  The boundaries between the sections of code with different requirements tend to be reasonably well-defined, and you can therefore avoid crossing your language boundaries too often.If you're using the right language for the job, your code will be as clear, concise, and well-designed as it's possible for it to be.  To use the favorite vehicle analogy, you wouldn't try to use a Ford Ka as a personnel carrier in a war zone, and you wouldn't drive to the shops to get the groceries in an APC.  Either might "work", but you'd be better off with two separate vehicles.And please, don't try the argument that "it's easy for me to write C++" or "I don't waste time fighting C++'s memory management and lack of dynamicity" or "I don't make bugs these days"; it's well known that people are notoriously bad at analyzing their own productivity.  There are simple studies and metrics that prove that programmers are more productive in more dynamic languages, and write safer code in safer languages.</div></summary>
  </entry>

  <entry>
    <title>GCC Predefined Macros</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/9zH6NCdaePI/gcc-predefined-macros.html"/>
    <id>http://yoursite/article/?i=fe0fd69e237019e4de9c3e6327eae960</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As a follow-up to my earlier post on macros for detecting compilers, OSes and hardware, here's an easy way to find all the macros GCC is predefining for you:echo | gcc -dM -E -x objective-c -arch ppc -mmacosx-version-min=10.3 -Obviously, substitute the appropriate language, architectures, and minimum Mac OS X version.  The languages are c, objective-c, c++ and objective-c++.  The architectures (as of Leopard) are ppc, i386, ppc64 and x86_64.</div></summary>
  </entry>

  <entry>
    <title>5MB of logged iChats = ...</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/IpmYkM0yLEc/5mb-of-logged-ichats.html"/>
    <id>http://yoursite/article/?i=1bfc4f31dea9ff98771bdc97c6992131</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I was looking for a URL, and all I knew was that it was probably sent to me by a particular person on iChat.  I found the iChat logs, found the chats with this person (126 documents, about 5MB on disk) and opened 'em all up.Bad idea.When, after about ten minutes, iChat was using 400MB of RPRVT memory and was still not responsive, I force quit.Bad idea.Turns out iChat (on Leopard only?) saves the state of all its documents, and reopens them when it relaunches.  I reopened iChat, and it became instantly unresponsive, doing exactly the same thing.  So, I left it to finish opening all the documents, then option-clicked a close box.  It closed all the windows quite happily, but has been unresponsive since.  If I force quit now, will it reopen all those documents next time I open it?</div></summary>
  </entry>

  <entry>
    <title>As if Quesa wasn't a bad enough idea...</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/H-f4GtLV_IU/as-if-quesa-wasnt-bad-enough-idea.html"/>
    <id>http://yoursite/article/?i=1f019230e8cebd4ae1685cb02c1cd642</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Please kill me now.</div></summary>
  </entry>

  <entry>
    <title>Re: Apple and Gaming: being constructive</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/O7RZzBovuwY/re-apple-and-gaming-being-constructive.html"/>
    <id>http://yoursite/article/?i=18daff3c6d8d2e81c526bfeab1401a33</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In response to a rapidly-derailed thread on the mac-games-dev list.  Everything I was going to say has been said already, but I still feel the need to vent!What can Apple do to help Mac game developers?  They can carry on doing exactly what they are.The Mac is a computer for users.  It always has been, and hopefully it always will be.  That means that in any situation, the user comes first.  It means that developers need to abandon their arrogant Windows ways when they come to the platform, put the users first, and write games that play nicely with the rest of the system.A game is just another application.  It doesn't get special treatment.  It should run off a disk image, install with a drag and drop, store its hidden files in ~/Library/, use the system's concept of user accounts rather than hacking on its own, use as little battery power as possible on laptops, leave the user's windows where they are, and so forth.  These are all non-negotiable parts of being a Macintosh application, and there is absolutely no need for a game to violate them.  If you think you have a good reason why these won't work for you, you don't.  Think again, there's a better solution.If Apple were to ship a gaming SDK, it would give the false impression that games are somehow special, deserving of extra attention, subject to special exceptions.  They're not.Games can perform self-update in the same way that Sparkle-enabled applications already do.  Games can download content automatically to a location in ~/Library/.  If the game wants to enable a competitive high-score table between user accounts, it can ask for administrator permission to create that table in /Library/Application Support.  These are things which are well-known to application programmers, and don't occasion complaint.  Why do game developers think they're special?</div></summary>
  </entry>

  <entry>
    <title>LSMinimumSystemVersion</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/bZc18bcJiCg/lsminimumsystemversion.html"/>
    <id>http://yoursite/article/?i=e3234235d1b6f301e84ef8285f1e40ff</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I tried using the Info.plist key LSMinimumSystemVersion to require 10.4.11.  It doesn't work - even on 10.4.11, you're told you can't do that:If I change the app to require 10.4.8 instead it works fine.  I'm guessing that LaunchServices is using gestaltSystemVersion to get the system version, which returns 0x1049 for all of 10.4.9, 10.4.10 and 10.4.11... Perhaps Apple should follow their own advice about retrieving the system version...</div></summary>
  </entry>

  <entry>
    <title>Universal Binaries from Autotool'd Proje</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/LpyU3YLxtkE/universal-binaries-from-autotoold.html"/>
    <id>http://yoursite/article/?i=21ddb382b747f6b4aba18a28bb5c58d8</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A frequent question I get is "how do I build a universal binary from an autotool'd project?".  Unfortunately, as with all things autotools, the answer isn't quite straightforward.  The best approach is to configure and make the project multiple times, once for each architecture you want in your UB, with different compiler settings each time.Since autotool'd projects vary widely, the details for each will differ, but at the least, you'll need to set the CFLAGS environment variable appropriately (eg. -arch ppc -isysroot /Developer/SDKs/MacOSX10.3.9.sdk -mmacosx-version-min=10.3), and pass the correct host for a cross-compile to configure (eg. .configure --prefix=`pwd`/build/ppc --host=powerpc-apple-darwin7).Once you've got a version for each architecture built, you can use lipo to join them together into a UB.If all that sounds like too much effort, my "Third-Party" project does it already for a few common open-source libraries, and the infrastructure there makes it easy to add more.</div></summary>
  </entry>

  <entry>
    <title>More Kiloplane Bugs</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/L2l-30eIbSI/more-kiloplane-bugs.html"/>
    <id>http://yoursite/article/?i=8d5a25e7d3e457ede42dda21dcd63273</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally, 10.5 comes out, and at last the GLSL rendering bugs that have plagued Kiloplane seem to be fixed across the board.  Celebrations all round.Today, Ellie got a new MacBook (the first Mac with an Intel GMA X3100), and I got to test Kiloplane there.  Guess what?  Modes 3 and 4 render incorrectly.  Sigh.</div></summary>
  </entry>

  <entry>
    <title>Info.plist Keys</title>
    <link href="http://feedproxy.google.com/~r/OneSadCookie/~3/reOfm1oUQCE/infoplist-keys.html"/>
    <id>http://yoursite/article/?i=ec35a93549242989082ef8c4664354a9</id>
    <updated>2009-02-25T00:30:28-08:00</updated>
    <author>
      <name>http://feedproxy.google.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apple has a list of Info.plist keys.  There's a bunch there that I didn't know about that look useful, in particular  ATSApplicationFontsPath and  LSMinimumSystemVersion(ByArchitecture).</div></summary>
  </entry>

  <entry>
    <title>Re: Apple and Gaming: being constructive</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951775/re-apple-and-gaming-being-constructive.html"/>
    <id>http://yoursite/article/?i=6557bd48675ce4f0eb959e6fc6619c4f</id>
    <updated>2008-11-27T13:30:49-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In response to a rapidly-derailed thread on the mac-games-dev list.  Everything I was going to say has been said already, but I still feel the need to vent!What can Apple do to help Mac game developers?  They can carry on doing exactly what they are.The Mac is a computer for users.  It always has been, and hopefully it always will be.  That means that in any situation, the user comes first.  It means that developers need to abandon their arrogant Windows ways when they come to the platform, put the users first, and write games that play nicely with the rest of the system.A game is just another application.  It doesn't get special treatment.  It should run off a disk image, install with a drag and drop, store its hidden files in ~/Library/, use the system's concept of user accounts rather than hacking on its own, use as little battery power as possible on laptops, leave the user's windows where they are, and so forth.  These are all non-negotiable parts of being a Macintosh application, and there is absolutely no need for a game to violate them.  If you think you have a good reason why these won't work for you, you don't.  Think again, there's a better solution.If Apple were to ship a gaming SDK, it would give the false impression that games are somehow special, deserving of extra attention, subject to special exceptions.  They're not.Games can perform self-update in the same way that Sparkle-enabled applications already do.  Games can download content automatically to a location in ~/Library/.  If the game wants to enable a competitive high-score table between user accounts, it can ask for administrator permission to create that table in /Library/Application Support.  These are things which are well-known to application programmers, and don't occasion complaint.  Why do game developers think they're special?</div></summary>
  </entry>

  <entry>
    <title>LSMinimumSystemVersion</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951776/lsminimumsystemversion.html"/>
    <id>http://yoursite/article/?i=da5d1e3d76740bb57655f75296d64a0f</id>
    <updated>2008-11-27T13:30:49-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I tried using the Info.plist key LSMinimumSystemVersion to require 10.4.11.  It doesn't work - even on 10.4.11, you're told you can't do that:If I change the app to require 10.4.8 instead it works fine.  I'm guessing that LaunchServices is using gestaltSystemVersion to get the system version, which returns 0x1049 for all of 10.4.9, 10.4.10 and 10.4.11... Perhaps Apple should follow their own advice about retrieving the system version...</div></summary>
  </entry>

  <entry>
    <title>Universal Binaries from Autotool'd Proje</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951777/universal-binaries-from-autotoold.html"/>
    <id>http://yoursite/article/?i=853fc78edcfef3667f317dfebc8a16f7</id>
    <updated>2008-11-27T13:30:49-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A frequent question I get is "how do I build a universal binary from an autotool'd project?".  Unfortunately, as with all things autotools, the answer isn't quite straightforward.  The best approach is to configure and make the project multiple times, once for each architecture you want in your UB, with different compiler settings each time.Since autotool'd projects vary widely, the details for each will differ, but at the least, you'll need to set the CFLAGS environment variable appropriately (eg. -arch ppc -isysroot /Developer/SDKs/MacOSX10.3.9.sdk -mmacosx-version-min=10.3), and pass the correct host for a cross-compile to configure (eg. .configure --prefix=`pwd`/build/ppc --host=powerpc-apple-darwin7).Once you've got a version for each architecture built, you can use lipo to join them together into a UB.If all that sounds like too much effort, my "Third-Party" project does it already for a few common open-source libraries, and the infrastructure there makes it easy to add more.</div></summary>
  </entry>

  <entry>
    <title>More Kiloplane Bugs</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951778/more-kiloplane-bugs.html"/>
    <id>http://yoursite/article/?i=72cea7eff6d134491222eb94a1652062</id>
    <updated>2008-11-27T13:30:49-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Finally, 10.5 comes out, and at last the GLSL rendering bugs that have plagued Kiloplane seem to be fixed across the board.  Celebrations all round.Today, Ellie got a new MacBook (the first Mac with an Intel GMA X3100), and I got to test Kiloplane there.  Guess what?  Modes 3 and 4 render incorrectly.  Sigh.</div></summary>
  </entry>

  <entry>
    <title>Info.plist Keys</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951779/infoplist-keys.html"/>
    <id>http://yoursite/article/?i=3b6b630e6e43495e8558c4ad4126ccb0</id>
    <updated>2008-11-27T13:30:49-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apple has a list of Info.plist keys.  There's a bunch there that I didn't know about that look useful, in particular  ATSApplicationFontsPath and  LSMinimumSystemVersion(ByArchitecture).</div></summary>
  </entry>

  <entry>
    <title>ImageIO is thread-safe after all</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/241794820/imageio-is-thread-safe-after-all.html"/>
    <id>http://yoursite/article/?i=b843dcb55d765f863c2c38b202e45e05</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In ImageIO is not thread-safe I reported a problem with ImageIO and threading.  I now believe my analysis was wrong, and ImageIO is thread-safe after all.  Serializing my ImageIO loading had the effect of hiding the race condition in my own code, so the error became very rare.  My apologies to anyone misled by the post, and to anyone at Apple who had to deal with my bug report.</div></summary>
  </entry>

  <entry>
    <title>ImageIO is not thread-safe</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/239172936/imageio-is-not-thread-safe.html"/>
    <id>http://yoursite/article/?i=b3002bd18db670caebe3b1d0e1d653c5</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This post is wrong.  See ImageIO is thread-safe after all for correction.I can't find any documentation one way or another, and assumed that as a modern API it was OK to call ImageIO from multiple background threads.  It appears that this is not the case.  CGCreateImageSourceFromURL fails randomly if you do; always calling it from the main thread appears to work.Radar 5759067 requests that this preferably be fixed, or if not, at least documented.</div></summary>
  </entry>

  <entry>
    <title>A Delicious Limerick</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/237175173/delicious-limerick.html"/>
    <id>http://yoursite/article/?i=e84f303af37494c1026a2dc25283257c</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">How does he create all that buzz?
Wil Shipley says "Easy, it's 'cuz
    "for Delicious Lib'ry,
    "I've the weight of Mike Lee!
"Who says size doesn't matter?  It does!"With apologies to Mike (and Wil), and thanks to limerickdb</div></summary>
  </entry>

  <entry>
    <title>Multithreaded libcurl Crash</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/236638418/multithreaded-libcurl-crash.html"/>
    <id>http://yoursite/article/?i=1271ce4ee3c63ca426cc4553b676226b</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Thread 0 Crashed:
0   libcurl.4.dylib                0x00391e1c curl_unescape + 78
1   libcurl.4.dylib                0x003929c0 curl_unescape + 3058
2   libcurl.4.dylib                0x00393978 curl_mvsnprintf + 55
3   libcurl.4.dylib                0x003850f9 Curl_failf + 63
4   libcurl.4.dylib                0x0037d8da Curl_resolv + 95
Apparently CURLOPT_NOSIGNAL is very important in multithreaded programs...</div></summary>
  </entry>

  <entry>
    <title>Leopard doesn't verify code signatures?</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951755/leopard-doesnt-verify-code-signatures.html"/>
    <id>http://yoursite/article/?i=d8a7ed8524c160b61780794038dfb84f</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">With all the fuss about code signatures in Leopard, I expected that the system would verify signed applications when they're launched, and prompt the user if the signature is incorrect.  It doesn't.To test this, first verify that TextEdit's signature is valid:codesign -v /Applications/TextEdit.app/(It should print nothing).  Then edit /Applications/TextEdit.app/Contents/Info.plist.  Make sure the edit is simple enough that you can undo it - changing the version number is an easy option.  Now verify the signature again:codesign -v /Applications/TextEdit.app/
/Applications/TextEdit.app/: code or signature modifiedNow open TextEdit.  It opens without warning.  We could have replaced the executable with malicious code, and we wouldn't have been warned.Make sure you revert your change to Info.plist and re-verify the application.Since Tiger doesn't have any safeguards of this kind, obviously the situation is no worse than Tiger, but I don't understand what the point of code signing is if the OS doesn't make use of it to make the user's experience that little bit safer.</div></summary>
  </entry>

  <entry>
    <title>CFPreferences keys for OpenGL</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951756/cfpreferences-keys-for-opengl.html"/>
    <id>http://yoursite/article/?i=6812801be9219cc39da96d520099652a</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mac OS X's OpenGL framework (only Leopard tested) reads a bunch of values from defaults at app startup.  They are:Integer valuesColorBufferSizeKey
DepthBufferSizeKey
MultisampleKey
RendererIDKey
ThreadedEngineKey
AcceleratedMethodKey
MaxSwapsInFlightKeyBoolean valuesColorBufferSizeEnableKey
DepthBufferSizeEnableKey
VBLSyncEnableKey
MultisampleEnableKey
RendererIDEnableKey
AllowOfflineKeyI haven't been able to make these do anything... anyone know how to use them?</div></summary>
  </entry>

  <entry>
    <title>install_name Magic</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951757/installname-magic.html"/>
    <id>http://yoursite/article/?i=fba254b5923befc5e08a081204c711fe</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Mac OS X application packages allow you to embed frameworks and dynamic libraries within your application, making it easy to comply with the LGPL or use a third-party library without infringing on your users' convenience.  However, actually making this work isn't as straightforward as perhaps it should be...Dynamic libraries (and frameworks, same thing) on Mac OS X include an "install_name".  This is the absolute path that the library expects to reside at.  When a program is linked, the install_names from any dynamic libraries it links against are copied into the program, and dyld looks for the libraries at these paths when the program is run.That means that in order to embed a dynamic library into your application bundle, your program must contain an install_name for the library which points to a path inside the application bundle, and the easiest way to get the correct path into your program is to have the correct install_name in the library itself.Wait, didn't I just say that the install_name is an absolute path?  How can it point into the application bundle, when you don't know where the application bundle is?  Fortunately there's a special token @executable_path that can appear at the beginning of an install_name that refers to the absolute path of the program loading the library.Where does all this leave us?If possible, you'll build your dynamic library with the appropriate install_name$ gcc foo.c -dynamiclib -o libfoo.dylib -install_name @executable_path/../Libraries/libfoo.dylib
$ otool -L libfoo.dylib 
libfoo.dylib:
 @executable_path/../Libraries/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
Then you'll link your application as normal, and when you put the library in Contents/Libraries everything will just workIf building the dynamic library appropriately isn't an option (a closed-source third-party library for example), don't worry.  It's the install_name copied to your program that's really important, and that can be fudged.  You'll link your application with the -headerpad_max_install_names flag, then edit it with install_name_tool.$ gcc main.c -L. -lfoo -headerpad_max_install_names
$ otool -L a.out
a.out:
 /usr/local/lib/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
$ install_name_tool -change /usr/local/lib/libfoo.dylib @executable_path/../Libraries/libfoo.dylib a.out
$ otool -L a.out
a.out:
 @executable_path/../Libraries/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)</div></summary>
  </entry>

  <entry>
    <title>Ruby.framework broken in MacOSX10.5.sdk</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951758/rubyframework-broken-in-macosx105sdk.html"/>
    <id>http://yoursite/article/?i=211a48a3fd8730e229a3a1b34dc3a5b8</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you're trying to build against Ruby.framework on Mac OS X 10.5 you may have come across a problem with the SDK.  This manifests itself as this error:gcc test.c -framework Ruby -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
ld: framework not found Ruby
collect2: ld returned 1 exit statusThis appears to be fixable like this:cd /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/Current
sudo ln -s usr/lib/libruby.dylib RubyI don't know whether that's the right fix, but it seems to do the trick.  Radar 5661551.</div></summary>
  </entry>

  <entry>
    <title>GCC Warning Flags</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951760/gcc-warning-flags.html"/>
    <id>http://yoursite/article/?i=5dc0d2bfdd3b14cb8b52be27b1778018</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Xcode's default warning settings are useless, not informing you of many real problems in your source code.  I compile all my code with this set of warning flags:-Wall -Wextra -Wno-unused-parameter -Wnewline-eof -Werror-WallThese are warnings that always indicate a problem with your code.  I have no idea why they''re not enabled by default.-WextraAlso known as -W.  These are warnings that indicate potential problems with your code.  They will often appear in code that's correct, but they will also often expose code that's incorrect.-Wno-unused-parameter-Wextra warns about unused parameters to functions.  Since this is a common occurrence in object-oriented code, I prefer not to see these warnings.-Wnewline-eofWarns if a source file doesn''t end with a newline character.  If you're just coding for the Mac, you can ignore this one, but GCC on Linux will error in this  situation, so if you're writing portable code, it's nice to know about it.-WerrorTreats all warnings as errors.  To make sure your code is top quality!  It's easy to lose warnings in files that aren't changed often.  It's impossible to lose errors.</div></summary>
  </entry>

  <entry>
    <title>Finding Your App's Files</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951762/finding-your-apps-files.html"/>
    <id>http://yoursite/article/?i=2368fe6eff5c8be8d77671a548385648</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The current working directory for your application depends on how it was run, and what API you're using:If your application is using GLUT, the current working directory is your bundle's Resources directory.If your application is using SDL, the current working directory is the directory containing your application bundle, by default.  This is set in SDLMain.m.  You may wish to change it (see below).If you run your application from Xcode, the current working directory is the directory containing your application bundle.If you run your application from Finder, the current working directory is /If you run your application from the command-line, the current working directory is the current working directory of the controlling shell.Generally, you'll want the current working directory to be your bundle's Resources directory.  You'll set it correctly once at startup.CocoaNSString *resourcePath = [[NSBundle mainBundle] resourcePath];
[[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath];CoreFoundationCFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
char path[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
{
    // error!
}
CFRelease(resourcesURL);
chdir(path);</div></summary>
  </entry>

  <entry>
    <title>iDevGames is Back</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951763/idevgames-is-back.html"/>
    <id>http://yoursite/article/?i=e4ffb22da7d4147ed3d6b1d09383387f</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Carlos blames "IP address issues".  I'm skeptical.</div></summary>
  </entry>

  <entry>
    <title>CreateMacGames Lives!</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951765/createmacgames-lives.html"/>
    <id>http://yoursite/article/?i=a4c8d8a18f692892c742d225b69f055e</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Well... kinda.  Boards at http://cmg.onesadcookie.net.</div></summary>
  </entry>

  <entry>
    <title>iDevGames is Down</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951767/idevgames-is-down.html"/>
    <id>http://yoursite/article/?i=463e45f07eaa2cbd841aa0d873888e88</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">iDevGames is down (as usual) and there's no sign of Carlos (as usual).  Until stuff gets fixed, head over to #idevgames on FreeNode.  Colloquy is a good IRC client if you haven't used one before.Further bulletins as events warrant.</div></summary>
  </entry>

  <entry>
    <title>Choosing a Programming Language</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951768/choosing-programming-language.html"/>
    <id>http://yoursite/article/?i=0aa708d049a96e79201988e37f913bab</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This article was originally written for iDevGames and CreateMacGames (no longer in existence), but I'm republishing it here as a complement to my "Why not C++" post.  It's not exactly what I'd say today (Haskell's a lot harder to master than I make out, and a lot better at I/O than I make out) but I think it's still a good read.Like Moths to a Naked FlameAn oft-asked question by beginner programmers is, "What language should I use?".  The answers that are given vary, but usually involve heavy recommendations of C and C++.  And that's where it stops.  The student learns the recommended language, and never stops to consider what else they might learn.Time passes, the bright-eyed student becomes something of a guru herself, and when it comes their turn to answer the inevitable question for the next generation, she's hemmed in by her own experience.  "C or C++", comes the stern reply, and another generation marches blinkered toward the same fate.Why must this always be the case?  Why is it so difficult to leave the beaten track?  Why, when it comes time to start a new project, is the question always "How can this be done in C++?", rather than "What language would make this project easier?"?Why Computers are Better than People, Reason #457The point many people miss, here, is that computer languages aren't like human languages.  It might take you a lifetime to master Japanese.  You're looking at maybe a week for Python.  One week to mastery.  Not "good morning" and "my name is Ellie" clumsy beginnings; not even mere competent conversation; we're talking complete, total and utter mastery.Pick a difficult language, say Perl, and we might be in two-week territory.How about a completely different paradigm; a whole new way of thinking?  It shouldn't take a month to master Haskell.There's no reason to limit yourself by the languages you know ? the effort to acquire a new one is miniscule, while the pay-offs can be tremendous.On Round Pegs and Square HolesEvery new project gives the opportunity to start afresh; to reevaluate preconceptions; to apply knowledge gained during the execution of the last.  The choice of a programming language is no different.The decisions made now will have a profound impact on the outcome of this latest venture.  The choice of language(s) will affect how easy it is to produce the program in the first place; it will affect how easy it is to modify the program later; it may even affect how easy it is for the program's users to customize your program to their liking.  Why ignore the choice given you?People don't like to ask the difficult questions.  The questions like "Why are we using C (a language for writing high-performance code) to create a desktop office suite (where performance requirements are very low)?".  The questions like "Why are we using Java (a language for writing high-level reusable code with low performance requirements) to write a software 3D renderer supposed to run in real-time?".  The questions like "Why are we using Haskell (a language good for complex mathematical computation, but poor at I/O) to write a file-format translator?".  The questions like "Why are we using Perl (a language good for text-processing) to write an image-editing program?".Would you fire your builder if she tried to drill a hole in your wall with a spanner?Choosing the Right Tool for the JobEvery language has its strengths and weaknesses; it has areas where it particularly shines, and areas where you'll only be fighting the language to try and accomplish anything.When you start your next project, stop and think for a while.  List the requirements you have for your programming language, and match them up against actual languages.  Chances are you won't find an exact match, but this should help focus your attention on a small group of languages that are more suited to your task than the others.Color-Coordination; or When a Track-Suit isn't EnoughOne problem you've likely encountered having followed the advice of the previous paragraph is that different parts of your program have different requirements.  If you're writing a game, for example, you'll probably have a large portion of your program (containing AI, game logic, user interface, &amp;c.) which needs to be easy to build and easy to change, but where performance isn't critical.  Unfortunately, you'll also have a small, hard core of the functionality (probably graphics and physics routines) where performance is of the utmost importance.As with clothing, not everything has to be the same color.  As with food, you're allowed to have more than one flavor in a meal.  In programming, you don't have to use the same language throughout the entire program.  There are ways and means of embedding almost all languages in other languages, even if it involves going via C on the way.  This way you can enjoy the benefits of each language in the areas suited to it, without succumbing to its weak areas.Beware the fashion police, however ? too many different languages in one project will quickly tie you up in the mess of integration, rather than letting you get on with using your chosen languages.  I still have visions of my high-school English teacher, whose favorite color combination was yellow, lime green, turquoise and hot pink.  You don't have to be like her!Forging a New PathTake off your blinkers!  Look around you!  Marvel at the vast array of possibilities!  Dare to find the language which makes your task easier!And when you, in turn, get asked "Which language should I learn?", do the right thing ? ask a question in return: "What do you want to create today?".</div></summary>
  </entry>

  <entry>
    <title>I Broke GCC</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951769/i-broke-gcc.html"/>
    <id>http://yoursite/article/?i=0d07485c949e5f1af2c0c393e36f4278</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">CookieJar:Desktop keith$ cat test.mm 
template &lt;typename S&gt;
void swap_struct(S *s)
{
    const char *encoding = @encode(S);
    // ...
}
CookieJar:Desktop keith$ gcc test.mm 
test.mm: In function ?void swap_struct(S*)?:
test.mm:4: internal compiler error: Bus error
Please submit a full bug report,
with preprocessed source if appropriate.
See &lt;URL:http://developer.apple.com/bugreporter&gt; for instructions.Darn.  That would've been a cool piece of code.  Oh well, a macro will suffice.Radar 5619052.</div></summary>
  </entry>

  <entry>
    <title>Why not C++?</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951770/why-not-c.html"/>
    <id>http://yoursite/article/?i=f257a0892204f0faac918386ba5fefc5</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This was originally posted on iDevGames, but since people are constantly asking me why I hate C++ so much, I thought it should be posted here too.My philosophy is that at any given time, there are three things that you may care about when programming.  From least common to most common:You want to write fast code.You want to write correct code.You want it to be easy to write code.Unfortunately, these tend to work against each other.If you want to write fast code, you need a language which takes you close to the hardware.  It needs to provide a fairly direct mapping between the "high-level" source and the assembly, so that you can pinpoint problems in the assembly and know exactly what needs to change in the high-level code to fix them.  The only language I've ever used which does this is C.  With C++, as soon as you get into references, copy constructors, operator overloading, etc. there is too much going on for that direct correlation between source and assembly to exist.If you want to write correct code, you need a language which prevents you from making as many errors as possible.  That implies a strict static type system, array bounds checking, an inability to poke around directly at bits and bytes in memory, etc.  Obviously, C++ doesn't fit that bill; the closest language I've found is Haskell.  Java's unchecked exceptions rule it out, though there are tools that can help with that.If you want it to be easy to write code, you need a language that allows you to express what you want; that doesn't tie you down to rigid typing structures, or keep you fiddling with minutiae like memory management.  This tends to mean a highly dynamic object-oriented language.  Unsurprisingly, since this is the most common category for code to be in, this is the category with the most appropriate languages in it.  Ruby and Python are two obvious ones.  C++ is far too static, and keeps you far too immersed in low-level details to be useful here.Of course, any given project is likely to consist of parts which fall into each of these three categories, which leads many people to seek a "compromise language" - one which is "fast enough", "safe enough" and "easy enough".  Ultimately, I believe such languages are always a waste of time.  You will spend more time optimizing the bits that need optimizing, more time fixing bugs in the critical sections of the code, and much, much more time trying to design your software in such a way that you can actually build it, than if you were using the appropriate language for each part.These languages are not difficult to tie together.  All have easy ways to interact with C, which can be used as a thin layer of glue to stick them all together.  The boundaries between the sections of code with different requirements tend to be reasonably well-defined, and you can therefore avoid crossing your language boundaries too often.If you're using the right language for the job, your code will be as clear, concise, and well-designed as it's possible for it to be.  To use the favorite vehicle analogy, you wouldn't try to use a Ford Ka as a personnel carrier in a war zone, and you wouldn't drive to the shops to get the groceries in an APC.  Either might "work", but you'd be better off with two separate vehicles.And please, don't try the argument that "it's easy for me to write C++" or "I don't waste time fighting C++'s memory management and lack of dynamicity" or "I don't make bugs these days"; it's well known that people are notoriously bad at analyzing their own productivity.  There are simple studies and metrics that prove that programmers are more productive in more dynamic languages, and write safer code in safer languages.</div></summary>
  </entry>

  <entry>
    <title>GCC Predefined Macros</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951771/gcc-predefined-macros.html"/>
    <id>http://yoursite/article/?i=0aa3471ca1fa9199b6a6c52379b145b7</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As a follow-up to my earlier post on macros for detecting compilers, OSes and hardware, here's an easy way to find all the macros GCC is predefining for you:echo | gcc -dM -E -x objective-c -arch ppc -mmacosx-version-min=10.3 -Obviously, substitute the appropriate language, architectures, and minimum Mac OS X version.  The languages are c, objective-c, c++ and objective-c++.  The architectures (as of Leopard) are ppc, i386, ppc64 and x86_64.</div></summary>
  </entry>

  <entry>
    <title>5MB of logged iChats = ...</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951772/5mb-of-logged-ichats.html"/>
    <id>http://yoursite/article/?i=39fe8328d4db3c707e2d6a4553621373</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I was looking for a URL, and all I knew was that it was probably sent to me by a particular person on iChat.  I found the iChat logs, found the chats with this person (126 documents, about 5MB on disk) and opened 'em all up.Bad idea.When, after about ten minutes, iChat was using 400MB of RPRVT memory and was still not responsive, I force quit.Bad idea.Turns out iChat (on Leopard only?) saves the state of all its documents, and reopens them when it relaunches.  I reopened iChat, and it became instantly unresponsive, doing exactly the same thing.  So, I left it to finish opening all the documents, then option-clicked a close box.  It closed all the windows quite happily, but has been unresponsive since.  If I force quit now, will it reopen all those documents next time I open it?</div></summary>
  </entry>

  <entry>
    <title>As if Quesa wasn't a bad enough idea...</title>
    <link href="http://feeds.feedburner.com/~r/OneSadCookie/~3/233951774/as-if-quesa-wasnt-bad-enough-idea.html"/>
    <id>http://yoursite/article/?i=0f389f11fbb67a81f778a5ccbdefe322</id>
    <updated>2008-11-27T13:30:48-08:00</updated>
    <author>
      <name>http://feeds.feedburner.com/~r/O</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Please kill me now.</div></summary>
  </entry>

  <entry>
    <title>OPTLINK Fixed  NOT</title>
    <link href="http://h3.gd/devlog/?p=31"/>
    <id>http://yoursite/article/?i=15c2d03d023588ce39979b28fa62ce85</id>
    <updated>2010-09-04T05:22:42-07:00</updated>
    <author>
      <name>1aad0225b33c97aab760a11b22098ace</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Or at least the latest version seems to fix one particular case I&#8217;ve been getting. Today Walter closed an issue in bugzilla and just it might be the bug which has been tormenting all DMD-win users since about&#8230; forever. Try it yourself:&#160;OPTLINK 8.00.6 &#8211; it could be a life-saver. I think my plush mudkip and me are having a party tonight.
BTW, In case you haven&#8217;t heard, reddit is the new bugzilla vote system
Edit: OPTLINK still ruins the day.</div></summary>
  </entry>

  <entry>
    <title>OPTLINK Fixed</title>
    <link href="http://h3.gd/devlog/?p=31"/>
    <id>http://yoursite/article/?i=6e07d591cd357a06fb089898b82fdfed</id>
    <updated>2010-09-03T01:15:26-07:00</updated>
    <author>
      <name>1aad0225b33c97aab760a11b22098ace</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Or at least the latest version seems to fix one particular case I&#8217;ve been getting. Today Walter closed an issue in bugzilla and just it might be the bug which has been tormenting all DMD-win users since about&#8230; forever. Try it yourself:&#160;OPTLINK 8.00.6 &#8211; it could be a life-saver. I think my plush mudkip and me are having a party tonight.
BTW, In case you haven&#8217;t heard, reddit is the new bugzilla vote system</div></summary>
  </entry>

  <entry>
    <title>The angry emo D rant</title>
    <link href="http://h3.gd/devlog/?p=22"/>
    <id>http://yoursite/article/?i=589a6f9a16dcd3e6efb46bf21d1c2d15</id>
    <updated>2010-07-15T01:05:31-07:00</updated>
    <author>
      <name>1aad0225b33c97aab760a11b22098ace</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Disclaimer: This is a personal opinion of a long-time D 1.0 user. Every time I get asked about my experiences with D, it deranges into this. I thought I&#8217;d write it down and not re-type each time someone tosses the question. It may not reflect the actual state of D and certainly not the state by which it&#8217;s being marketed. If you&#8217;re positively emotional about D, you probably don&#8217;t want to read this. You might read http://h3.gd/devlog/?p=16 for a lighter (and older) version instead.
I knew quite a bit of C++ when I started learning D. You can never really get to know the beast completely, but I&#8217;d been around 4 years into it, feeling rather comfortable about it. Not to the point of being able to read Boost code, but enough for my daily needs ;) I also took up some Python before starting on D and knew a bit of x86 Asm.
Yet even with these traits, learning D was a long process &#8211; there are (still) no tutorials and articles to teach you some of the finer points of the language, traps and costs hidden therein. Back at the time, D was still evolving (I jumped aboard at around D 0.68) so the process involved going through the specification a few times, experimenting, reporting bugs and following the newsgroups.
After 6 or so years of using it, I&#8217;ve grown rather proficient with D and I think it allows me to be more productive than C++ ever could. Still, there are some traps and issues which made that difficult to achieve. The D language was meant to be easy to implement and the DMD compiler was supposed to be clearly designed and implemented. But as D matured, the growth happened through accretion and some concepts were glued on without much care to how they might interact at finer levels in the language as a theoretical entity as well as in the implementation.
You get local type inference which gets utterly confused with &#8216;properties&#8217;. You get a GC which is non-generational, non-concurrent and global, along with C-style (non-discriminated) unions. You get .di file generation, which is supposed to automatically provide something resembling C headers, and the feature is outright &#8216;borken&#8217;. There are template mixins, which are supposed to work just like copy-paste, but are far from it (yea, you can use &#8217;string mixins&#8217; but they&#8217;re just a huge and buggy hack anyway). Another example &#8211; the compiler will usually spectacularly poo itself when presented with cyclic imports. Not to say these are broken per se, but it might just happen that something explodes in a weird way and you get a cryptic error you can&#8217;t really fix, which would not occur without cyclic dependencies between modules.
And even if the bug gets fixed, when working on a larger project, you get to experience how poorly implemented the compilation model is &#8211; you can pass multiple .d files to the compiler and it will emit some symbols just once &#8211; e.g. template instantiations and initializers. But it will output multiple object files, and it&#8217;s not specified in which files particular symbols will land. Good luck performing incremental builds with that! And this once again leads me to D&#8217;s biggest issue &#8211; the toolchain. I needed to create my own build tool which does its best to incrementally compile projects. Walter might claim that DMD is fast, but it&#8217;s not exactly blazing when you confront it with a few hundred thousand lines of code. With C/C++, you&#8217;d split your source into .c and .h files, which mean that a localized change of a .c file only requires the compilation of a single unit. Take an incremental linker as well, and C++ compiles faster than D. With D you often have the situation of having to recompile everything upon the slightest change. The DMD frontend also takes an interesing approach to memory management &#8211; it&#8217;s based around a GC which is&#8230; disabled due to some bugs.
Another toolchain-related issue: need to profile some code written in C/C++? Just fire up VTune, CodeAnalyst, (Very) Sleepy or the Visual Studio Team Edition profiler. D on Windows? Sadly, it uses an archaic debug info format which goes into PE &#8211; the CodeView. And that in turn meant that I needed to write my own profiler. The situation on Linux is probably better, since DMD on Linux can finally generate proper debug info, since about&#8230; two months ago :P And yea, there&#8217;s built-in code-instrumentation via -profile, but I&#8217;m after a statistical profiler, not one with reduces my soft real-time app to a turtle.
On Linux you&#8217;re also lucky enough to be able to use the GCC linker, however on Windows you get to work with OPTLINK. It&#8217;s fast! It&#8217;s tiny! It&#8217;s 20 years old and will crash in your face when you feed it too many symbols. Its crash-rate was reduced slightly when Walter disabled the emission of WKEXT symbols (weak extern in OMF-parlance) from DMD, but I still need to compile parts of my projects without debug info and contract checking. I also needed to add a custom compiler pragma which suppresses symbol generation from code used only at compile-time.
But yeah, it&#8217;s not all bad &#8211; you get to use some handy meta-programming features, such as &#8217;static if&#8217;, tuples, &#8217;static&#8217; foreach (loops unrolled explicitly at compile-time), compile-time function execution, as well as useful runtime constructs. Fast delegates, foreach/opApply, guaranteed initialization, handy SSE-optimized array ops, RTTI which sucks less than C++&#8217;s. There&#8217;s a layer of pretty tasty sugar on top, such as local type inference, delegate literals / lambdas, class references, lack of &#8216;::&#8217; and &#8216;-&gt;&#8217;, built-in arrays (if you don&#8217;t care about the speed of their allocation) and a few others. In the end, these make me pretty productive and comfortable, but learning how to use the language and its tools optimally has been a painful experience. It would certainly be easier if the creators weren&#8217;t so busy flaming the Tango library (or just posting FUD and not bothering to correct it) and ignoring the (sadly, very small) community.
Users normally aren&#8217;t better, though. They try the language and expect everything to be rock solid &#8211; this has been since the beginning of D. So they play with it, decide it&#8217;s not ready yet and leave for other pastures. There are a few of who have been hanging around for about as long as D exists. Some of us have tried contributing code to the standard library, which turned out impossible. Then Tango was born as an alternative standard lib. There were discussions of it becoming the standard as it de-facto is within the 1.0 community, but they were later forgotten by the upper management. And now the Tango project is the black sheep as its contributors have grown generally tired of interacting with &#8216;the creators of D.&#8217;
Ah yea, and now there&#8217;s the &#8220;D 2.0&#8243; thing which is more confused than ever. Does it want to be a better C, a better Java, a more contrived Boost? I can&#8217;t tell any more.
Someone please fork D 1.0 to hell. I&#8217;m already using a modified compiler ( no built-in Thread-Local Storage in DMD1?! Despite it only requiring changes in about 3 lines of the source code? WTF. ).</div></summary>
  </entry>

  <entry>
    <title>DShade</title>
    <link href="http://h3.gd/devlog/?p=5"/>
    <id>http://yoursite/article/?i=006d8c3e9d8ea5af58c26eddf0ae0632</id>
    <updated>2010-03-09T12:25:51-08:00</updated>
    <author>
      <name>http://h3.gd/devlog/?p=5</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>DShade</title>
    <link href="http://h3.team0xf.com/devlog/?p=5"/>
    <id>http://yoursite/article/?i=dab2ed1ced4aea62c97071272613ae5b</id>
    <updated>2010-03-09T12:25:44-08:00</updated>
    <author>
      <name>http://h3.team0xf.com/devlog/?p=</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"></div></summary>
  </entry>

  <entry>
    <title>Re: The Present of D</title>
    <link href="http://h3.gd/devlog/?p=16"/>
    <id>http://yoursite/article/?i=b5d3eb8969c8bbdd4bd9d2c30dcae475</id>
    <updated>2010-03-07T06:02:03-08:00</updated>
    <author>
      <name>http://h3.gd/devlog/?p=16</name>
    </author>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Jarrett can complain like no one else. But he also makes many good points about the state of D. There are tons of inconsistencies and flaws in the language and its toolchain. But that has to be quite obvious. After all, if it wasn&#8217;t for these deficiencies, D would certainly be a major player in the programming industry.
It&#8217;s true &#8211; the future of D is uncertain, but it has always been such. Has it worsened considerably in the recent future? Nope. Has it improved? Yes, but not much.
Some time ago there wasn&#8217;t even a good system library for D1. As Jarrett successfully notes, Phobos is underwhelming. I&#8217;d go even further by being politically incorrect and saying that it&#8217;s a complete mess. My recipe for spaghetti: try drawing an import graph of Phobos. It&#8217;s full of cycles and as we know, the DMD frontend hates cycles. They produce some of the most incomprehensible error messages the compiler can spew.
Fortunately, we don&#8217;t have to use Phobos anymore with D1. Tango is a much better option, as most of the community have already figured.
Not that long ago, D could only be reasonably used on two platforms: Windows and Linux. Now it can also run on OSX, FreeBSD, Solaris and there are folks that use it on Nintendo DS.
The other areas of D are also improving &#8211; QtD is great, Descent never ceases to amaze with its IntelliSense and compile-time code views, and LDC can do awesome code optimization, sometimes beating C++ and usually matching it.
I don&#8217;t agree with Jarrett on the matter of Tango &#8211; in my opinion, it&#8217;s quite stable and not hard to keep up with at all. If you&#8217;re using the SVN revisions, you&#8217;ll at least have to follow the Trac timeline for it. An RSS feed read daily will suffice just fine. But if you don&#8217;t feel like riding the cutting edge, sticking to the larger releases is what most people do anyway. In this case, you&#8217;d just have to read the &#8216;Breaking changes&#8217; section when it&#8217;s out. And except the major I/O system overhaul, it never gets any lengthy. Writing a library to support both the cutting edge and the stable version might be quite tricky, but that&#8217;s what we have version blocks for.
As for the supposed difficulty configuring it, there are the effortless bundles as well as instructions for manual installation.
So D actually is improving, thus Jarrett is a madman and a drunkard. Well, no, he&#8217;s not, at least not always. You need to take his latest post with a grain of salt. The thing about frustration is that it stacks up. And folks are getting more and more frustrated with specific parts of D. As far as community goes, it&#8217;s doing fine: several folks working on a native D kernel, the first demoscene production, a few games in the making and many projects that I personally lack comprehension in order to discover fully. But unfortunately, the opinion that is becoming increasingly common is that the makers of D, most notably Walter can&#8217;t keep up. The specification is vague on many topics, to say the least. It&#8217;s not clear whether we&#8217;re really programming in D or perhaps in &#8220;DMD.languageof&#8221;. This issue is extremely efficient at depressing the makers of alternative compilers, like LDC and Dil. They would all like the corner cases to be cleaned up. Sure, they could submit patches and hopefully Walter would include them. But at one point, you can&#8217;t even know whether something is a bug or a feature. How do you fix something that is not well specified, but it&#8217;s known that the specification is frozen?
Another part that I think deserves special attention is my personal favorite: OPTLINK. The linker that you will most probably use if you program in D on Windows. That is, unless you&#8217;re adventurous and compile with a custom-patched version of GDC on top of MinGW or LDC without exceptions. The thing about OPTLINK is that it&#8217;s awesome AND it sucks. I mean, it&#8217;s very fast and we all love it for that. But at the same time, anyone doing non-trivial development with D probably knows the dreadful MessageBox Of Death. A recipe for obtaining it: build a medium-sized D project with debug info. You&#8217;ll get to know the x86 register values as OPTLINK comes crashing down at your face.
What Walter says: it&#8217;s hard for a module to reach the limit of &#8220;fixups&#8221;, it can be split up.
What happens in the real world: templates. And with them, ClassInfo, TypeInfo, debug info. Sum it all up and it&#8217;s not hard for a module to reach the fixup limit (which is an OPTLINK bug, not a problem inherent in OMF &#8211; the object file format it uses &#8211; DDL can process these &#8216;too large&#8217; files just fine). It does happen in practice, and when it happens, it&#8217;s really bad. It&#8217;s grown to the status of voodoo, and in fact magic is used to prevent it from happening as well. &#8220;Try putting the modules in a different order when passing them to the compiler&#8221; and &#8220;Compile everything at once instead of one module at a time&#8221; are two such incantations. Sometimes they work &#8211; the compiler will put template instances in different modules, depending on which ones are encountered first. But automatic build tools don&#8217;t really make this well controllable. And if you&#8217;ve tried all the combinations of module order and you&#8217;re still getting the error? Remove -g when compiling. No debug info for you. But when that doesn&#8217;t suffice? You&#8217;re screwed. Like me.
I was working on &#8216;xpose2&#8242;, a meta-data processing and generation lib that allowed me to effortlessly expose D classes to MiniD, serialization and whatever else I wanted. Using xpose2 with MiniD and my game was quite easy and pleasant initially. That is, until OPTLINK issues struck. So I put the modules that used xpose2 into a separate package, compiled them into a lib separately from the rest of the project and built them without -g. I could lose debug info for them with relatively little disadvantage. Fine for a while, I continued binding more classes to MiniD. The linker was more persistent than that &#8211; the issues came back&#8230; But I don&#8217;t give up so easily &#8211; I split the bindings into more modules and worked with it for a while. Then it turned out DMD didn&#8217;t like me for splitting it up and gave me some strange crashes at my program&#8217;s runtime. After a lengthy investigation, it turned out it was a codegen bug related to the supposedly fixed issue of template mixins not being instantiated enough times, so e.g. typeof(this) yielded the incorrect type. After a whole process of giving up on it, doing &#8216;hg rm minid&#8217;, then reverting it, I had to settle on a hack that would mean I would not be screwed that much. I&#8217;ve modified xpose2 to rely more on string mixins (which I despise but have to use them in order to do the more complex metaprogramming) and added a custom pragma to DMD which would cause it not to emit symbols or debug info for functions and types used only for CTFE.
If you&#8217;d