Presentation is loading. Please wait.

Presentation is loading. Please wait.

Game Scripting By: Nicholas Haines. Aurora Neverwinter Toolset.

Similar presentations


Presentation on theme: "Game Scripting By: Nicholas Haines. Aurora Neverwinter Toolset."— Presentation transcript:

1 Game Scripting By: Nicholas Haines

2 Aurora Neverwinter Toolset

3

4

5 What is Scripting? Interpreted Language Interpreted Language –As the game runs

6 Advantages Ease of use Ease of use Makes the game more data driven Makes the game more data driven –Instead of hard coding into game engine Allows for in-game “tweaking” Allows for in-game “tweaking” –Quick results –Does not require a recompile Allows user modability Allows user modability Game can be patched at a later date Game can be patched at a later date Many publicly available scripting languages Many publicly available scripting languages

7 Disadvantages Performance Performance –Not noticeable most of the time in real world performance real world performance Automatic memory management Automatic memory management –Can cause problems if it interrupts a command or takes awhile to complete Poor debugging tools Poor debugging tools –Some languages don’t give warnings –Tends to be very hard to find the errors

8 Lua In The Industry Ease of Use Ease of Use –for non-programmers Speed Speed –don’t slow down the game Size Size –Lua executable is ~ 160kb Well Documented Well Documented –Lua documentation is lacking Flexible Flexible –Clean and flexible interface Falko Poiker

9 Jobs

10 Optimizing Script Execution

11 Using Patterns Object: Reduce the number of instructions Object: Reduce the number of instructions Look for patterns in the opcode output Look for patterns in the opcode output –Replace with optimized version Check for addresses calculated multiple times and save to a spare register Check for addresses calculated multiple times and save to a spare register –Replace matching with reference to register May shorten code by up to 50% May shorten code by up to 50% assuming decoding script is the bottleneck of the virtual machine [VM]

12 Non-Branched, Constant Scripts Native function calls can be intercepted inside the VM Native function calls can be intercepted inside the VM Store as a function pointer along its arguments Store as a function pointer along its arguments Big list of stored functions is called an Execute List Big list of stored functions is called an Execute List Will now traverse execute list instead of having to interpret the opcode again Will now traverse execute list instead of having to interpret the opcode again

13 Branched Scripts Conditional jumps cannot be predicted Conditional jumps cannot be predicted A Jump Table can be used to decrease decode time during execution A Jump Table can be used to decrease decode time during execution Contains the offset of native opcode executing specific script opcode Contains the offset of native opcode executing specific script opcode Use pure jump table opcodes for most common instructions Use pure jump table opcodes for most common instructions Combine jump table/parse for less common instructions to reduce the table size Combine jump table/parse for less common instructions to reduce the table size Note: jump table values change whenever the VM’s code is changed the VM’s code is changed Example to be decoded mov [vm_reg0], vm_reg1 (using x86 asm) ;get contents of vm register 0 into eax mov eax, [ecx+0] ;get contents of vm register 1 into ebx mov ebx, [ecx+4] ;solve indirection mov [eax], ebx ;increment vm instruction pointer add edx, 4 ;transfer program control to next opcode jump [edx] ~3 cycles ~1 cycles ~3 cycles

14 Branched into Non-Branched Monster::PlayerSpotted(bool hear_player, bool see_player, float* pos) Monster::PlayerSpotted(bool hear_player, bool see_player, float* pos){ if(!see_player) if(!see_player) { if(hear_player) if(hear_player) { //we have heard something..check out //we have heard something..check out //situation..keep an eye on the place //situation..keep an eye on the place FocusAttention(pos); //native function FocusAttention(pos); //native function } else else { //someone told us about the //someone told us about the //player (monster friend or so) //player (monster friend or so) //let's help our friends //let's help our friends WalkTo(pos); //native function WalkTo(pos); //native function } } else else { //we can see the enemy..let's kill him! //we can see the enemy..let's kill him! ShootAt(pos); //native function ShootAt(pos); //native function }} Generates each possibility and removes branching Generates each possibility and removes branching Code to the left becomes: Code to the left becomes: Monster::PlayerSpotted(bool hear_player=true, Monster::PlayerSpotted(bool hear_player=true, bool see_player=false, bool see_player=false, float* pos) float* pos) { FocusAttention(pos); FocusAttention(pos); } This can be optimized using execution lists This can be optimized using execution lists

15 Advanced Script Debugging

16 Exchanging Debug Information Debugger creates a new processes that uses the VM to execute scripts Debugger creates a new processes that uses the VM to execute scripts VM sends string messages to Debugger VM sends string messages to Debugger VM needs memory buffers for the Debugger to write to VM needs memory buffers for the Debugger to write to VirtualMachineDebugger breakpoint hit access violation update breakpoints

17 Useful Features Debug information Debug information Handling Breakpoints Handling Breakpoints Variable Watch Variable Watch Call Stack Call Stack Step-by-Step Execution Step-by-Step Execution Step-by-Step Assembly Execution Step-by-Step Assembly Execution Register Watch Register Watch Memory Watch Memory Watch Step-by-Step High- Level Execution Step-by-Step High- Level Execution Step Over Execution Step Over Execution

18 Adding Error Reporting

19 Create A Parser For Your Script Use tools like Lex and Yacc Use tools like Lex and Yacc Since mostly nonprogrammers use the scripting language, make meaningful error messages. Since mostly nonprogrammers use the scripting language, make meaningful error messages.

20 A Simple Language Example code: int x; int y; y = 0; x = SomeFunction() - 5; if( x > OtherFunction() ) y = 3; y = 3; Possible Errors Possible Errors –Semicolon missing –Parentheses missing –Unrecognized characters –Unrecognized keyword –Function misspelled –Undeclared variable –Variable declared more than once

21 Reporting with yyerror() Prints “syntax error” to standard output Prints “syntax error” to standard output Overwrite yyerror() with a useful version Overwrite yyerror() with a useful version Derive a custom scanner function Derive a custom scanner function Print formatted error messages to a specified error file Print formatted error messages to a specified error file –Include line number and copy of the line This can be stored as a log or displayed in another application This can be stored as a log or displayed in another application

22 Identifying Specific Errors Unknown Character Errors Unknown Character Errors. yyerror(“Error: Unknown character ‘%c’ “, *yytext);. yyerror(“Error: Unknown character ‘%c’ “, *yytext); Append grammar to trap missing semicolon Append grammar to trap missing semicolon Do the same to catch unrecognized functions Do the same to catch unrecognized functions Undeclared and Redeclared Variables Undeclared and Redeclared Variables –Parser must check variable table to see if the variable has been previously declared

23 References AI Game Programming WISDOM 2 AI Game Programming WISDOM 2 Sections 9.1-9.3 Game Dev Articles: Game Dev Articles: Scripting by Falko Poiker http://www.relic.com/industry/articles/scripting.php The Secret Life of Game Scripting The Secret Life of Game Scripting By Brian Hook http://www.bookofhook.com/Article/GameDevelopme nt/TheSecretLifeofGameScript.html http://www.bookofhook.com/Article/GameDevelopme nt/TheSecretLifeofGameScript.html


Download ppt "Game Scripting By: Nicholas Haines. Aurora Neverwinter Toolset."

Similar presentations


Ads by Google