Difference between revisions of "III/VC SCM"

From GTAMods Wiki
Jump to navigation Jump to search
(Overall Format)
m (Standardized terms based on Mobile symbols.)
Line 1: Line 1:
 
{{Cleanup-rewrite}}
 
{{Cleanup-rewrite}}
 
== Overall Format ==
 
== Overall Format ==
  (02 00 01)h + 32-bit int     Jump to second segment
+
  (02 00 01)h + 32-bit int       Jump to second segment
  byte                         Target game ('l' - Liberty for III, 'm' - Miami for VC)
+
  byte                           Target game ('l' - Liberty for III, 'm' - Miami for VC)
   (Global vars)              Space for variable saving
+
  32-bit int                  Number of cutscene starts (VC Mobile only, unused at runtime)
  (02 00 01)h + 32-bit int     Jump to third segment
+
  (Cutscene start array)      32-bit offset * 300 (VC Mobile only, unused at runtime)
  byte                         Padding (always 0)
+
   (Globals space)              Space for global variable storage
   32-bit int                 Number of models
+
  (02 00 01)h + 32-bit int       Jump to third segment
   (Model names)             24-byte model names * number of models (model 0 name is empty and therefore unused)
+
  byte                           Align (always 0)
  (02 00 01)h + 32-bit int     Jump to fourth segment
+
   32-bit int                   Number of used objects
  byte                         Padding (always 0)
+
   (Used object array)         24-byte object name * number of used objects (first object name is empty and therefore unused)
   32-bit int                 MAIN size
+
  (02 00 01)h + 32-bit int       Jump to fourth segment
   32-bit int                 Largest mission size
+
  byte                           Align (always 0)
   16-bit int                 Number of total missions
+
   32-bit int                   Main script size
   16-bit int                 Number of exclusive missions {{Ref|1}}
+
   32-bit int                   Largest mission script size
   (Mission addresses)       32-bit addresses * number of missions
+
   16-bit int                   Number of mission scripts (120 in total)
  (MAIN code)                 MAIN section, equal to size defined earlier
+
   16-bit int                   Number of exclusive mission scripts (possibly 1 in III, 2 in VC)
  (Mission code)               The mission data, missions stored at offsets defined earlier
+
   (Multi script array)         (32-bit offset - 8) * number of mission scripts
 
+
  (Main script space)           Space of main script (equal to size defined earlier)
{{Note|1}} in GTA 3 total number of missions is limited to 120.
+
  (Mission scripts space)       Space of mission scripts (stored at offsets defined earlier)
  
 
== Main Section ==
 
== Main Section ==

Revision as of 22:52, 11 December 2016

40px-Ambox rewrite orange.svg.png This article may need to be rewritten.
Please help improve this article. The discussion page may contain suggestions.

Overall Format

(02 00 01)h + 32-bit int       Jump to second segment
byte                           Target game ('l' - Liberty for III, 'm' - Miami for VC)
  32-bit int                   Number of cutscene starts (VC Mobile only, unused at runtime)
  (Cutscene start array)       32-bit offset * 300 (VC Mobile only, unused at runtime)
  (Globals space)              Space for global variable storage
(02 00 01)h + 32-bit int       Jump to third segment
byte                           Align (always 0)
  32-bit int                   Number of used objects
  (Used object array)          24-byte object name * number of used objects (first object name is empty and therefore unused)
(02 00 01)h + 32-bit int       Jump to fourth segment
byte                           Align (always 0)
  32-bit int                   Main script size
  32-bit int                   Largest mission script size
  16-bit int                   Number of mission scripts (120 in total)
  16-bit int                   Number of exclusive mission scripts (possibly 1 in III, 2 in VC)
  (Multi script array)         (32-bit offset - 8) * number of mission scripts
(Main script space)            Space of main script (equal to size defined earlier)
(Mission scripts space)        Space of mission scripts (stored at offsets defined earlier)

Main Section

Made up of many opcodes one after the other. Opcodes are of the format:

TOpcode {
  Opcode[2]: Word; //Opocode number in word format
  Parameters: Array Of TParameter;
}

The number of parameters is specific for each opcode. The opcode database has all of the opcodes in VC, with their parameter numbers, and for most, a description of what they do. Parameters are of the format:

TParameter {
  ParameterType[1]: Byte; //Says which type of parameter will follow
  ActualParameter: varies; //The actual parameter
}

The parameter types are as follows (but there are more in SA):

01: 32-bit int   (DWord)
02: global var   (Word)
03: local var    (Word)
04: 8-bit int    (Byte)
05: 16-bit int   (Word)
06: 4-byte float (Single)

Labels use the type 01 (although if they address is small enough using data types 04 and 05 will also work). Global and local vars can also be used for labels. Global vars reference a position in the file much like a label. There is a space at the top of the scm file filled with 00's which is space reserved for global vars. This is divided into blocks of 4 bytes, each var taking up one of these blocks. In compiled form, the global vars each point to somewhere in that block (or should do as otherwise writing to it will modify the actual code).

Example

This code:

0001: wait 8 ms
0002: jump $var1
0050: gosub 1@
0051: return

...compiles as:

01 00 04 08 //wait opcode (First 2 bytes = opcode, next byte = 04 the parameter type for 8-bit int, and 08 is the actual value)
02 00 02 18 00 // jump opcode. The 18 00 would mean that the global var is stored at address 0x0018
50 00 03 01 00 //the gosub opcode
51 00 //the return opcode (it has no parameters)