State-Based Scripting in Uncharted 2: Among Thieves
1. State-Based Scripting in
Jason Gregory
Generalist Programmer
Naughty Dog, Inc.
Monday, April 6, 2009
2. 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
4. 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
5. 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
6. 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
7. 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
8. 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
9. 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
10. 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
11. 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
12. 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
13. 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
14. 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
15. 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
16. 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
17. 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
18. 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
19. 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
20. 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
21. 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
22. 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
23. 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
24. 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
25. 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
26. 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
27. 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
28. 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
29. 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
30. 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
31. 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
32. 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
33. 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
34. 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
35. 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
36. 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
39. 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
40. 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
41. 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
42. 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
43. 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
44. 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
45. 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
46. 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
47. 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
48. 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
49. 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
50. 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
51. 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
52. 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
53. 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
54. 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
55. 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
56. 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
57. 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
58. 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
59. 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
60. 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
61. 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
62. 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
63. 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
64. 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
65. 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
66. 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
67. 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
68. 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
69. 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
70. 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
71. 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
72. 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
73. 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
79. Configuration Parameters
• All game objects have
properties (key-value pairs)
Property values edited in
Charter
Game Developers Conference 2009 34
Monday, April 6, 2009
80. Configuration Parameters
• All game objects have
properties (key-value pairs)
Property values edited in
Charter
Game Developers Conference 2009 34
Monday, April 6, 2009
81. 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
82. 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
83. 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
84. 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
85. 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
86. 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
87. 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
88. 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
89. 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