SlideShare a Scribd company logo
1 of 162
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
Introduction to State Scripts




                                                        3
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




                                              21
Monday, April 6, 2009
Game
Developers
Conference
2009   22
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
(define-state-script ("kickable-gate")
                                             :initial-state "closed"
            Manipulating Variables           :declarations (decl-list
                                                 (var "num-attempts" :type int32)
       • Simple commands for reading             (var "is-locked" :type boolean :default #t)
                                             )
         and writing variables               (state ("kicked")
                                                 (on (begin)
       • Lisp/Scheme uses prefix notation           [when [get-boolean "is-locked"]
                                                      [set-int32 "num-attempts"
         (a.k.a. Polish notation)                        [+ 1 [get-int32 "num-attempts"]]
                                                      ]
           [+ a b] calculates (a + b)                [wait-animate "self" "kick-failure"]
                                                      [go "closed"]
           [set "x" [+ 1 [get "x"]]]              ]
            increments variable “x”                ;; else...
                                                   [wait-animate "self" "kick-success"]
                                                   [go "open"]
                                                 )
                                             )
                                             ...

       Game
Developers
Conference
2009                                                     33
Monday, April 6, 2009
(define-state-script ("kickable-gate")
                                             :initial-state "closed"
            Manipulating Variables           :declarations (decl-list
                                                 (var "num-attempts" :type int32)
       • Simple commands for reading             (var "is-locked" :type boolean :default #t)
                                             )
         and writing variables               (state ("kicked")
                                                 (on (begin)
       • Lisp/Scheme uses prefix notation           [when [get-boolean "is-locked"]
                                                      [set-int32 "num-attempts"
         (a.k.a. Polish notation)                        [+ 1 [get-int32 "num-attempts"]]
                                                      ]
           [+ a b] calculates (a + b)                [wait-animate "self" "kick-failure"]
                                                      [go "closed"]
           [set "x" [+ 1 [get "x"]]]              ]
            increments variable “x”                ;; else...
                                                   [wait-animate "self" "kick-success"]
                                                   [go "open"]
                                                 )
                                             )
                                             ...

       Game
Developers
Conference
2009                                                     33
Monday, April 6, 2009
(define-state-script ("kickable-gate")
                                             :initial-state "closed"
            Manipulating Variables           :declarations (decl-list
                                                 (var "num-attempts" :type int32)
       • Simple commands for reading             (var "is-locked" :type boolean :default #t)
                                             )
         and writing variables               (state ("kicked")
                                                 (on (begin)
       • Lisp/Scheme uses prefix notation           [when [get-boolean "is-locked"]
                                                      [set-int32 "num-attempts"
         (a.k.a. Polish notation)                        [+ 1 [get-int32 "num-attempts"]]
                                                      ]
           [+ a b] calculates (a + b)                [wait-animate "self" "kick-failure"]
                                                      [go "closed"]
           [set "x" [+ 1 [get "x"]]]              ]
            increments variable “x”                ;; else...
                                                   [wait-animate "self" "kick-success"]
                                                   [go "open"]
                                                 )
                                             )
                                             ...

       Game
Developers
Conference
2009                                                     33
Monday, April 6, 2009
(define-state-script ("kickable-gate")
                                             :initial-state "closed"
            Manipulating Variables           :declarations (decl-list
                                                 (var "num-attempts" :type int32)
       • Simple commands for reading             (var "is-locked" :type boolean :default #t)
                                             )
         and writing variables               (state ("kicked")
                                                 (on (begin)
       • Lisp/Scheme uses prefix notation           [when [get-boolean "is-locked"]
                                                      [set-int32 "num-attempts"
         (a.k.a. Polish notation)                        [+ 1 [get-int32 "num-attempts"]]
                                                          ˘
                                                      ]
           [+ a b] calculates (a + b)                [wait-animate "self" "kick-failure"]
                                                      [go "closed"]
           [set "x" [+ 1 [get "x"]]]              ]
            increments variable “x”                ;; else...
                                                   [wait-animate "self" "kick-success"]
                                                   [go "open"]
                                                 )
                                             )
                                             ...

       Game
Developers
Conference
2009                                                     33
Monday, April 6, 2009
(define-state-script ("kickable-gate")
                                             :initial-state "closed"
            Manipulating Variables           :declarations (decl-list
                                                 (var "num-attempts" :type int32)
       • Simple commands for reading             (var "is-locked" :type boolean :default #t)
                                             )
         and writing variables               (state ("kicked")
                                                 (on (begin)
       • Lisp/Scheme uses prefix notation           [when [get-boolean "is-locked"]
                                                      [set-int32 "num-attempts"
         (a.k.a. Polish notation)                        [+ 1 [get-int32 "num-attempts"]]
                                                      ]
           [+ a b] calculates (a + b)                [wait-animate "self" "kick-failure"]
                                                      [go "closed"]
           [set "x" [+ 1 [get "x"]]]              ]
            increments variable “x”                ;; else...
                                                   [wait-animate "self" "kick-success"]
                                                   [go "open"]
                                                 )
                                             )
                                             ...

       Game
Developers
Conference
2009                                                     33
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
Case Studies




                                       37
Monday, April 6, 2009
Custom Object Type: Breakable Sign




       Game
Developers
Conference
2009           38
Monday, April 6, 2009
Custom Object Type: Breakable Sign




       Game
Developers
Conference
2009           38
Monday, April 6, 2009
Custom Object Type: Breakable Sign


           (define-state-script ("falling-sign")
             (state ("untouched")
                 (on (update)
                   [when [task-complete? "wz-post-combat"]
                     [go "fallen"]
                   ]
                 )
                (on (event "hanging-from")
                   [go "breaking"]
                 )
             )
             ...




       Game
Developers
Conference
2009                       39
Monday, April 6, 2009
Custom Object Type: Breakable Sign


           (define-state-script ("falling-sign")
             (state ("untouched")
                 (on (update)
                   [when [task-complete? "wz-post-combat"]
                     [go "fallen"]
                   ]
                 )
                (on (event "hanging-from")
                   [go "breaking"]
                 )
             )
             ...




       Game
Developers
Conference
2009                       39
Monday, April 6, 2009
Custom Object Type: Breakable Sign


           (define-state-script ("falling-sign")
             (state ("untouched")
                 (on (update)
                   [when [task-complete? "wz-post-combat"]
                     [go "fallen"]
                   ]
                 )
                (on (event "hanging-from")
                   [go "breaking"]
                 )
             )
             ...




       Game
Developers
Conference
2009                       39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                             (state ("breaking")
                                                (on (begin)
                                                  [spawn-particles-at-joint "self"
                                                    "hinge"
                                                    "sign-break-dust"]
                                                  [wait-animate "self" "sign-break"]
                                                  [go "fallen"]
                                               )
                                             )
                                             (state ("fallen")
                                                (on (begin)
                                                  [animate "self" "sign-broken"] ;; looping
                                                )
                                             )
                                         )


       Game
Developers
Conference
2009                                                        39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                                                 (state ("breaking")
                                                                    (on (begin)
           (define-state-script ("falling-sign")
                                                                      [spawn-particles-at-joint "self"
             (state ("untouched")
                                                                        "hinge"
                 (on (update)
                                                                        "sign-break-dust"]
                   [when [task-complete? "wz-post-combat"]
                                                                      [wait-animate "self" "sign-break"]
                     [go "fallen"]
                                                                      [go "fallen"]
                   ]
                                                                   )
                 )
                                                                 )
                (on (event "hanging-from")
                                                                 (state ("fallen")
                   [go "breaking"]
                                                                    (on (begin)
                 )
                                                                      [animate "self" "sign-broken"] ;; looping
             )
                                                                    )
             ...
                                                                 )
                                                             )


       Game
Developers
Conference
2009                                                                            39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                                                 (state ("breaking")
                                                                    (on (begin)
           (define-state-script ("falling-sign")
                                                                      [spawn-particles-at-joint "self"
             (state ("untouched")
                                                                        "hinge"
                 (on (update)
                                                                        "sign-break-dust"]
                   [when [task-complete? "wz-post-combat"]
                                                                      [wait-animate "self" "sign-break"]
                     [go "fallen"]
                                                                      [go "fallen"]
                   ]
                                                                   )
                 )
                                                                 )
                (on (event "hanging-from")
                                                                 (state ("fallen")
                   [go "breaking"]
                                                                    (on (begin)
                 )
                                                                      [animate "self" "sign-broken"] ;; looping
             )
                                                                    )
             ...
                                                                 )
                                                             )


       Game
Developers
Conference
2009                                                                            39
Monday, April 6, 2009
Custom Object Type: Breakable Sign

                                                                 (state ("breaking")
                                                                    (on (begin)
           (define-state-script ("falling-sign")
                                                                      [spawn-particles-at-joint "self"
             (state ("untouched")
                                                                        "hinge"
                 (on (update)
                                                                        "sign-break-dust"]
                   [when [task-complete? "wz-post-combat"]
                                                                      [wait-animate "self" "sign-break"]
                     [go "fallen"]
                                                                      [go "fallen"]
                   ]
                                                                   )
                 )
                                                                 )
                (on (event "hanging-from")
                                                                 (state ("fallen")
                   [go "breaking"]
                                                                    (on (begin)
                 )
                                                                      [animate "self" "sign-broken"] ;; looping
             )
                                                                    )
             ...
                                                                 )
                                                             )


       Game
Developers
Conference
2009                                                                            39
Monday, April 6, 2009
Making the Sign Script Generic
                                                                (state ("animating")
                                                                   (on (begin)
                                                                     [spawn-particles-at-joint "self"
          (define-state-script ("simple-animating-obj")
                                                                       [tag-string "particle-joint"]
            (state ("initial")
                                                                       [tag-string "particle-name"]]
                (on (update)
                                                                     [wait-animate "self"
                  [when [task-complete?
                                                                       [tag-string "anim-name"]]
                                [tag-string "done-task"]]
                                                                     [go "done"]
                    [go "done"]
                                                                  )
                  ]
                                                                )
                )
                                                                (state ("done")
               (on (event "hanging-from")
                                                                   (on (begin)
                  [go "animating"]
                                                                     [animate "self"
                )
                                                                       [tag-string "done-anim-name"]]
            )
                                                                   )
            ...
                                                                )
                                                            )

       Game
Developers
Conference
2009                                                                  40
Monday, April 6, 2009
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves
State-Based Scripting in Uncharted 2: Among Thieves

More Related Content

What's hot

The Technology of Uncharted: Drake’s Fortune
The Technology of Uncharted: Drake’s FortuneThe Technology of Uncharted: Drake’s Fortune
The Technology of Uncharted: Drake’s FortuneNaughty Dog
 
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...Colin Barré-Brisebois
 
Parallel Futures of a Game Engine (v2.0)
Parallel Futures of a Game Engine (v2.0)Parallel Futures of a Game Engine (v2.0)
Parallel Futures of a Game Engine (v2.0)Johan Andersson
 
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019UnityTechnologiesJapan002
 
Unity Internals: Memory and Performance
Unity Internals: Memory and PerformanceUnity Internals: Memory and Performance
Unity Internals: Memory and PerformanceDevGAMM Conference
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnGuerrilla
 
Scene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game EnginesScene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game EnginesBryan Duggan
 
The Next Generation of PhyreEngine
The Next Generation of PhyreEngineThe Next Generation of PhyreEngine
The Next Generation of PhyreEngineSlide_N
 
Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Gerke Max Preussner
 
A Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemA Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemBo Li
 
The Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsThe Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsJohan Andersson
 
Unreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile Games
Unreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile GamesUnreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile Games
Unreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile GamesEpic Games China
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介UnityTechnologiesJapan002
 
Killzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of GamesKillzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of GamesGuerrilla
 
Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*Intel® Software
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰Jubok Kim
 
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero DawnPutting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero DawnGuerrilla
 
Uncharted Animation Workflow
Uncharted Animation WorkflowUncharted Animation Workflow
Uncharted Animation WorkflowNaughty Dog
 

What's hot (20)

The Technology of Uncharted: Drake’s Fortune
The Technology of Uncharted: Drake’s FortuneThe Technology of Uncharted: Drake’s Fortune
The Technology of Uncharted: Drake’s Fortune
 
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
More Performance! Five Rendering Ideas From Battlefield 3 and Need For Speed:...
 
Parallel Futures of a Game Engine (v2.0)
Parallel Futures of a Game Engine (v2.0)Parallel Futures of a Game Engine (v2.0)
Parallel Futures of a Game Engine (v2.0)
 
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
【Unite Tokyo 2019】Unityプログレッシブライトマッパー2019
 
Unity Internals: Memory and Performance
Unity Internals: Memory and PerformanceUnity Internals: Memory and Performance
Unity Internals: Memory and Performance
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
 
Scene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game EnginesScene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game Engines
 
The Next Generation of PhyreEngine
The Next Generation of PhyreEngineThe Next Generation of PhyreEngine
The Next Generation of PhyreEngine
 
Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4
 
A Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemA Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering System
 
The Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next StepsThe Rendering Pipeline - Challenges & Next Steps
The Rendering Pipeline - Challenges & Next Steps
 
Unreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile Games
Unreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile GamesUnreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile Games
Unreal Open Day 2017 UE4 for Mobile: The Future of High Quality Mobile Games
 
Frostbite on Mobile
Frostbite on MobileFrostbite on Mobile
Frostbite on Mobile
 
Localization feature of ue4
Localization feature of ue4Localization feature of ue4
Localization feature of ue4
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
 
Killzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of GamesKillzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of Games
 
Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
 
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero DawnPutting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
 
Uncharted Animation Workflow
Uncharted Animation WorkflowUncharted Animation Workflow
Uncharted Animation Workflow
 

Viewers also liked

GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...
GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...
GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...LevelDesign InADay
 
SPU Optimizations - Part 2
SPU Optimizations - Part 2SPU Optimizations - Part 2
SPU Optimizations - Part 2Naughty Dog
 
Adventures In Data Compilation
Adventures In Data CompilationAdventures In Data Compilation
Adventures In Data CompilationNaughty Dog
 
SPU Optimizations-part 1
SPU Optimizations-part 1SPU Optimizations-part 1
SPU Optimizations-part 1Naughty Dog
 
Lighting Shading by John Hable
Lighting Shading by John HableLighting Shading by John Hable
Lighting Shading by John HableNaughty Dog
 
Practical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT MethodsPractical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT MethodsNaughty Dog
 
Naughty Dog Vertex
Naughty Dog VertexNaughty Dog Vertex
Naughty Dog VertexNaughty Dog
 

Viewers also liked (9)

Pacing in games
Pacing in gamesPacing in games
Pacing in games
 
GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...
GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...
GDC 2011 Level Design in a Day. Summary & Introduction: Coray Seifert, Senior...
 
SPU Optimizations - Part 2
SPU Optimizations - Part 2SPU Optimizations - Part 2
SPU Optimizations - Part 2
 
Adventures In Data Compilation
Adventures In Data CompilationAdventures In Data Compilation
Adventures In Data Compilation
 
SPU Optimizations-part 1
SPU Optimizations-part 1SPU Optimizations-part 1
SPU Optimizations-part 1
 
Lighting Shading by John Hable
Lighting Shading by John HableLighting Shading by John Hable
Lighting Shading by John Hable
 
Autodesk Mudbox
Autodesk MudboxAutodesk Mudbox
Autodesk Mudbox
 
Practical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT MethodsPractical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT Methods
 
Naughty Dog Vertex
Naughty Dog VertexNaughty Dog Vertex
Naughty Dog Vertex
 

Similar to State-Based Scripting in Uncharted 2: Among Thieves

StateScriptingInUncharted2
StateScriptingInUncharted2StateScriptingInUncharted2
StateScriptingInUncharted2gcarlton
 
Ghajini - The Game Development
Ghajini - The Game DevelopmentGhajini - The Game Development
Ghajini - The Game DevelopmentImran K
 
Supersize your production pipe enjmin 2013 v1.1 hd
Supersize your production pipe    enjmin 2013 v1.1 hdSupersize your production pipe    enjmin 2013 v1.1 hd
Supersize your production pipe enjmin 2013 v1.1 hdslantsixgames
 
Mp24: Python in gaming industry
Mp24: Python in gaming industryMp24: Python in gaming industry
Mp24: Python in gaming industryMontreal Python
 
Brewing Your Own Game Engie eng
Brewing Your Own Game Engie engBrewing Your Own Game Engie eng
Brewing Your Own Game Engie engCoconut Island
 
Mono for Game Developers - AltDevConf 2012
Mono for Game Developers - AltDevConf 2012Mono for Game Developers - AltDevConf 2012
Mono for Game Developers - AltDevConf 2012Xamarin
 
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...gamifi.cc
 
Confrontation Pipeline and SCons
Confrontation Pipeline and SConsConfrontation Pipeline and SCons
Confrontation Pipeline and SConsslantsixgames
 
PRESENTATION ON Game Engine
PRESENTATION ON Game EnginePRESENTATION ON Game Engine
PRESENTATION ON Game EngineDiksha Bhargava
 
Delta Engine @ CeBit 2011
Delta Engine @ CeBit 2011Delta Engine @ CeBit 2011
Delta Engine @ CeBit 2011Karsten Wysk
 
ميهين
ميهينميهين
ميهينAhmed
 
De Re PlayStation Vita
De Re PlayStation VitaDe Re PlayStation Vita
De Re PlayStation VitaSlide_N
 
I phone udvikling best brains
I phone udvikling best brainsI phone udvikling best brains
I phone udvikling best brainsOve larsen
 
Supersize Your Production Pipe
Supersize Your Production PipeSupersize Your Production Pipe
Supersize Your Production Pipeslantsixgames
 
Maximize Your Production Effort (English)
Maximize Your Production Effort (English)Maximize Your Production Effort (English)
Maximize Your Production Effort (English)slantsixgames
 
Introduction to Game Engine: Concepts & Components
Introduction to Game Engine: Concepts & ComponentsIntroduction to Game Engine: Concepts & Components
Introduction to Game Engine: Concepts & ComponentsPouya Pournasir
 
Video game development for everybody
Video game development for everybodyVideo game development for everybody
Video game development for everybodySarah Sexton
 

Similar to State-Based Scripting in Uncharted 2: Among Thieves (20)

StateScriptingInUncharted2
StateScriptingInUncharted2StateScriptingInUncharted2
StateScriptingInUncharted2
 
Ghajini - The Game Development
Ghajini - The Game DevelopmentGhajini - The Game Development
Ghajini - The Game Development
 
God Of War : post mortem
God Of War : post mortemGod Of War : post mortem
God Of War : post mortem
 
Supersize your production pipe enjmin 2013 v1.1 hd
Supersize your production pipe    enjmin 2013 v1.1 hdSupersize your production pipe    enjmin 2013 v1.1 hd
Supersize your production pipe enjmin 2013 v1.1 hd
 
Mp24: Python in gaming industry
Mp24: Python in gaming industryMp24: Python in gaming industry
Mp24: Python in gaming industry
 
Brewing Your Own Game Engie eng
Brewing Your Own Game Engie engBrewing Your Own Game Engie eng
Brewing Your Own Game Engie eng
 
Mono for Game Developers - AltDevConf 2012
Mono for Game Developers - AltDevConf 2012Mono for Game Developers - AltDevConf 2012
Mono for Game Developers - AltDevConf 2012
 
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
 
Confrontation Pipeline and SCons
Confrontation Pipeline and SConsConfrontation Pipeline and SCons
Confrontation Pipeline and SCons
 
PRESENTATION ON Game Engine
PRESENTATION ON Game EnginePRESENTATION ON Game Engine
PRESENTATION ON Game Engine
 
Delta Engine @ CeBit 2011
Delta Engine @ CeBit 2011Delta Engine @ CeBit 2011
Delta Engine @ CeBit 2011
 
From Web to Mobile with Stage 3D
From Web to Mobile with Stage 3DFrom Web to Mobile with Stage 3D
From Web to Mobile with Stage 3D
 
ميهين
ميهينميهين
ميهين
 
De Re PlayStation Vita
De Re PlayStation VitaDe Re PlayStation Vita
De Re PlayStation Vita
 
I phone udvikling best brains
I phone udvikling best brainsI phone udvikling best brains
I phone udvikling best brains
 
Supersize Your Production Pipe
Supersize Your Production PipeSupersize Your Production Pipe
Supersize Your Production Pipe
 
Maximize Your Production Effort (English)
Maximize Your Production Effort (English)Maximize Your Production Effort (English)
Maximize Your Production Effort (English)
 
Drama Dash
Drama DashDrama Dash
Drama Dash
 
Introduction to Game Engine: Concepts & Components
Introduction to Game Engine: Concepts & ComponentsIntroduction to Game Engine: Concepts & Components
Introduction to Game Engine: Concepts & Components
 
Video game development for everybody
Video game development for everybodyVideo game development for everybody
Video game development for everybody
 

Recently uploaded

A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 

Recently uploaded (20)

A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 

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
  • 3. Introduction to State Scripts 3 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
  • 37. State Script Syntax 21 Monday, April 6, 2009
  • 38. Game
Developers
Conference
2009 22 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
  • 74. (define-state-script ("kickable-gate") :initial-state "closed" Manipulating Variables :declarations (decl-list (var "num-attempts" :type int32) • Simple commands for reading (var "is-locked" :type boolean :default #t) ) and writing variables (state ("kicked") (on (begin) • Lisp/Scheme uses prefix notation [when [get-boolean "is-locked"] [set-int32 "num-attempts" (a.k.a. Polish notation) [+ 1 [get-int32 "num-attempts"]] ]  [+ a b] calculates (a + b) [wait-animate "self" "kick-failure"] [go "closed"]  [set "x" [+ 1 [get "x"]]] ] increments variable “x” ;; else... [wait-animate "self" "kick-success"] [go "open"] ) ) ... Game
Developers
Conference
2009 33 Monday, April 6, 2009
  • 75. (define-state-script ("kickable-gate") :initial-state "closed" Manipulating Variables :declarations (decl-list (var "num-attempts" :type int32) • Simple commands for reading (var "is-locked" :type boolean :default #t) ) and writing variables (state ("kicked") (on (begin) • Lisp/Scheme uses prefix notation [when [get-boolean "is-locked"] [set-int32 "num-attempts" (a.k.a. Polish notation) [+ 1 [get-int32 "num-attempts"]] ]  [+ a b] calculates (a + b) [wait-animate "self" "kick-failure"] [go "closed"]  [set "x" [+ 1 [get "x"]]] ] increments variable “x” ;; else... [wait-animate "self" "kick-success"] [go "open"] ) ) ... Game
Developers
Conference
2009 33 Monday, April 6, 2009
  • 76. (define-state-script ("kickable-gate") :initial-state "closed" Manipulating Variables :declarations (decl-list (var "num-attempts" :type int32) • Simple commands for reading (var "is-locked" :type boolean :default #t) ) and writing variables (state ("kicked") (on (begin) • Lisp/Scheme uses prefix notation [when [get-boolean "is-locked"] [set-int32 "num-attempts" (a.k.a. Polish notation) [+ 1 [get-int32 "num-attempts"]] ]  [+ a b] calculates (a + b) [wait-animate "self" "kick-failure"] [go "closed"]  [set "x" [+ 1 [get "x"]]] ] increments variable “x” ;; else... [wait-animate "self" "kick-success"] [go "open"] ) ) ... Game
Developers
Conference
2009 33 Monday, April 6, 2009
  • 77. (define-state-script ("kickable-gate") :initial-state "closed" Manipulating Variables :declarations (decl-list (var "num-attempts" :type int32) • Simple commands for reading (var "is-locked" :type boolean :default #t) ) and writing variables (state ("kicked") (on (begin) • Lisp/Scheme uses prefix notation [when [get-boolean "is-locked"] [set-int32 "num-attempts" (a.k.a. Polish notation) [+ 1 [get-int32 "num-attempts"]] ˘ ]  [+ a b] calculates (a + b) [wait-animate "self" "kick-failure"] [go "closed"]  [set "x" [+ 1 [get "x"]]] ] increments variable “x” ;; else... [wait-animate "self" "kick-success"] [go "open"] ) ) ... Game
Developers
Conference
2009 33 Monday, April 6, 2009
  • 78. (define-state-script ("kickable-gate") :initial-state "closed" Manipulating Variables :declarations (decl-list (var "num-attempts" :type int32) • Simple commands for reading (var "is-locked" :type boolean :default #t) ) and writing variables (state ("kicked") (on (begin) • Lisp/Scheme uses prefix notation [when [get-boolean "is-locked"] [set-int32 "num-attempts" (a.k.a. Polish notation) [+ 1 [get-int32 "num-attempts"]] ]  [+ a b] calculates (a + b) [wait-animate "self" "kick-failure"] [go "closed"]  [set "x" [+ 1 [get "x"]]] ] increments variable “x” ;; else... [wait-animate "self" "kick-success"] [go "open"] ) ) ... Game
Developers
Conference
2009 33 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
  • 90. Case Studies 37 Monday, April 6, 2009
  • 91. Custom Object Type: Breakable Sign Game
Developers
Conference
2009 38 Monday, April 6, 2009
  • 92. Custom Object Type: Breakable Sign Game
Developers
Conference
2009 38 Monday, April 6, 2009
  • 93. Custom Object Type: Breakable Sign (define-state-script ("falling-sign") (state ("untouched") (on (update) [when [task-complete? "wz-post-combat"] [go "fallen"] ] ) (on (event "hanging-from") [go "breaking"] ) ) ... Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 94. Custom Object Type: Breakable Sign (define-state-script ("falling-sign") (state ("untouched") (on (update) [when [task-complete? "wz-post-combat"] [go "fallen"] ] ) (on (event "hanging-from") [go "breaking"] ) ) ... Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 95. Custom Object Type: Breakable Sign (define-state-script ("falling-sign") (state ("untouched") (on (update) [when [task-complete? "wz-post-combat"] [go "fallen"] ] ) (on (event "hanging-from") [go "breaking"] ) ) ... Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 96. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 97. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 98. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 99. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 100. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 101. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 102. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 103. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 104. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) [spawn-particles-at-joint "self" "hinge" "sign-break-dust"] [wait-animate "self" "sign-break"] [go "fallen"] ) ) (state ("fallen") (on (begin) [animate "self" "sign-broken"] ;; looping ) ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 105. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) (define-state-script ("falling-sign") [spawn-particles-at-joint "self" (state ("untouched") "hinge" (on (update) "sign-break-dust"] [when [task-complete? "wz-post-combat"] [wait-animate "self" "sign-break"] [go "fallen"] [go "fallen"] ] ) ) ) (on (event "hanging-from") (state ("fallen") [go "breaking"] (on (begin) ) [animate "self" "sign-broken"] ;; looping ) ) ... ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 106. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) (define-state-script ("falling-sign") [spawn-particles-at-joint "self" (state ("untouched") "hinge" (on (update) "sign-break-dust"] [when [task-complete? "wz-post-combat"] [wait-animate "self" "sign-break"] [go "fallen"] [go "fallen"] ] ) ) ) (on (event "hanging-from") (state ("fallen") [go "breaking"] (on (begin) ) [animate "self" "sign-broken"] ;; looping ) ) ... ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 107. Custom Object Type: Breakable Sign (state ("breaking") (on (begin) (define-state-script ("falling-sign") [spawn-particles-at-joint "self" (state ("untouched") "hinge" (on (update) "sign-break-dust"] [when [task-complete? "wz-post-combat"] [wait-animate "self" "sign-break"] [go "fallen"] [go "fallen"] ] ) ) ) (on (event "hanging-from") (state ("fallen") [go "breaking"] (on (begin) ) [animate "self" "sign-broken"] ;; looping ) ) ... ) ) Game
Developers
Conference
2009 39 Monday, April 6, 2009
  • 108. Making the Sign Script Generic (state ("animating") (on (begin) [spawn-particles-at-joint "self" (define-state-script ("simple-animating-obj") [tag-string "particle-joint"] (state ("initial") [tag-string "particle-name"]] (on (update) [wait-animate "self" [when [task-complete? [tag-string "anim-name"]] [tag-string "done-task"]] [go "done"] [go "done"] ) ] ) ) (state ("done") (on (event "hanging-from") (on (begin) [go "animating"] [animate "self" ) [tag-string "done-anim-name"]] ) ) ... ) ) Game
Developers
Conference
2009 40 Monday, April 6, 2009