The Gym: Where The Incredible Hulk Goes To Train Bryan Brandt Lead Gameplay Programmer Kevin Coughlan Technical Director
Whats This All About? One tool, one system for: Character mechanics Enemy behaviour Mission scripting Intended Audience: Gameplay & Tools Programmers Technical Artists & Animators Designers & Scripters
Session Overview The Incredible Hulk: Ultimate Destruction The Gym Demos and Details Successes and Pitfalls Conclusion
Introductions: Radical Entertainment Founded in 1991, 25+ titles published, 230+ employees, based in Vancouver, BC, Canada Acquired in March 2005 by Vivendi Universal Games Recent hits: Simpsons Road Rage The Hulk Simpsons Hit and Run Crash: Tag Team Racing The Incredible Hulk: Ultimate Destruction (IHUD) Scarface (coming in 2006)
The Incredible Hulk: Ultimate Destruction GameRankings: 85.2% Very little overtime! ~24 months of development ~35 people Critical success with no death march
The Challenge Character mechanics 150 different moves for Hulk alone Enemy behaviour 18 enemy types Mission scripting 25+ story missions 40 challenge missions
Our Solution: The Gym Game logic editor
Fight Trees Fight trees are decision trees and state machines Types of fight trees in IHUD Motion tree : character mechanics AI tree : enemy behavior Scenario tree :mission scripting
Motion Tree Character mechanics Locomotion Simple Attacks Picking up objects of various types Attacking with objects Weaponizing Grapples Reactions to getting hit One motion tree for each character type 20 different motion trees in IHUD
Demo #1: Adding an attack Conditions Tracks collision attacks buttonPress( Punch ) animation( right_hook ) 1
Components of a Fight Tree Branches Conditions Tracks
Branches Branches are typically Banks Nodes Hulks motion tree: 750+ banks, nodes
Conditions Fight Trees are decision trees Each branch contains a list of conditions Conditions evaluate to true or false 200+ types of conditions Button pressed / held / released Prop is being held Randomizer Evaluate a Lua expression Operators: and, or, not
Tracks Fight Trees are state machines Nodes represent a state Nodes contain a list of tracks Each track describes an action to be performed 230+ types of tracks Play an animation Play a sound Display a special effect Test for collision Conditionally transition to another node Run a Lua script
How Does It Work? Querying Evaluate tree conditions depth-first for a node that will become the next state. Execution If a node is found, run it! Node execution stops when either: All its tracks are finished running. A new node has been queued for execution.
Demo #2 – Combo attacks Conditions Tracks collision buttonPress( Punch ) animation( uppercut ) 1 2 opportunity( ) 2 animation( right_hook )
AI Tree Goal: Scripted, state-based enemy behaviour Sample decisions: Pursue target if too far away Engage target when in range Attack target when its my turn Solution: Use existing fight tree system
Scenario Tree Goal: Event-driven mission scripting Whats a mission? Free roaming 25+ Game missions 40 Challenge missions Whats an event? actor death, object pick-up / drop / destruction, trigger volume enter / exit, path waypoint traversal, etc. Solution: Use existing fight tree system But with minor tweaks!
How Did We Make It Work? Querying When an event is generated, query the tree for all nodes that match the event conditions. Often more than one event per frame Execution Run each node concurrently
Demo #3: Scenario Tree Conditions Tracks event( Prop - Destroyed ) lua( x = x + 1 hud_Message( x ) ) event_PropType( bus )
Successes Cross-disciplinary tool Ease of iteration Fast prototyping Build on what youve got!
Pitfalls Multi-user issues Instability Communication between trees UI bloat
Conclusion One tool, one system for: Character mechanics Enemy behaviour Mission scripting We couldnt have made IHUD without it!
Questions? Bryan Brandt Kevin Coughlan Also check out: Harnessing Hulk: Controls, Motion, Gameplay! Eric Holmes, Bryan Brandt Thursday, 5:30pm 6:30pm