SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

Uncharted 2: Character Pipeline
Uncharted 2: Character PipelineUncharted 2: Character Pipeline
Uncharted 2: Character PipelineNaughty Dog
 
脱! 俺たちは雰囲気でBPをいじっている
脱! 俺たちは雰囲気でBPをいじっている脱! 俺たちは雰囲気でBPをいじっている
脱! 俺たちは雰囲気でBPをいじっているNaoaki Yamaji
 
ゲームAI入門(後半)
ゲームAI入門(後半)ゲームAI入門(後半)
ゲームAI入門(後半)Youichiro Miyake
 
Naughty Dog Vertex
Naughty Dog VertexNaughty Dog Vertex
Naughty Dog VertexNaughty Dog
 
Practical SPU Programming in God of War III
Practical SPU Programming in God of War IIIPractical SPU Programming in God of War III
Practical SPU Programming in God of War IIISlide_N
 
「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発Unity Technologies Japan K.K.
 
Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Graham Wihlidal
 
Art Direction for Uncharted 2: Among Thieves
Art Direction for Uncharted 2: Among ThievesArt Direction for Uncharted 2: Among Thieves
Art Direction for Uncharted 2: Among ThievesNaughty Dog
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>エピック・ゲームズ・ジャパン Epic Games Japan
 
GDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham OriginsGDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham OriginsColin Barré-Brisebois
 
Rendering Technologies from Crysis 3 (GDC 2013)
Rendering Technologies from Crysis 3 (GDC 2013)Rendering Technologies from Crysis 3 (GDC 2013)
Rendering Technologies from Crysis 3 (GDC 2013)Tiago Sousa
 
SPU Shaders
SPU ShadersSPU Shaders
SPU ShadersSlide_N
 
Killzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemKillzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemGuerrilla
 

Was ist angesagt? (20)

Uncharted 2: Character Pipeline
Uncharted 2: Character PipelineUncharted 2: Character Pipeline
Uncharted 2: Character Pipeline
 
脱! 俺たちは雰囲気でBPをいじっている
脱! 俺たちは雰囲気でBPをいじっている脱! 俺たちは雰囲気でBPをいじっている
脱! 俺たちは雰囲気でBPをいじっている
 
UE4における大規模背景制作事例 描画特殊表現編
UE4における大規模背景制作事例 描画特殊表現編UE4における大規模背景制作事例 描画特殊表現編
UE4における大規模背景制作事例 描画特殊表現編
 
UE4のスレッドの流れと Input Latency改善の仕組み
UE4のスレッドの流れとInput Latency改善の仕組みUE4のスレッドの流れとInput Latency改善の仕組み
UE4のスレッドの流れと Input Latency改善の仕組み
 
【UE4.25 新機能】ロードの高速化機能「IOStore」について
【UE4.25 新機能】ロードの高速化機能「IOStore」について【UE4.25 新機能】ロードの高速化機能「IOStore」について
【UE4.25 新機能】ロードの高速化機能「IOStore」について
 
ゲームAI入門(後半)
ゲームAI入門(後半)ゲームAI入門(後半)
ゲームAI入門(後半)
 
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめUnreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
 
Lightmassの仕組み ~Precomputed Light Volume編~ (Epic Games Japan: 篠山範明)
 Lightmassの仕組み ~Precomputed Light Volume編~ (Epic Games Japan: 篠山範明) Lightmassの仕組み ~Precomputed Light Volume編~ (Epic Games Japan: 篠山範明)
Lightmassの仕組み ~Precomputed Light Volume編~ (Epic Games Japan: 篠山範明)
 
Naughty Dog Vertex
Naughty Dog VertexNaughty Dog Vertex
Naughty Dog Vertex
 
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
 
Lightmassの仕組み ~Lightmap編~ (Epic Games Japan: 篠山範明)
Lightmassの仕組み ~Lightmap編~ (Epic Games Japan: 篠山範明)Lightmassの仕組み ~Lightmap編~ (Epic Games Japan: 篠山範明)
Lightmassの仕組み ~Lightmap編~ (Epic Games Japan: 篠山範明)
 
Practical SPU Programming in God of War III
Practical SPU Programming in God of War IIIPractical SPU Programming in God of War III
Practical SPU Programming in God of War III
 
「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発
 
Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016Optimizing the Graphics Pipeline with Compute, GDC 2016
Optimizing the Graphics Pipeline with Compute, GDC 2016
 
Art Direction for Uncharted 2: Among Thieves
Art Direction for Uncharted 2: Among ThievesArt Direction for Uncharted 2: Among Thieves
Art Direction for Uncharted 2: Among Thieves
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
 
GDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham OriginsGDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
GDC 2014 - Deformable Snow Rendering in Batman: Arkham Origins
 
Rendering Technologies from Crysis 3 (GDC 2013)
Rendering Technologies from Crysis 3 (GDC 2013)Rendering Technologies from Crysis 3 (GDC 2013)
Rendering Technologies from Crysis 3 (GDC 2013)
 
SPU Shaders
SPU ShadersSPU Shaders
SPU Shaders
 
Killzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemKillzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo Postmortem
 

Andere mochten auch

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
 
Creating A Character in Uncharted: Drake's Fortune
Creating A Character in Uncharted: Drake's FortuneCreating A Character in Uncharted: Drake's Fortune
Creating A Character in Uncharted: Drake's FortuneNaughty Dog
 
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
 
Practical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT MethodsPractical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT MethodsNaughty Dog
 

Andere mochten auch (10)

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
 
Creating A Character in Uncharted: Drake's Fortune
Creating A Character in Uncharted: Drake's FortuneCreating A Character in Uncharted: Drake's Fortune
Creating A Character in Uncharted: Drake's Fortune
 
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
 
Practical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT MethodsPractical Spherical Harmonics Based PRT Methods
Practical Spherical Harmonics Based PRT Methods
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 

Kürzlich hochgeladen (20)

Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 

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