160 Chubb Av, Lyndhurst, NJ 07071
9/09 - 2/11
Publisher: Saturnine Games
Release Date: January 2011
System: XBox 360, PC, Nintendo DSiWare
My Role: Artificial Intelligence Programmer
Game Summary: Wield your powers of gravity manipulation to fend off a robot invasion. Perform impossible jumps, destroy enemies, and solve puzzles by bending gravity. Explore 20 challenging levels, 2 difficulty settings, and bonus unlockable content.
Specifics: I created a reusable AI engine, which I used to create all the enemies and bosses in the game. This engine can allow for any behavior I can think of for an enemy to have in a 2D platformer game. While not all of the engine's features are used in Antipole, the idea was that this engine continue to be used in future games developed by Saturnine Games. The system has 129 fields. It's expected that most states will leave most of those fields blank and only fill in what that state needs to use.
I will use the example of shooting a projectile to explain how my system essentially works. To have an enemy shoot a projectile, three fields need to be filled in:
"shoot_when" is where the trigger that causes the enemy to shoot would go. If you want it to shoot every 60 frames, this would be "60". To shoot randomly every 40-80 frames, this would be "40_80". To shoot whenever it hits a wall, you would put "hit_wall". There are 27 different triggers that can go in a systems "_when" field, and 22 systems with a "_when" field just like this one. This makes most of the AI behaviors event driven. You can give multiple triggers to a field by separating them with a comma. Example: "60,get_hit" would react every 60 frames and also react when the enemy is hit by the player's shot.
"shoot_what" is where the id of the state to create would go. The projectile is it's own enemy, so it has at least one state in the list and therefore at least one id. By having the projectile be an enemy, more behaviors are possible, such as player-seeking missiles, or using this feature for a factory enemy to simply create a basic enemy instead of shooting anything. Putting several ids here, comma separated, would randomize which one gets created each time.
"shoot_where" contains an angle to aim the shot, or "player" to aim at the player. "0" is forward, "90" is upward. A range can be specified, such as "-30_30" to randomly shoot anywhere between -30 and 30 degrees.
Download game trailer for Antipole
Return to Professional Work