State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in
Jason Gregory
Generalist Programmer
Naughty Dog, Inc.
Monday, April 6, 2009
Agenda
• Introduction to game scripting
• Extending the game object model
• State script syntax
• Case studies from
Uncharted 2: Among Thieves
• Implementation discussion
• Summary and some tips
Game Developers Conference 2009 2
Monday, April 6, 2009
Brief History of State Scripts
• Script system on Uncharted: Drake’s Fortune originally developed
for in-game cinematics (IGCs)
• Evolved into general gameplay scripting system
Game Developers Conference 2009 4
Monday, April 6, 2009
Brief History of State Scripts
• UDF IGC system revamped for heavy
use on Uncharted 2: Among Thieves
• Inspirations:
GOAL language used on Crash and Jak series
State objects from God of War engine
TM
Game Developers Conference 2009 5
Monday, April 6, 2009
Why Script?
• Scripting languages used in games since Quake C
• Primary benefits of script:
Takes pressure off engineering team
Code becomes data—rapid iteration
Empowers content creators
Key enabler of mod community
Game Developers Conference 2009 6
Monday, April 6, 2009
Why Script?
• Scripting languages used in games since Quake C
• Primary benefits of script:
I feel empowered!
Takes pressure off engineering team
Code becomes data—rapid iteration
Empowers content creators
Key enabler of mod community
Game Developers Conference 2009 6
Monday, April 6, 2009
Scripting Language Characteristics
• Two kinds of game scripting languages:
data definition languages
runtime languages
• Runtime scripting languages typically:
interpreted by virtual machine (VM)
simple and small—low overhead
accessible to designers and other “non-programmers”
powerful—one line of code = big impact
Game Developers Conference 2009 7
Monday, April 6, 2009
Choice of Language
• At Naughty Dog, we make heavy use of both data definition
and runtime script
Both based on PLT Scheme (a Lisp variant)
• Key benefits of Lisp-like languages:
Easy to parse
Data def and runtime code can be freely intermixed
Powerful macro system—easy to define custom syntax
Naughty Dog has a rich Lisp heritage—comfortable
Game Developers Conference 2009 8
Monday, April 6, 2009
Choice of Language
• Of course you don’t have to use Lisp!
• Data definition languages:
custom text format,
Excel comma-separated values (.csv),
XML, ...
• Runtime languages:
Python, Lua, Pawn (Small C), OCaml, F#, ...
• Many popular engines already provide a scripting language:
Quake C, UnrealScript, C# (XNA), ...
Game Developers Conference 2009 9
Monday, April 6, 2009
Extending the Game Object Model
• Every game engine has some kind of game object model
Defines all object types in game world
Often (but not always) written in an object-oriented language
• Scripting language often used to extend the native object model
• Many ways to accomplish this...
Game Developers Conference 2009 10
Monday, April 6, 2009
Game Object Model References
• Rob Fermier, “Creating a Data Driven Engine,” GDC, 2002
• Scott Bilas, “A Data-Driven Game Object System,” GDC, 2002
(http://www.drizzle.com/~scottb/gdc/game-objects.ppt)
• Alex Duran, “Building Object Systems: Features, Tradeoffs and
Pitfalls,” GDC, 2003
• Doug Church, “Object Systems,” presented at a game development
conference in Seoul, Korea, 2003
(http://chrishecker.com/images/6/6f/ObjSys.ppt)
• Jason Gregory, “Game Engine Architecture,” AK Peters, 2009
(http://gameenginebook.com)
Game Developers Conference 2009 11
Monday, April 6, 2009
Unreal’s Approach
• UnrealScript tightly integrated with C++ object model
Single-root class hierarchy with some add-on components
Classes defined in UnrealScript (.uc)
C++ header file (.h) automatically generated
Implementation in C++ or entirely in UnrealScript
Pawn.h Actor
generate
Pawn.uc
Pawn.cpp
Info Pawn Pickup ...
implement
implement
Scout Vehicle ...
Game Developers Conference 2009 12
Monday, April 6, 2009
Property-Centric / Componentized Designs
• Property-centric design used on Thief, Dungeon Siege, Age of
Mythology, Deus Ex 2 and others
Game object just a unique id (UID)
“Decorated” with various properties
(health, armor, weaponry, etc.)
Property encapsulates data + behavior
Armor: Light
Health: 200
Object Weapon: BFG
(UID)
AI: PlayerAlly
Weapon: Pistol
Game Developers Conference 2009 13
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components
Process
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Character SimpleEnOty ...
...
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
Objects
host of add-on components that update
over Dme
Process
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Character SimpleEnOty ...
...
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components Objects
with transform
and mesh
Process
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Character SimpleEnOty ...
...
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components Base class for
all characters
Process
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Character SimpleEnOty ...
...
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components Simple
animaDng
Process
object
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Character SimpleEnOty ...
...
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components
Process
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Character SimpleEnOty ...
Manages a State
Script instance ...
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components
Process
SsTrackGroupProcess SsProcess ProcessGameObject DynLight CameraControl ...
Manages a Character SimpleEnOty ...
chunk of
running script
...
code
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components
Process
SsProcess
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components
Process
SsProcess
SsInstance
Game Developers Conference 2009 14
Monday, April 6, 2009
Uncharted Engine’s Object Model
• Uncharted class hierarchy:
relatively shallow, single-root
host of add-on components
Process
ProcessGameObject
SsInstance DrawControl AnimControl ...
Game Developers Conference 2009 14
Monday, April 6, 2009
Charter
• World editor for
Uncharted is called
Charter
Place game objects
Edit object
properties
Control level
streaming
Game Developers Conference 2009 15
Monday, April 6, 2009
Uncharted State Scripts
• State scripts similar in many respects to property-centric model...
adds finite state machine (FSM) support
not specifically tied to “properties”
coarser-grained (one script per object)
• More like scripted extension to existing entity type...
... or a “director” that orchestrates actions of other entities
Game Developers Conference 2009 16
Monday, April 6, 2009
Anatomy of a State Script
• A state script is comprised of:
attributes
states
• States define object’s behavior via runtime script code:
response to events
natural behavior over time (update event)
transitional actions between states (begin/end events)
Game Developers Conference 2009 17
Monday, April 6, 2009
Anatomy of a State Script
State Script 1
Variables
State A State Script 2
On Update Variables
On Event1
State C
State B On Begin
On Begin On Event4
Game Developers Conference 2009 18
Monday, April 6, 2009
Anatomy of a State Script
State Script 1
Variables Event1
State A State Script 2
On Update Variables
On Event1
State C
State B On Begin
On Begin On Event4
Game Developers Conference 2009 18
Monday, April 6, 2009
Anatomy of a State Script
State Script 1
Variables Event1
State A State Script 2
On Update Variables
On Event1
State C
go to
On Begin
State B State B
On Begin On Event4
Game Developers Conference 2009 18
Monday, April 6, 2009
Anatomy of a State Script
State Script 1
Variables Event1
State A State Script 2
On Update Variables
On Event1
State C
go to
On Begin
State B State B
On Begin Event4 On Event4
Game Developers Conference 2009 18
Monday, April 6, 2009
Instantiating a State Script
• Attached to a native (C++) game object: Game
Object
designers extend or modify native
C++ object type State Script 1
define entirely new object types
Game Developers Conference 2009 19
Monday, April 6, 2009
Instantiating a State Script
• Attached to a native (C++) game object: Game
Object
designers extend or modify native
C++ object type State Script 1
define entirely new object types
• Attached to a trigger region:
convex volume Trigger Region
detects enter, exit and occupancy
State Script 2
Game Developers Conference 2009 19
Monday, April 6, 2009
Instantiating State Scripts
SsProcess • Placed as stand-alone object:
State Script 3
“director” orchestrates actions of
(stand‐alone) other objects (e.g. IGC)
Game Developers Conference 2009 20
Monday, April 6, 2009
Instantiating State Scripts
SsProcess • Placed as stand-alone object:
State Script 3
“director” orchestrates actions of
(stand‐alone) other objects (e.g. IGC)
• Associated with a task:
Task A
task = check point
Task B1 Task B2 script manages associated task
orchestrates AI encounters
Task C
State Script 4 controls player objectives
Task D
Game Developers Conference 2009 20
Monday, April 6, 2009
Instantiating State Scripts
SsProcess • Placed as stand-alone object:
State Script 3
“director” orchestrates actions of
(stand‐alone) other objects (e.g. IGC)
• Associated with a task:
Task A
task = check point
Task B1 Task B2 script manages associated task
orchestrates AI encounters
Task C
State Script 4 controls player objectives
Task D • Spawned by another state script
Game Developers Conference 2009 20
Monday, April 6, 2009
State Script Syntax
• State script defined as follows:
Don’t let Lisp syntax throw you!
Lisp syntax is all (parentheses)
(define-state-script ("kickable-gate")
Think C/C++ { } blocks (state ("locked")
• Parenthesized blocks highly )
...
context-sensitive in Lisp/Scheme (state ("opening")
...
)
(state ("open")
...
)
)
Game Developers Conference 2009 23
Monday, April 6, 2009
State Script Syntax
• State script defined as follows:
Don’t let Lisp syntax throw you!
Lisp syntax is all (parentheses)
(define-state-script ("kickable-gate")
Think C/C++ { } blocks (state ("locked")
• Parenthesized blocks highly )
...
context-sensitive in Lisp/Scheme (state ("opening")
...
)
(state ("open")
...
)
)
Game Developers Conference 2009 23
Monday, April 6, 2009
State Script Syntax
• State script defined as follows:
Don’t let Lisp syntax throw you!
Lisp syntax is all (parentheses)
(define-state-script ("kickable-gate")
Think C/C++ { } blocks (state ("locked")
• Parenthesized blocks highly )
...
context-sensitive in Lisp/Scheme (state ("opening")
...
)
(state ("open")
...
)
)
Game Developers Conference 2009 23
Monday, April 6, 2009
State Script Syntax
• State script defined as follows:
Don’t let Lisp syntax throw you!
Lisp syntax is all (parentheses)
(define-state-script ("kickable-gate")
Think C/C++ { } blocks (state ("locked")
• Parenthesized blocks highly )
...
context-sensitive in Lisp/Scheme (state ("opening")
...
)
(state ("open")
...
)
)
Game Developers Conference 2009 23
Monday, April 6, 2009
Event Handler Blocks
(define-state-script ("kickable-gate")
(state ("locked")
(on (event "kick")
... ;; handle "kick" event
• Each state contains zero or more )
(on (begin)
event handler blocks ... ;; do when state entered
)
(on (update)
... ;; do every frame
)
(on (end)
... ;; do when state exited
)
)
Game Developers Conference 2009 24
Monday, April 6, 2009
Event Handler Blocks
(define-state-script ("kickable-gate")
(state ("locked")
(on (event "kick")
... ;; handle "kick" event
• Each state contains zero or more )
(on (begin)
event handler blocks ... ;; do when state entered
)
(on (update)
... ;; do every frame
)
(on (end)
... ;; do when state exited
)
)
Game Developers Conference 2009 24
Monday, April 6, 2009
Event Handler Blocks
(define-state-script ("kickable-gate")
(state ("locked")
(on (event "kick")
... ;; handle "kick" event
• Each state contains zero or more )
(on (begin)
event handler blocks ... ;; do when state entered
)
(on (update)
... ;; do every frame
)
(on (end)
... ;; do when state exited
)
)
Game Developers Conference 2009 24
Monday, April 6, 2009
Event Handler Blocks
(define-state-script ("kickable-gate")
(state ("locked")
(on (event "kick")
... ;; handle "kick" event
• Each state contains zero or more )
(on (begin)
event handler blocks ... ;; do when state entered
)
(on (update)
... ;; do every frame
)
(on (end)
... ;; do when state exited
)
)
Game Developers Conference 2009 24
Monday, April 6, 2009
Event Handler Blocks
(define-state-script ("kickable-gate")
(state ("locked")
(on (event "kick")
... ;; handle "kick" event
• Each state contains zero or more )
(on (begin)
event handler blocks ... ;; do when state entered
)
(on (update)
... ;; do every frame
)
(on (end)
... ;; do when state exited
)
)
Game Developers Conference 2009 24
Monday, April 6, 2009
Runtime Script Code
• Runtime script code inside (on ...) (state ("locked")
(on (begin)
blocks [print-string "Starting idle!"]
[animate "self" "locked-idle"]
• Simplified Scheme/Lisp )
(on (event "kicked")
Most “commands” are native calls [when [lock-broken?]
into C++ code [print-string "BAM!"]
]
Conditional expressions [if [task-complete? "wave2"]
[print-string "Complete!"]
Simple looping via label/goto [print-string "NOT!!!"]
]
)
)
Game Developers Conference 2009 25
Monday, April 6, 2009
Runtime Script Code
• Runtime script code inside (on ...) (state ("locked")
(on (begin)
blocks [print-string "Starting idle!"]
[animate "self" "locked-idle"]
• Simplified Scheme/Lisp )
(on (event "kicked")
Most “commands” are native calls [when [lock-broken?]
into C++ code [print-string "BAM!"]
]
Conditional expressions [if [task-complete? "wave2"]
[print-string "Complete!"]
Simple looping via label/goto [print-string "NOT!!!"]
]
)
)
Game Developers Conference 2009 25
Monday, April 6, 2009
Runtime Script Code
• Runtime script code inside (on ...) (state ("locked")
(on (begin)
blocks [print-string "Starting idle!"]
[animate "self" "locked-idle"]
• Simplified Scheme/Lisp )
(on (event "kicked")
Most “commands” are native calls [when [lock-broken?]
into C++ code [print-string "BAM!"]
]
Conditional expressions [if [task-complete? "wave2"]
[print-string "Complete!"]
Simple looping via label/goto [print-string "NOT!!!"]
]
)
)
Game Developers Conference 2009 25
Monday, April 6, 2009
Runtime Script Code
• Runtime script code inside (on ...) (state ("locked")
(on (begin)
blocks [print-string "Starting idle!"]
[animate "self" "locked-idle"]
• Simplified Scheme/Lisp )
(on (event "kicked")
Most “commands” are native calls [when [lock-broken?]
into C++ code [print-string "BAM!"]
]
Conditional expressions [if [task-complete? "wave2"]
[print-string "Complete!"]
Simple looping via label/goto [print-string "NOT!!!"]
]
)
)
Game Developers Conference 2009 25
Monday, April 6, 2009
User-Defined Functions
(defun verbose-anim ((anim string))
[print-string "Starting " anim]
[animate "self" anim]
)
• Script functions can be defined
and called by script programmer (define-state-script ("kickable-gate")
(state ("locked")
(on (begin)
[verbose-anim "locked-idle"]
)
)
...
)
Game Developers Conference 2009 26
Monday, April 6, 2009
User-Defined Functions
(defun verbose-anim ((anim string))
[print-string "Starting " anim]
[animate "self" anim]
)
• Script functions can be defined
and called by script programmer (define-state-script ("kickable-gate")
(state ("locked")
(on (begin)
[verbose-anim "locked-idle"]
)
)
...
)
Game Developers Conference 2009 26
Monday, April 6, 2009
User-Defined Functions
(defun verbose-anim ((anim string))
[print-string "Starting " anim]
[animate "self" anim]
)
• Script functions can be defined
and called by script programmer (define-state-script ("kickable-gate")
(state ("locked")
(on (begin)
[verbose-anim "locked-idle"]
)
)
...
)
Game Developers Conference 2009 26
Monday, April 6, 2009
User-Defined Functions
(defun verbose-anim ((anim string))
[print-string "Starting " anim]
[animate "self" anim]
)
• Script functions can be defined
and called by script programmer (define-state-script ("kickable-gate")
(state ("locked")
(on (begin)
[verbose-anim "locked-idle"]
)
)
...
)
Game Developers Conference 2009 26
Monday, April 6, 2009
User-Defined Functions
(defun verbose-anim ((anim string))
[print-string "Starting " anim]
[animate "self" anim]
)
• Script functions can be defined
and called by script programmer (define-state-script ("kickable-gate")
(state ("locked")
(on (begin)
[verbose-anim "locked-idle"]
)
)
...
)
Game Developers Conference 2009 26
Monday, April 6, 2009
The “Self” Argument
• Any command operating on a game object takes its unique id
(UID) as its first argument
• Magic UID "self" refers to the object to which script is attached
gate‐17
Game
Object
State Script 1
Game Developers Conference 2009 27
Monday, April 6, 2009
The “Self” Argument
• Any command operating on a game object takes its unique id
(UID) as its first argument
• Magic UID "self" refers to the object to which script is attached
(on (begin)
gate‐17
[animate "self" "locked-idle"]
Game )
Object
State Script 1
self
Game Developers Conference 2009 27
Monday, April 6, 2009
The “Self” Argument
• Any command operating on a game object takes its unique id
(UID) as its first argument
• Magic UID "self" refers to the object to which script is attached
gate‐17 (on (begin)
Game [animate "gate-17" "locked-idle"]
Object )
State Script 1
Game Developers Conference 2009 27
Monday, April 6, 2009
The “Self” Argument
• Any command operating on a game object takes its unique id
(UID) as its first argument
• Magic UID "self" refers to the object to which script is attached
gate‐17
(on (begin)
Game [animate "lock-6" "fall-off"]
Object )
State Script 1 lock‐6
Game
Object
Game Developers Conference 2009 27
Monday, April 6, 2009
Changing States
(define-state-script ("kickable-gate")
(state ("locked")
• Transitions to other states via ...
(go "state-name") command (on (event "kicked")
[when [lock-broken?]
• State transitions cause current ]
[go "opening"]
state’s (on ...) blocks to be )
)
aborted (state ("opening")
(on (begin)
• Use (on (exit) ...) block for ...
clean-up )
...
)
)
Game Developers Conference 2009 28
Monday, April 6, 2009
Changing States
(define-state-script ("kickable-gate")
(state ("locked")
• Transitions to other states via ...
(go "state-name") command (on (event "kicked")
[when [lock-broken?]
• State transitions cause current ]
[go "opening"]
state’s (on ...) blocks to be )
)
aborted (state ("opening")
(on (begin)
• Use (on (exit) ...) block for ...
clean-up )
...
)
)
Game Developers Conference 2009 28
Monday, April 6, 2009
Changing States
(define-state-script ("kickable-gate")
(state ("locked")
• Transitions to other states via ...
(go "state-name") command (on (event "kicked")
[when [lock-broken?]
• State transitions cause current ]
[go "opening"]
state’s (on ...) blocks to be )
)
aborted (state ("opening")
(on (begin)
• Use (on (exit) ...) block for ...
clean-up )
...
)
)
Game Developers Conference 2009 28
Monday, April 6, 2009
Tracks
• (on ...) blocks contain one or more tracks
• A track is a bit like a thread or fiber
• Tracks can be put to sleep
Wait for duration
• e.g., wait 5 seconds,
• wait until frame 23, ...
Wait for an action to be done
• duration-agnostic
• Tracks can be synchronized via signals
Game Developers Conference 2009 29
Monday, April 6, 2009
Tracks
(state ("shake-hands") State "shake‐hands"
(on (begin) On Begin
(track ("player"))
[wait-move-to "player" "waypoint7"] Track Track
P S
[signal "player-at-waypoint"]
[wait-for-signal "sully-at-waypoint"]
[wait-animate "player" "shake-sullys-hand"] s‐a‐w
)
(track ("sullivan"))
[wait-move-to "sullivan" "waypoint7"]
[signal "sully-at-waypoint"] p‐a‐w
[wait-for-signal "player-at-waypoint"]
[wait-animate "sullivan" "shake-drakes-hand"]
)
)
)
Game Developers Conference 2009 30
Monday, April 6, 2009
Tracks
(state ("shake-hands") State "shake‐hands"
(on (begin) On Begin
(track ("player"))
[wait-move-to "player" "waypoint7"] Track Track
P S
[signal "player-at-waypoint"]
[wait-for-signal "sully-at-waypoint"]
[wait-animate "player" "shake-sullys-hand"] s‐a‐w
)
(track ("sullivan"))
[wait-move-to "sullivan" "waypoint7"]
[signal "sully-at-waypoint"] p‐a‐w
[wait-for-signal "player-at-waypoint"]
[wait-animate "sullivan" "shake-drakes-hand"]
)
)
)
Game Developers Conference 2009 30
Monday, April 6, 2009
Tracks
(state ("shake-hands") State "shake‐hands"
(on (begin) On Begin
(track ("player"))
[wait-move-to "player" "waypoint7"] Track Track
P S
[signal "player-at-waypoint"]
[wait-for-signal "sully-at-waypoint"]
[wait-animate "player" "shake-sullys-hand"] s‐a‐w
)
(track ("sullivan"))
[wait-move-to "sullivan" "waypoint7"]
[signal "sully-at-waypoint"] p‐a‐w
[wait-for-signal "player-at-waypoint"]
[wait-animate "sullivan" "shake-drakes-hand"]
)
)
)
Game Developers Conference 2009 30
Monday, April 6, 2009
Tracks
(state ("shake-hands") State "shake‐hands"
(on (begin) On Begin
(track ("player"))
[wait-move-to "player" "waypoint7"] Track Track
P S
[signal "player-at-waypoint"]
[wait-for-signal "sully-at-waypoint"]
[wait-animate "player" "shake-sullys-hand"] s‐a‐w
)
(track ("sullivan"))
[wait-move-to "sullivan" "waypoint7"]
[signal "sully-at-waypoint"] p‐a‐w
[wait-for-signal "player-at-waypoint"]
[wait-animate "sullivan" "shake-drakes-hand"]
)
)
)
Game Developers Conference 2009 30
Monday, April 6, 2009
Tracks
(state ("shake-hands") State "shake‐hands"
(on (begin) On Begin
(track ("player"))
[wait-move-to "player" "waypoint7"] Track Track
P S
[signal "player-at-waypoint"]
[wait-for-signal "sully-at-waypoint"]
[wait-animate "player" "shake-sullys-hand"] p‐a‐w
)
(track ("sullivan"))
[wait-move-to "sullivan" "waypoint7"]
[signal "sully-at-waypoint"] s‐a‐w
[wait-for-signal "player-at-waypoint"]
[wait-animate "sullivan" "shake-drakes-hand"]
)
)
)
Game Developers Conference 2009 30
Monday, April 6, 2009
Track Execution Over Time
• Rules for execution of code within a track:
Greedily consume instructions sequentially...
... until a [wait* ...] command encountered...
... then relinquish control until the action is complete
• NOTE: A [wait* ...] command doesn’t have to wait; for example:
[wait-seconds 0]
[wait-npc-move-to "pos-4"] when she’s already there
Game Developers Conference 2009 31
Monday, April 6, 2009
Options and Variable Declarations
• Options declared at top of
(define-state-script ("kickable-gate") script:
:initial-state "closed"
:declarations (decl-list
initial state
(var "num-attempts" :type int32)
(var "is-locked" :type boolean :default #t)
variable declarations
) debugging options
(state ("kicked")
...
)
...
)
Game Developers Conference 2009 32
Monday, April 6, 2009
Options and Variable Declarations
• Options declared at top of
(define-state-script ("kickable-gate") script:
:initial-state "closed"
:declarations (decl-list
initial state
(var "num-attempts" :type int32)
(var "is-locked" :type boolean :default #t)
variable declarations
) debugging options
(state ("kicked")
...
)
...
)
Game Developers Conference 2009 32
Monday, April 6, 2009
Options and Variable Declarations
• Options declared at top of
(define-state-script ("kickable-gate") script:
:initial-state "closed"
:declarations (decl-list
initial state
(var "num-attempts" :type int32)
(var "is-locked" :type boolean :default #t)
variable declarations
) debugging options
(state ("kicked")
...
)
...
)
Game Developers Conference 2009 32
Monday, April 6, 2009
Configuration Parameters
• All game objects have
properties (key-value pairs)
Property values edited in
Charter
Game Developers Conference 2009 34
Monday, April 6, 2009
Configuration Parameters
• All game objects have
properties (key-value pairs)
Property values edited in
Charter
Game Developers Conference 2009 34
Monday, April 6, 2009
Configuration Parameters
• Designers can create their
own free-form properties,
called tags meaning-of-life = 42
Simply type “key = value”
in Tags field
Game Developers Conference 2009 34
Monday, April 6, 2009
Configuration Parameters
• State scripts have read-only access to game object properties...
... and free-form tags
Game Developers Conference 2009 35
Monday, April 6, 2009
Configuration Parameters
• State scripts have read-only access to game object properties...
... and free-form tags
(define-state-script ("kickable-gate")
(state ("kicked")
(on (begin)
[wait-animate "self"
[tag-string "kick-anim"]
]
)
...
)
Game Developers Conference 2009 35
Monday, April 6, 2009
Configuration Parameters
• State scripts have read-only access to game object properties...
... and free-form tags
(define-state-script ("kickable-gate")
(state ("kicked")
(on (begin)
[wait-animate "self"
[tag-string "kick-anim"]
]
)
...
)
Game Developers Conference 2009 35
Monday, April 6, 2009
Configuration Parameters
• State scripts have read-only access to game object properties...
... and free-form tags
(define-state-script ("kickable-gate")
(state ("kicked")
(on (begin)
[wait-animate "self"
[tag-string "kick-anim"]
]
)
...
)
Game Developers Conference 2009 35
Monday, April 6, 2009
Data Definition and Runtime
(define-state-script ("kickable-gate")
• Offline data-definition language (state ("locked")
(on (begin)
(Scheme) is intermingled with [print-string "Starting idle!"]
[animate "self" "locked-idle"]
runtime code )
(on (event "kicked")
[when [lock-broken?]
[print-string "BAM!"]
]
[if [task-complete? "wave2"]
[print-string "Complete!"]
[print-string "NOT!!!"]
]
)
)
...
)
Game Developers Conference 2009 36
Monday, April 6, 2009
Data Definition and Runtime
(define-state-script ("kickable-gate")
• Offline data-definition language (state ("locked")
(on (begin)
(Scheme) is intermingled with [print-string "Starting idle!"]
[animate "self" "locked-idle"]
runtime code )
(on (event "kicked")
[when [lock-broken?]
[print-string "BAM!"]
]
[if [task-complete? "wave2"]
[print-string "Complete!"]
[print-string "NOT!!!"]
]
)
)
...
)
Game Developers Conference 2009 36
Monday, April 6, 2009
Data Definition and Runtime
class Vector3
{
private:
float x, y, z;
• Really no different than the public:
float Dot(const Vector3& b)
distinction between declarations {
return (x * b.x
and definitions in C++ + y * b.y
+ z * b.z);
}
...
};
Game Developers Conference 2009 36
Monday, April 6, 2009
Data Definition and Runtime
class Vector3
{
private:
float x, y, z;
• Really no different than the public:
float Dot(const Vector3& b)
distinction between declarations {
return (x * b.x
and definitions in C++ + y * b.y
+ z * b.z);
}
...
};
Game Developers Conference 2009 36
Monday, April 6, 2009