Difference between revisions of "SCO"
Line 125: | Line 125: | ||
|44|| Pop || Pops the top item off the stack || 1 byte | |44|| Pop || Pops the top item off the stack || 1 byte | ||
|- | |- | ||
− | |45|| CallNative || Calls a [[List_of_native_functions]] || 7 bytes | + | |45|| CallNative || Calls a [[List_of_native_functions|Native]] || 7 bytes |
|} | |} | ||
Revision as of 00:46, 6 February 2009
SCO files contain GTA 4's game scripts. Its new format replaces old scm one.
Contents
File Format
A SCO file is layed out into 4 segments. First the Header containing information about the SCO file. Then the Code Segment which contains the opcode's which govern how the script behaves. The next segment is the Local Variable container which contains enough space to hold the local variables. The last is the Global Variable container, which contains enough space to house the global variables, as well as setting them by default.
Header
There are 2 types of SCO files, an encrypted and unencrypted one. Each file however shares the same unencrypted header structure, and you can use this to determine which type of SCO file you are dealing with. The size of this header is 24 bytes.
4b - CHAR[4]/UINT32 - SCO Identifier 4b - UINT32 - Code Size 4b - UINT32 - Local Var Size 4b - UINT32 - Global Var Size 4b - UINT32 - Script Flags 4b - UINT32 - Signature
The SCO Identifier will be "SCR\r" (or 0xD524353) in an unencrypted version, and "scr"+0xE (or 0xE726373) in an encrypted version. The Code Size refers to the amount of bytes the code section takes up. The Local Var Size refers to the amount of local variables the SCO file contains. The segment for local variables starts at the end of Header + Code Size, and continues for 4x the local variable size (due to the local variables being stored in 4 byte segments). The Global Var Size refers to the amount of global variables the SCO file contains. The segment for global variables starts at the end of Header + Code Size + Local Var Size * 4, and continues for 4x the global variable size (due to the global variables being stored in 4 byte segments). The Script Flags are boolean bits which are currently unexplained. The Signature only differs in navgen_main, but could possibly set the script priority.
Code Segment
The Code Segment contains the opcodes which govern the scripts behaviour.
Opcodes
Opcodes can have varying sizes, but all opcodes are identified by their first byte. There are 80 opcodes which can occur, any opcode above 80 is a Push opcode which pushes it's own number - 96 onto the stack.
ID | Name | Description | Length |
---|---|---|---|
1 | Add | Adds the top 2 items on the stack | 1 byte |
2 | Sub | Subtracts the top 2 items on the stack | 1 byte |
3 | Mul | Multiplies the top 2 items on the stack | 1 byte |
4 | Div | Divides the top 2 items on the stack | 1 byte |
5 | Mod | Mods the top 2 items on the stack | 1 byte |
6 | IsZero | Checks the first item on the stack to see if it equals 0 | 1 byte |
7 | Neg | Reverses the sign on the item on the top of the stack | 1 byte |
8 | CmpEq | Compares the top 2 integers on the stack to see if they are equal | 1 byte |
9 | CmpNe | Compares the top 2 integers on the stack to see if they are not equal | 1 byte |
10 | CmpGt | Compares the top 2 integers on the stack to see if the first one is greater than the second one | 1 byte |
11 | CmpGe | Compares the top 2 integers on the stack to see if the first one is greater than or equal to the second one | 1 byte |
12 | CmpLt | Compares the top 2 integers on the stack to see if the first one is less than the second one | 1 byte |
13 | CmpLe | Compares the top 2 integers on the stack to see if the first one is less than or equal to the second one | 1 byte |
14 | AddF | Adds the top 2 floats on the stack | 1 byte |
15 | SubF | Subtracts the top 2 floats on the stack | 1 byte |
16 | MulF | Multiplies the top 2 floats on the stack | 1 byte |
17 | DivF | Divides the top 2 floats on the stack | 1 byte |
18 | ModF | Mods the top 2 floats on the stack | 1 byte |
19 | NegF | Reverses the sign on the first float on the stack | 1 byte |
20 | CmpEqF | Compares the top 2 floats on the stack to see if they are equal | 1 byte |
21 | CmpNeF | Compares the top 2 floats on the stack to see if they are not equal | 1 byte |
22 | CmpGtF | Compares the top 2 floats on the stack to see if the first one is greater than the second one | 1 byte |
23 | CmpGeF | Compares the top 2 floats on the stack to see if the first one is greater than or equal to the second one | 1 byte |
24 | CmpLtF | Compares the top 2 floats on the stack to see if the first one is less than the second one | 1 byte |
25 | CmpLeF | Compares the top 2 floats on the stack to see if the first one is less than or equal to the second one | 1 byte |
26 | AddVec | Adds the top 2 Vectors on the stack | 1 byte |
27 | SubVec | Subtracts the top 2 Vectors on the stack | 1 byte |
28 | MulVec | Multiplies the top 2 Vectors on the stack | 1 byte |
29 | DivVec | Divides the top 2 Vectors on the stack | 1 byte |
30 | NegVec | Reverses the sign on the first vector on the stack | 1 byte |
31 | And | Performs an And operation to the first 2 integers on the stack | 1 byte |
32 | Or | Performs an Or operation to the first 2 integers on the stack | 1 byte |
33 | Xor | Performs a Xor operation to the first 2 integers on the stack | 1 byte |
34 | Jump | Jumps to a section of code, using the next 4 bytes after the opcode as a placement | 5 bytes |
35 | JumpFalse | Jumps to a section of code if the top of the stack is 0, using the next 4 bytes after the opcode as a placement | 5 bytes |
36 | JumpTrue | Jumps to a section of code if the top of the stack is 1, using the next 4 bytes after the opcode as a placement | 5 bytes |
37 | ToF | Converts the top integer on the stack to a float, and puts that float on the stack | 1 byte |
38 | FromF | Converts the top float on the stack to an integer, and puts that integer on the stack | 1 byte |
39 | VecFromF | Converts the top float into a Vector containing 3 instances of the same float, and pushes the pointer to that Vector onto the top of the stack | 1 byte |
40 | PushS | Pushes a short onto the stack, the short is defined in the next 2 bytes after the opcode | 3 bytes |
41 | Push | Pushes an int onto the stack, the integer is defined in the next 4 bytes after the opcode | 5 bytes |
42 | PushF | Pushes a float onto the stack, the float is defined in the next 4 bytes after the opcode. Performs exactly the same as Push | 5 bytes |
43 | Dup | Duplicates the first item on the stack, and pushes it back onto the stack | 1 byte |
44 | Pop | Pops the top item off the stack | 1 byte |
45 | CallNative | Calls a Native | 7 bytes |
Note: The Vectors on the stack are pointers to the memory containing the full vector. This section is incomplete. You can help by fixing and expanding it.
Grand Theft Auto IV | |
---|---|
File Formats | .dat • .gxt • .ide • .img • .ipl • .nod • .sco • .rpf • .rrr • .wad • .wbd/.wbn • .wdd • .wdr • .wft • .whm • .wpl • .wtd |
Documentation | Audio • Bink Video • Cryptography • Cutscenes • GXT Text • Image listing • Keycodes • Map Listing • Native functions • Paths • Radar Blips • Radio Stations • Saves • Scenarios • VTable • Weapons |
Tools | ASI Loader • ENBSeries • G-Texture • GIMS IV • Ingame WPL Editor • IV Needle • OpenIV • SparkIV • XLiveLess • WPL Manager • X Mod Installer Alice • C++ Script Hook • .NET Script Hook • Scocl |
Tutorials | Importing Textures with OpenIV • Importing Textures with SparkIV |
Modifications | GTA Connected • Gostown IV • Four Multiplayer • IV Multiplayer • CitizenMP:IV Reloaded |
Useful links | Community portal • Discussion forums • Modding forums • Mods on GTAGarage.com |