Difference between revisions of "Saves (GTA VC)"

From GTAMods Wiki
Jump to navigation Jump to search
m (Block 21: Streaming)
 
(17 intermediate revisions by 3 users not shown)
Line 3: Line 3:
  
 
== Location ==
 
== Location ==
By default, the game places its save game files into the folder "GTA Vice City User Files" which is located in the current user's Documents folder. The location of this folder varies depending upon the version of Windows installed.
+
By default, the game places its save game files into the folder "[[User Files|GTA Vice City User Files]]" which is located in the current user's Documents folder. The location of this folder varies depending upon the version of Windows installed.
  
 
The save files themselves are named in the format '''GTAVCsfX.b''' where '''X''' represents the in-game slot number. There are 8 slots available in the game (1-8).
 
The save files themselves are named in the format '''GTAVCsfX.b''' where '''X''' represents the in-game slot number. There are 8 slots available in the game (1-8).
Line 25: Line 25:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||wchar_t[24] ||[[0318|last mission passed]]
+
|0x0000 ||[[wikipedia:Wide character|wchar_t]][24] ||[[0318|last mission passed]]
 
|-
 
|-
 
|0x0030 ||word ||SYSTEMTIME wYear
 
|0x0030 ||word ||SYSTEMTIME wYear
Line 45: Line 45:
 
|0x0040 ||dword ||unknown, value is always 12609
 
|0x0040 ||dword ||unknown, value is always 12609
 
|-
 
|-
|0x0044 ||dword ||current island
+
|0x0044 ||dword ||current [[ZONE#Vice City|level]]
 
|-
 
|-
 
|0x0048 ||float[3] ||camera coordinates (x,y,z)
 
|0x0048 ||float[3] ||camera coordinates (x,y,z)
Line 51: Line 51:
 
|0x0054 ||dword ||unknown, but only present in Steam version saves. If present, n = 4 in following offsets for this block, otherwise n = 0.
 
|0x0054 ||dword ||unknown, but only present in Steam version saves. If present, n = 4 in following offsets for this block, otherwise n = 0.
 
|-
 
|-
|0x0054+n ||dword ||length (ms) of in-game minute (1000 = normal)
+
|0x0054+n ||dword ||number of milliseconds per game minute (1000 = normal)
 
|-
 
|-
|0x0058+n ||dword ||weather timer
+
|0x0058+n ||dword ||game timer when game clock last ticked
 
|-
 
|-
 
|0x005C+n ||byte ||game hour
 
|0x005C+n ||byte ||game hour
Line 65: Line 65:
 
|0x0064+n ||dword ||pad number?
 
|0x0064+n ||dword ||pad number?
 
|-
 
|-
|0x0068+n ||dword ||global timer
+
|0x0068+n ||dword ||game timer in milliseconds
 
|-
 
|-
 
|0x006C+n ||float ||[[015D|time scale]]
 
|0x006C+n ||float ||[[015D|time scale]]
Line 89: Line 89:
 
|0x008E+n ||byte[2] ||''align''
 
|0x008E+n ||byte[2] ||''align''
 
|-
 
|-
|0x0090+n ||word ||forced weather type ([[01B5]] or [[01B6]]), -1 if never been forced
+
|0x0090+n ||word ||forced weather type ([[01B5]] or [[01B6]]), -1 if not forced
 
|-
 
|-
 
|0x0092+n ||byte[2] ||''align''
 
|0x0092+n ||byte[2] ||''align''
Line 95: Line 95:
 
|0x0094+n ||float ||weather interpolation value
 
|0x0094+n ||float ||weather interpolation value
 
|-
 
|-
|0x0098+n ||dword ||current weather table offset (between 0 and 63)
+
|0x0098+n ||dword ||current [[Time cycle#Vice City 2|weather list]] offset (between 0 and 63)
 
|-
 
|-
 
|0x009C+n ||float ||current vehicle camera view (between 0.0 and 5.0)
 
|0x009C+n ||float ||current vehicle camera view (between 0.0 and 5.0)
Line 113: Line 113:
 
|0x00B0+n ||dword ||[[04F9|extra color]]
 
|0x00B0+n ||dword ||[[04F9|extra color]]
 
|-
 
|-
|0x00B4+n ||dword ||extra color active (0 = inactive, 1 = active)
+
|0x00B4+n ||dword ||is extra color on
 
|-
 
|-
|0x00B8+n ||float ||extra color fade (between 0.0 and 1.0)
+
|0x00B8+n ||float ||extra color interpolation (between 0.0 and 1.0)
 
|-
 
|-
|0x00BC+n ||dword[10] ||unknown, relates to radio station?
+
|0x00BC+n ||dword[10] ||current radio station position
 
|-
 
|-
 
|0x00E4+n ||dword ||size of script block
 
|0x00E4+n ||dword ||size of script block
Line 144: Line 144:
 
|0x0004 ||dword ||[[0180|on mission flag]] offset in global variable space
 
|0x0004 ||dword ||[[0180|on mission flag]] offset in global variable space
 
|-
 
|-
|0x0008 ||dword ||game timer when mission is passed ([[0318]] or [[0595]]), -1 if never passed a mission
+
|0x0008 ||dword ||game timer when last mission is passed ([[0318]] or [[0595]]), -1 if never passed a mission
 
|-
 
|-
 
|0x000C ||BuildingSwap[25] ||[[03B6|swapped building model]] structures (see below)
 
|0x000C ||BuildingSwap[25] ||[[03B6|swapped building model]] structures (see below)
Line 166: Line 166:
 
</div>
 
</div>
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|style="width: 3.5em;" |0x019C ||style="width: 9.5em;" |InvisibilitySetting[20] ||style="width: 34em;" |object visibility structure ([[0363]]) (see below)
+
|style="width: 3.5em;" |0x019C ||style="width: 9.5em;" |InvisibilitySetting[20] ||style="width: 34em;" |[[0363|object invisibility setting]] structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 192: Line 192:
 
|0x0000 ||byte ||is mission script running
 
|0x0000 ||byte ||is mission script running
 
|-
 
|-
|0x0001 ||byte ||[[0551|Kaufman Cabs radio]]
+
|0x0001 ||byte ||is [[0551|Kaufman Cabs radio on]]
 
|-
 
|-
 
|0x0002 ||byte[2] ||''align''
 
|0x0002 ||byte[2] ||''align''
Line 200: Line 200:
 
|0x0008 ||dword ||size of largest mission
 
|0x0008 ||dword ||size of largest mission
 
|-
 
|-
|0x000C ||word ||number of missions
+
|0x000C ||word ||number of mission scripts
 
|-
 
|-
|0x000E ||word ||unknown
+
|0x000E ||word ||number of exclusive mission scripts
 
|-
 
|-
 
|0x0010 ||dword ||number of running scripts
 
|0x0010 ||dword ||number of running scripts
 
|-
 
|-
|0x0014 ||- ||136 bytes each, script structure (see below)
+
|0x0014 ||Script[n] ||script structures (see below) where n is the number of scripts
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"|Script structure:
+
|+ style="text-align: left;"|Script ({{Hint|0x88|136}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||dword ||pointer to previous script
+
|0x0000 ||dword ||pointer to next script
 
|-
 
|-
|0x0004 ||dword ||pointer to next script
+
|0x0004 ||dword ||pointer to previous script
 
|-
 
|-
 
|0x0008 ||char[8] ||[[03A4|name]]
 
|0x0008 ||char[8] ||[[03A4|name]]
Line 221: Line 221:
 
|0x0010 ||dword ||current instruction pointer
 
|0x0010 ||dword ||current instruction pointer
 
|-
 
|-
|0x0014 ||dword[4] ||return stack
+
|0x0014 ||dword[6] ||return stack
|-
 
|0x0024 ||dword ||unknown
 
|-
 
|0x0028 ||dword ||unknown
 
 
|-
 
|-
 
|0x002C ||word ||stack counter
 
|0x002C ||word ||stack counter
 
|-
 
|-
|0x002E ||word ||unknown
+
|0x002E ||word ||''align''
 
|-
 
|-
 
|0x0030 ||dword[16] ||16 local variables
 
|0x0030 ||dword[16] ||16 local variables
Line 284: Line 280:
 
|0x0000 ||dword ||number of players
 
|0x0000 ||dword ||number of players
 
|-
 
|-
|0x0004 ||PlayerPed[n] ||start of player structure where n is the number of players
+
|0x0004 ||Player[n] ||player structure (see below) where n is the number of players
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;" |PlayerPed ({{Hint|0x6FF|1791}} bytes):
+
|+ style="text-align: left;" |Player ({{Hint|0x6FF|1791}} bytes):
 
!Offset ||style="width: 4em;" |Type ||style="width: 40em;" |Description
 
!Offset ||style="width: 4em;" |Type ||style="width: 40em;" |Description
<!--
 
0x0000 - -
 
0x0004 - -
 
-->
 
 
|-
 
|-
|0x0006 ||dword ||index
+
|0x0000 ||dword ||ped type, always 0
 +
|-
 +
|0x0004 ||word ||ped model index
 +
|-
 +
|0x0006 ||dword ||ped pool index
 
|-
 
|-
|0x000A ||CPed ||ped structure dump (see structure below)
+
|0x000A ||CPlayerPed ||ped structure dump (see structure below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Only data that are loaded by the game are listed here. The rest of the data only get saved but do not get loaded.
+
Only data that are loaded by the game are listed here. The rest of the data get saved but do not get loaded.
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;" |CPed ({{Hint|0x6D8|1752}} bytes):
+
|+ style="text-align: left;" |CPlayerPed ({{Hint|0x6D8|1752}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 311: Line 307:
 
|0x0358 ||float ||armor
 
|0x0358 ||float ||armor
 
|-
 
|-
|0x0408 ||dword ||[[Weapon#Vice City|weapon]] group 0 number
+
|0x0408 ||dword ||[[Weapon#Vice City|weapon]] slot 0 type
 
|-
 
|-
|0x0414 ||dword ||weapon group 0 ammo
+
|0x0414 ||dword ||weapon slot 0 ammo
 
|-
 
|-
|0x0420 ||dword ||weapon group 1 number
+
|0x0420 ||dword ||weapon slot 1 type
 
|-
 
|-
|0x042C ||dword ||weapon group 1 ammo
+
|0x042C ||dword ||weapon slot 1 ammo
 
|-
 
|-
|0x0438 ||dword ||weapon group 2 number
+
|0x0438 ||dword ||weapon slot 2 type
 
|-
 
|-
|0x0444 ||dword ||weapon group 2 ammo
+
|0x0444 ||dword ||weapon slot 2 ammo
 
|-
 
|-
|0x0450 ||dword ||weapon group 3 number
+
|0x0450 ||dword ||weapon slot 3 type
 
|-
 
|-
|0x045C ||dword ||weapon group 3 ammo
+
|0x045C ||dword ||weapon slot 3 ammo
 
|-
 
|-
|0x0468 ||dword ||weapon group 4 number
+
|0x0468 ||dword ||weapon slot 4 type
 
|-
 
|-
|0x0474 ||dword ||weapon group 4 ammo
+
|0x0474 ||dword ||weapon slot 4 ammo
 
|-
 
|-
|0x0480 ||dword ||weapon group 5 number
+
|0x0480 ||dword ||weapon slot 5 type
 
|-
 
|-
|0x048C ||dword ||weapon group 5 ammo
+
|0x048C ||dword ||weapon slot 5 ammo
 
|-
 
|-
|0x0498 ||dword ||weapon group 6 number
+
|0x0498 ||dword ||weapon slot 6 type
 
|-
 
|-
|0x04A4 ||dword ||weapon group 6 ammo
+
|0x04A4 ||dword ||weapon slot 6 ammo
 
|-
 
|-
|0x04B0 ||dword ||weapon group 7 number
+
|0x04B0 ||dword ||weapon slot 7 type
 
|-
 
|-
|0x04BC ||dword ||weapon group 7 ammo
+
|0x04BC ||dword ||weapon slot 7 ammo
 
|-
 
|-
|0x04C8 ||dword ||weapon group 8 number
+
|0x04C8 ||dword ||weapon slot 8 type
 
|-
 
|-
|0x04D4 ||dword ||weapon group 8 ammo
+
|0x04D4 ||dword ||weapon slot 8 ammo
 
|-
 
|-
|0x04E0 ||dword ||weapon group 9 number
+
|0x04E0 ||dword ||weapon slot 9 type
 
|-
 
|-
|0x04EC ||dword ||weapon group 9 ammo
+
|0x04EC ||dword ||weapon slot 9 ammo
 
|-
 
|-
|0x0504 ||byte ||currently selected weapon group, always set to 0 upon loading
+
|0x0504 ||byte ||currently selected weapon slot, always set to 0 upon loading
 
|-
 
|-
 
|0x0604 ||float ||max stamina
 
|0x0604 ||float ||max stamina
Line 389: Line 385:
 
!Offset ||style="width: 6.5em;" |Type ||style="width: 37em;" |Description
 
!Offset ||style="width: 6.5em;" |Type ||style="width: 37em;" |Description
 
|-
 
|-
|0x0000 ||dword ||number of garages ([[0219]])
+
|0x0000 ||dword ||number of [[garage]]s
 
|-
 
|-
 
|0x0004 ||dword ||[[021D|free bombs]]
 
|0x0004 ||dword ||[[021D|free bombs]]
 
|-
 
|-
 
|0x0008 ||dword ||[[0335|free resprays]]
 
|0x0008 ||dword ||[[0335|free resprays]]
<!--
 
 
|-
 
|-
|0x000C ||- ||-
+
|0x000C ||dword ||number of cars collected (unused)
 
|-
 
|-
|0x0010 ||- ||-
+
|0x0010 ||dword ||number of Securicars collected (unused)
 
|-
 
|-
|0x0014 ||- ||-
+
|0x0014 ||dword ||number of Police cars collected (unused)
-->
 
 
|-
 
|-
 
|0x0018 ||dword ||cars collected by garage type 8 in [[flag field]] representation
 
|0x0018 ||dword ||cars collected by garage type 8 in [[flag field]] representation
Line 417: Line 411:
 
|0x0024 ||dword ||cars collected by garage type 22 in flag field representation
 
|0x0024 ||dword ||cars collected by garage type 22 in flag field representation
 
|-
 
|-
|0x0028 ||dword ||game timer when garage full message was last shown
+
|0x0028 ||dword ||game timer when [[Text#Garage message|garage full message]] was last shown
 +
|-
 +
|0x002C ||StoredCar[48] ||stored car structures (see below)
 
|-
 
|-
|0x002C ||style="white-space: nowrap;" |40 bytes[48] ||garage car structures (see struct below)
+
|0x07AC ||Garage[32] ||garage structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Garage car structure:
+
|+ style="text-align: left;"|StoredCar ({{Hint|0x28|40}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 447: Line 443:
 
|}
 
|}
 
</div>
 
</div>
{|class="wikitable" style="max-width: 48em;"
 
|0x07AC ||style="width: 6.5em; white-space: nowrap;" |168 bytes[32] ||style="width: 37em;" |garage structures (see struct below)
 
|}
 
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Garage structure:
+
|+ style="text-align: left;"|Garage ({{Hint|0xA8|168}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
 
|0x0000 ||byte ||type
 
|0x0000 ||byte ||type
 
|-
 
|-
|0x0001 ||byte ||door status
+
|0x0001 ||byte ||state
 
*0 = closed
 
*0 = closed
 
*1 = opened
 
*1 = opened
 
*2 = closing
 
*2 = closing
 
*3 = opening
 
*3 = opening
 +
*4 = opened with serviced car (bomb and spray shops)
 +
*5 = closed with vehicle dropped off (mission keepcar)
 
|-
 
|-
 
|0x0002 ||byte ||[[057A|maximum number of cars in garage]] (4 = default)
 
|0x0002 ||byte ||[[057A|maximum number of cars in garage]] (4 = default)
 
<!--
 
<!--
 
0x0003 byte -
 
0x0003 byte -
0x0004 byte -
+
-->
0x0005 byte -
+
|-
0x0006 - -
+
|0x0004 ||byte ||closed but nothing dropped off (mission keepcar)
0x0008 - -
+
|-
0x000C - -
+
|0x0005 ||byte ||[[02B9|is inactive]] (unused)
0x0010 - -
+
|-
 +
|0x0006 ||byte ||[[0329|has respray happened]]
 +
|-
 +
|0x0007 ||byte ||''align''
 +
|-
 +
|0x0008 ||dword ||[[02FA|target model]] (unused)
 +
|-
 +
|0x000C ||pointer ||door object
 +
|-
 +
|0x0010 ||pointer ||crusher top object (unused)
 +
<!--
 
0x0014 - -
 
0x0014 - -
 
0x0015 - -
 
0x0015 - -
Line 479: Line 484:
 
-->
 
-->
 
|-
 
|-
|0x0019 ||byte ||[[03BB|rotating garage door]]
+
|0x0019 ||byte ||[[03BB|rotating door]]
 
|-
 
|-
 
|0x001A ||byte ||[[03DA|special camera for garage]]
 
|0x001A ||byte ||[[03DA|special camera for garage]]
 
|-
 
|-
|0x001C ||float[3] ||entrance bottom left x,y,z coordinates
+
|0x001B ||byte ||''align''
 +
|-
 +
|0x001C ||float[3] ||primary x,y,z coordinates (garage opcode parameters 1, 2, 3)
 
|-
 
|-
 
|0x0028 ||float[4] ||rx,ry,rz,rw quaternion rotation
 
|0x0028 ||float[4] ||rx,ry,rz,rw quaternion rotation
 
|-
 
|-
|0x0038 ||float ||ceiling z coordinate
+
|0x0038 ||float ||ceiling z coordinate (garage opcode parameter 8)
|}
+
|-
</div>
+
|0x0044 ||float ||lower x coordinate (min of x1 + x2 - x primary, x primary, x1, or x2)
 +
|-
 +
|0x0048 ||float ||upper x coordinate (max of x1 + x2 - x primary, x primary, x1, or x2)
 +
|-
 +
|0x004C ||float ||lower y coordinate
 +
|-
 +
|0x0050 ||float ||upper y coordinate
 +
|-
 +
|0x0054 ||float ||door current height relative to base of garage
 +
|-
 +
|0x0058 ||float ||door maximum height relative to base of garage
 +
|-
 +
|0x005C ||float ||door object x position, 0 if no door
 +
|-
 +
|0x0060 ||float ||door object y position, 0 if no door
 +
|-
 +
|0x0064 ||float ||crusher top object x position (unused)
 +
|-
 +
|0x0068 ||float ||crusher top object y position (unused)
 +
|-
 +
|0x006C ||float ||door object z position
 +
|-
 +
|0x0070 ||float ||crusher top object z position (unused)
 +
|-
 +
|0x0074 ||dword ||game timer to open a closed garage
 +
|-
 +
|0x007C ||pointer ||target vehicle
 +
|}
 +
</div>
 
</div>
 
</div>
 
</div>
 
</div>
Line 513: Line 548:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||dword ||number of taxi shortcuts ([[058D]])
+
|0x0000 ||dword ||number of [[058D|taxi shortcut pick-up points for mission]]
 
|-
 
|-
|0x0004 ||style="white-space: nowrap;" |16 bytes[16] ||taxi shortcut structures (see structure below)
+
|0x0004 ||style="white-space: nowrap;" |TaxiShortcut[16] ||taxi shortcut structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Taxi shortcut structure:
+
|+ style="text-align: left;"|TaxiShortcut ({{Hint|0x10|16}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 556: Line 591:
 
|0x0008 ||dword ||number of bikes
 
|0x0008 ||dword ||number of bikes
 
|-
 
|-
|0x000C ||Vehicle[n] ||vehicle structures where n is the number of general vehicles, boats, and bikes
+
|0x000C ||Vehicle[n] ||vehicle structures (see below) where n is the number of general vehicles, boats, and bikes
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Vehicle ({{Hint|0x5E6|1510}} (general) | {{Hint|0x4CA|1226}} (boat) | {{Hint|0x4F6|1270}} (bike) bytes):
+
|+ style="text-align: left;"| Vehicle ({{Hint|0x5E6|1510}} (automobile) | {{Hint|0x4CA|1226}} (boat) | {{Hint|0x4F6|1270}} (bike) bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
 
|0x0000 ||dword ||vehicle type
 
|0x0000 ||dword ||vehicle type
*0 = general
+
*0 = automobile
 
*1 = boat
 
*1 = boat
 
*5 = bike
 
*5 = bike
 
|-
 
|-
|0x0004 ||word ||vehicle IDE model
+
|0x0004 ||word ||[[CARS (IDE Section)#Vice City|vehicle model index]]
 
|-
 
|-
|0x0006 ||dword ||vehicle index
+
|0x0006 ||dword ||vehicle pool index
 
|-
 
|-
|0x000A ||- ||vehicle structure dump (see below, dependent on vehicle type)
+
|0x000A ||CAutomobile<br>CBoat<br>CBike ||vehicle structure dump (see below, dependent on vehicle type)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
If vehicle is type general:
+
If vehicle is type automobile (any vehicles with four wheels, including pilotable helicopters):
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| General vehicle structure ({{Hint|0x5DC|1500}} bytes):
+
|+ style="text-align: left;"|CAutomobile ({{Hint|0x5DC|1500}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 588: Line 623:
 
If vehicle is type boat:
 
If vehicle is type boat:
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Boat structure ({{Hint|0x4C0|1216}} bytes):
+
|+ style="text-align: left;"|CBoat ({{Hint|0x4C0|1216}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 599: Line 634:
 
If vehicle is type bike:
 
If vehicle is type bike:
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Bike structure ({{Hint|0x4EC|1260}} bytes):
+
|+ style="text-align: left;"|CBike ({{Hint|0x4EC|1260}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 633: Line 668:
 
|0x0000 ||dword ||number of objects
 
|0x0000 ||dword ||number of objects
 
|-
 
|-
|0x0004 ||- ||88 bytes each, object structures (see struct below)
+
|0x0004 ||Object[n] ||object structures (see below) where n is the number of objects
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Object structure:
+
|+ style="text-align: left;"|Object ({{Hint|0x58|88}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||word ||object IDE number
+
|0x0000 ||word ||object [[IDE|model index]]
<!--
+
|-
0x0002 - -
+
|0x0002 ||dword ||object pool index
-->
 
 
|-
 
|-
 
|0x0006 ||float[3] ||x,y,z coordinates
 
|0x0006 ||float[3] ||x,y,z coordinates
 +
|-
 +
|0x000F ||char[6] ||compressed rotational data
 
<!--
 
<!--
 
0x001E - -
 
0x001E - -
 
0x0022 - -
 
0x0022 - -
0x003A - -
+
-->
0x003B - -
+
|-
0x003C - -
+
|0x003A ||byte ||always 2
0x003D - -
+
|-
 +
|0x003B ||byte ||is a [[pickup]]
 +
|-
 +
|0x003C ||byte ||is a pickup in shop (type 1 pickup)
 +
|-
 +
|0x003D ||byte ||is a pickup in shop out of stock (type 7 pickup)
 +
<!--
 
0x003E - -
 
0x003E - -
 
0x003F - -
 
0x003F - -
Line 696: Line 738:
 
|0x0004 ||dword ||[[03EC|cars collected by military crane]]
 
|0x0004 ||dword ||[[03EC|cars collected by military crane]]
 
|-
 
|-
|0x0008 ||style="white-space: nowrap;" |124 bytes[8] ||crane structures (see below)
+
|0x0008 ||style="white-space: nowrap;" |Crane[8] ||crane structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Crane structure:
+
|+ style="text-align: left;"|Crane ({{Hint|0x7C|124}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||dword ||index in static objects pool
+
|0x0000 ||pointer ||crane object
<!--
+
|-
0x0004 - -
+
|0x0004 ||pointer ||magnet object
-->
 
 
|-
 
|-
 
|0x0008 ||float ||pickup zone x1 ([[01EE|crane opcode]] parameter 3)
 
|0x0008 ||float ||pickup zone x1 ([[01EE|crane opcode]] parameter 3)
Line 751: Line 792:
 
-->
 
-->
 
|-
 
|-
|0x006C ||dword ||pointer to vehicle to pick up
+
|0x006C ||pointer ||vehicle to pick up
 
|-
 
|-
 
|0x0070 ||dword ||game timer + 10000 when crane has finished lifting car
 
|0x0070 ||dword ||game timer + 10000 when crane has finished lifting car
Line 808: Line 849:
 
|0x0000 ||float[3] ||x,y,z coordinates
 
|0x0000 ||float[3] ||x,y,z coordinates
 
|-
 
|-
|0x000C ||float ||current protection revenue ([[04A6]])
+
|0x000C ||float ||current [[04A6|protection]] revenue
 
|-
 
|-
 
|0x0010 ||dword ||pickup object entity
 
|0x0010 ||dword ||pickup object entity
Line 868: Line 909:
 
|0x0004 ||dword ||number of active phones
 
|0x0004 ||dword ||number of active phones
 
|-
 
|-
|0x0008 ||style="white-space: nowrap;" |52 bytes[50] ||[[024A|phone]] structures (see below)
+
|0x0008 ||Phone[50] ||[[024A|phone]] structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"|Phone structure:
+
|+ style="text-align: left;"|Phone ({{Hint|0x34|52}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 938: Line 979:
 
| 0x008
 
| 0x008
 
| float[3]
 
| float[3]
| hospital restart x,y,z coordinates ([[016C]])
+
| [[016C|hospital restart]] x,y,z coordinates
 
|-
 
|-
 
| 0x014
 
| 0x014
Line 948: Line 989:
 
| 0x088
 
| 0x088
 
| float[3]
 
| float[3]
| police restart x,y,z coordinates ([[016D]])
+
| [[016D|police restart]] x,y,z coordinates
 
|-
 
|-
 
| 0x094
 
| 0x094
Line 974: Line 1,015:
 
| 0x110
 
| 0x110
 
| float[3]
 
| float[3]
| override next restart x,y,z coordinates ([[016E]])
+
| [[016E|override next restart]] x,y,z coordinates
 
|-
 
|-
 
| 0x11C
 
| 0x11C
Line 990: Line 1,031:
 
| 0x122
 
| 0x122
 
| byte
 
| byte
| always 0, leftover from GTA III's [[041F]]
+
| [[041F|override hospital level]]
 
|-
 
|-
 
| 0x123
 
| 0x123
 
| byte
 
| byte
| always 0, leftover from GTA III's [[0420]]
+
| [[0420|override police station level]]
 
|}
 
|}
 
</div>
 
</div>
Line 1,023: Line 1,064:
 
|0x0004 ||dword ||size of rest of subblock
 
|0x0004 ||dword ||size of rest of subblock
 
|-
 
|-
|0x0008 ||style="white-space: nowrap;" |48 bytes[75] ||blip structures (see below)
+
|0x0008 ||style="white-space: nowrap;" |Blip[75] ||blip structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+style="text-align: left;"| Blip structure:
+
|+style="text-align: left;"|Blip ({{Hint|0x30|48}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
 
|0x0000 ||dword ||[[0165|blip color]]
 
|0x0000 ||dword ||[[0165|blip color]]
 
|-
 
|-
|0x0004 ||float ||unknown, always 1.0
+
|0x0004 ||float ||[[Saves_(GTA_3)#Notes|debug sphere cross offset]], unused, always 1.0
 
|-
 
|-
 
|0x0008 ||dword ||blip type
 
|0x0008 ||dword ||blip type
Line 1,108: Line 1,149:
 
|0x0470 ||Zone[169] ||type 2 (info) zone structures (see below)
 
|0x0470 ||Zone[169] ||type 2 (info) zone structures (see below)
 
|-
 
|-
|0x2968 ||style="white-space: nowrap;" |68 bytes[338] ||ped/car/gang info zone structures
+
|0x2968 ||ZoneInfo[338] ||ped/car/gang info zone structures (see below)
 
|-
 
|-
 
|0x8330 ||word ||total number of type 0 and 1 (navig) zones
 
|0x8330 ||word ||total number of type 0 and 1 (navig) zones
Line 1,128: Line 1,169:
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Zone ({{Hint|0x38|56}} bytes):
+
|+ style="text-align: left;"|Zone ({{Hint|0x38|56}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
Line 1,153: Line 1,194:
 
|}
 
|}
 
</div>
 
</div>
</div>
+
<div style="margin-left: 3em;">
</div>
 
 
 
==== Block 13: Gangs ====
 
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|ZoneInfo ({{Hint|0x44|68}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||word ||[[0152|in car ped density]]
| dword
+
|-
| size of block 13
+
|0x0002 ||word ||[[04EC|car class 0 density]]
 +
|-
 +
|0x0004 ||word ||car class 0 and 1 density
 
|-
 
|-
| 0x04
+
|0x0006 ||word ||car class 0, 1, and 2 density
| -
 
| start of block 13, data below
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x00
+
|0x0008 ||word ||car class 0, 1, 2, and 3 density
| dword
 
| size of subblock (constant 0xE0)
 
 
|-
 
|-
| 0x04
+
|0x000A ||word ||car class 0, 1, 2, 3, and 4 density
| -
 
| start of subblock, data below
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x00
+
|0x000C ||word ||car class 0, 1, 2, 3, 4, and 5 density
| char[4]
 
| <code>GNG\0</code>
 
 
|-
 
|-
| 0x04
+
|0x000E ||word ||car class 0, 1, 2, 3, 4, 5, and 6 density
| dword
 
| total size of gang structures
 
 
|-
 
|-
| 0x08
+
|0x0010 ||word ||car class 0, 1, 2, 3, 4, 5, 6, and 7 density
| style="white-space: nowrap;" |24 bytes[9]
 
| gang structures (see below)
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
|+ style="text-align: left;"| Gang structure:
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x00
+
|0x0012 ||word ||car class 0, 1, 2, 3, 4, 5, 6, 7, and 8 density
| dword
 
| car model ([[0236]])
 
 
|-
 
|-
| 0x04
+
|0x0014 ||word ||car class 9 density
| dword
 
| ped model 1
 
 
|-
 
|-
| 0x08
+
|0x0016 ||word ||car class 9 and 10 density
| dword
 
| ped model 2
 
<!--
 
0x0C - -
 
-->
 
 
|-
 
|-
| 0x10
+
|0x0018 ||word ||in car cop + gang 0 density
| dword
 
| weapon number 1 ([[0237]])
 
 
|-
 
|-
| 0x14
+
|0x001A ||word ||in car cop + gang 0 and 1 density
| dword
 
| weapon number 2
 
|}
 
</div>
 
</div>
 
</div>
 
 
 
==== Block 14: Car Generators ====
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||size of block 14
+
|0x001C ||word ||in car cop + gang 0, 1, and 2 density
 
|-
 
|-
|0x0004 ||- ||start of block 14, data below
+
|0x001E ||word ||in car cop + gang 0, 1, 2, and 3 density
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||size of subblock (constant 0x1FE8)
+
|0x0020 ||word ||in car cop + gang 0, 1, 2, 3, and 4 density
 
|-
 
|-
|0x0004 ||- ||start of subblock, data below
+
|0x0022 ||word ||in car cop + gang 0, 1, 2, 3, 4, and 5 density
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|0x0000 ||char[4] ||<code>CGN\0</code>
 
 
|-
 
|-
|0x0004 ||dword ||size of rest of subblock
+
|0x0024 ||word ||in car cop + gang 0, 1, 2, 3, 4, 5, and 6 density
 
|-
 
|-
|0x0008 ||dword ||size of subdata before car generator structures (constant 0xC)
+
|0x0026 ||word ||in car cop + gang 0, 1, 2, 3, 4, 5, 6, and 7 density
 
|-
 
|-
|0x000C ||dword ||total number of [[014B|car generators]]
+
|0x0028 ||word ||in car cop + gang 0, 1, 2, 3, 4, 5, 6, 7, and 8 density
 
|-
 
|-
|0x0010 ||dword ||total number of [[014C|active car generators]]
+
|0x002A ||word ||in car cop density
 
|-
 
|-
|0x0014 ||byte ||process counter
+
|0x002C ||word ||[[015C|on foot ped density]]
 
|-
 
|-
|0x0015 ||byte ||generate even if player is close counter
+
|0x002E ||word ||on foot cop + gang 0 density
 
|-
 
|-
|0x0016 ||byte[2] ||''align''
+
|0x0030 ||word ||on foot cop + gang 0 and 1 density
 
|-
 
|-
|0x0018 ||dword ||size of rest of subblock (constant 0x1FCC)
+
|0x0032 ||word ||on foot cop + gang 0, 1, and 2 density
 
|-
 
|-
|0x001C ||CarGenerator[185] ||car generator structures (see below)
+
|0x0034 ||word ||on foot cop + gang 0, 1, 2, and 3 density
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
|+ style="text-align: left;"| CarGenerator ({{Hint|0x2C|44}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||vehicle IDE model
+
|0x0036 ||word ||on foot cop + gang 0, 1, 2, 3, and 4 density
 
|-
 
|-
|0x0004 ||float[3] ||x,y,z coordinates
+
|0x0038 ||word ||on foot cop + gang 0, 1, 2, 3, 4, and 5 density
 
|-
 
|-
|0x0010 ||float ||heading
+
|0x003A ||word ||on foot cop + gang 0, 1, 2, 3, 4, 5, and 6 density
 
|-
 
|-
|0x0014 ||word ||primary color
+
|0x003C ||word ||on foot cop + gang 0, 1, 2, 3, 4, 5, 6, and 7 density
 
|-
 
|-
|0x0016 ||word ||secondary color
+
|0x003E ||word ||on foot cop + gang 0, 1, 2, 3, 4, 5, 6, 7, and 8 density
 
|-
 
|-
|0x0018 ||byte ||force spawn
+
|0x0040 ||word ||on foot cop density
 
|-
 
|-
|0x0019 ||byte ||alarm
+
|0x0042 ||word ||[[0324|ped group]]
|-
+
|}
|0x001A ||byte ||lock
+
</div>
|-
 
|0x001B ||byte ||''align''
 
|-
 
|0x001C ||word ||min delay
 
|-
 
|0x001E ||word ||max delay
 
|-
 
|0x0020 ||dword ||game timer when car is generated, game timer + 60000 when car is stolen
 
|-
 
|0x0024 ||dword ||vehicle index, -1 if not spawned or is stolen
 
|-
 
|0x0028 ||word ||[[014C]], 101 = -1
 
|-
 
|0x002A ||byte ||has recently been stolen
 
|-
 
|0x002B ||byte ||''align''
 
|}
 
</div>
 
 
</div>
 
</div>
 
</div>
 
</div>
  
==== Block 15: Particles ====
+
==== Block 13: Gangs ====
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||dword ||size of block 13
| dword
 
| size of block 15
 
 
|-
 
|-
| 0x04
+
|0x0004 ||- ||start of block 13, data below
| -
 
| start of block 15, data below
 
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 1,325: Line 1,283:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||dword ||size of subblock (constant 0xE0)
| dword
+
|-
| size of subblock
+
|0x0004 ||- ||start of subblock, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 +
|-
 +
|0x0000 ||char[4] ||<code>GNG\0</code>
 
|-
 
|-
| 0x04
+
|0x0004 ||dword ||size of rest of subblock
| dword
 
| number of particle objects
 
 
|-
 
|-
| 0x08
+
|0x0008 ||GangInfo[9] ||[[gang]] structures (see below)
| style="white-space: nowrap;" |132 bytes[n]
 
| particle structures (see below)
 
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|GangInfo ({{Hint|0x18|24}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x30
+
|0x0000 ||dword ||[[0236|gang car model]]
| float[3]
+
|-
| x,y,z coordinates
+
|0x0004 ||dword ||[[0235|gang ped model]] 1
 
|-
 
|-
| 0x58
+
|0x0008 ||dword ||gang ped model 2
| dword
 
| particle type
 
 
|-
 
|-
| 0x5C
+
|0x000C ||byte ||gang ped model preference
| dword
 
| particle type
 
 
|-
 
|-
| 0x60
+
|0x000D ||byte[3] ||''align''
| byte
 
| visibility
 
|-
 
| 0x61
 
| byte
 
| sparsity
 
|-
 
| 0x62
 
| word
 
| sparsity counter
 
 
|-
 
|-
| 0x68
+
|0x0010 ||dword ||[[0237|gang weapon]] type 1
| float[3]
 
| x,y,z strength
 
 
|-
 
|-
| 0x78
+
|0x0014 ||dword ||gang weapon type 2
| float
 
| scale
 
 
|}
 
|}
 +
</div>
 
</div>
 
</div>
 
</div>
 
</div>
  
==== Block 16: Audio Script Objects ====
+
==== Block 14: Car Generators ====
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||dword ||size of block 14
| dword
 
| size of block 16
 
 
|-
 
|-
| 0x04
+
|0x0004 ||- ||start of block 14, data below
| -
 
| start of block 16, data below
 
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 1,392: Line 1,332:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||dword ||size of subblock (constant 0x1FE8)
| dword
+
|-
| size of subblock
+
|0x0004 ||- ||start of subblock, data below
|-
 
| 0x04
 
| -
 
| start of subblock, data below
 
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 1,404: Line 1,340:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||char[4] ||<code>CGN\0</code>
| char[4]
 
| <code>AUD\0</code>
 
 
|-
 
|-
| 0x04
+
|0x0004 ||dword ||size of rest of subblock
| dword
 
| size of rest of subblock
 
 
|-
 
|-
| 0x08
+
|0x0008 ||dword ||size of subdata before car generator structures (constant 0xC)
| dword
 
| number of audio objects (n)
 
 
|-
 
|-
| 0x12
+
|0x000C ||dword ||total number of [[014B|car generators]]
| style="white-space: nowrap;" |24 bytes[n]
 
| audio structures (see below)
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
|+ style="text-align: left;"| Audio structure:
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x04
+
|0x0010 ||dword ||total number of [[014C|active car generators]]
| word
 
| [[018D#Vice City|audio index]]
 
<!--
 
0x06 - -
 
-->
 
 
|-
 
|-
| 0x08
+
|0x0014 ||byte ||process counter
| float[3]
 
| x,y,z coordinates
 
<!--
 
0x14 - -
 
-->
 
|}
 
</div>
 
</div>
 
</div>
 
 
 
==== Block 17: Script Paths ====
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||size of block 17
+
|0x0015 ||byte ||generate even if player is close counter
 
|-
 
|-
|0x0004 ||- ||start of block 17, data below
+
|0x0016 ||byte[2] ||''align''
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||size of subblock
+
|0x0018 ||dword ||size of rest of subblock (constant 0x1FCC)
 
|-
 
|-
|0x0004 ||- ||start of subblock, data below
+
|0x001C ||CarGenerator[185] ||car generator structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|CarGenerator ({{Hint|0x2C|44}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||dword ||total number of nodes on [[Script Path|script path]]
+
|0x0000 ||dword ||vehicle IDE model
<!--
 
0x0004 - -
 
-->
 
 
|-
 
|-
|0x0008 ||float ||total distance of path
+
|0x0004 ||float[3] ||x,y,z coordinates
 
|-
 
|-
|0x000C ||float ||[[049E|path speed]]
+
|0x0010 ||float ||heading
 
|-
 
|-
|0x0010 ||float ||[[049F|distance along path]]
+
|0x0014 ||word ||primary color
 
|-
 
|-
|0x0014 ||float ||some sort of offset
+
|0x0016 ||word ||secondary color
<!--
 
0x0018 - -
 
-->
 
 
|-
 
|-
|0x001C ||- ||object handle, up to 6 supported
+
|0x0018 ||byte ||force spawn
|}
 
</div>
 
</div>
 
 
 
==== Block 18: Player Info ====
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||size of block 18 (constant 0x170)
+
|0x0019 ||byte ||alarm
 
|-
 
|-
|0x0004 ||- ||start of block 18, data below
+
|0x001A ||byte ||lock
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||size of subblock
+
|0x001B ||byte ||''align''
 
|-
 
|-
|0x0004 ||- ||start of subblock, data below
+
|0x001C ||word ||min delay
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
|0x0000 ||dword ||current money
+
|0x001E ||word ||max delay
 
|-
 
|-
|0x0004 ||byte ||wasted/busted status
+
|0x0020 ||dword ||game timer when car is generated, game timer + 60000 when car is stolen
<!--
 
0x0005 - -
 
0x0009 - -
 
0x000B - -
 
-->
 
 
|-
 
|-
|0x000F ||dword ||currently displayed money
+
|0x0024 ||dword ||vehicle index, -1 if not spawned or is stolen
 
|-
 
|-
|0x0013 ||dword ||number of packages picked up
+
|0x0028 ||word ||[[014C|switch car generator]], -1 = always spawn, 0 = never spawn
 
|-
 
|-
|0x0017 ||dword ||total number of packages ([[02ED]])
+
|0x002A ||byte ||has recently been stolen
 
|-
 
|-
|0x001B ||byte ||[[0330|never gets tired]]
+
|0x002B ||byte ||''align''
|-
+
|}
|0x001C ||byte ||fast reload ([[0331]])
+
</div>
|-
+
</div>
|0x001D ||byte ||fireproof ([[055D]])
+
</div>
|-
 
|0x001E ||byte ||max health
 
|-
 
|0x001F ||byte ||max armor
 
|-
 
|0x0020 ||byte ||[[0413|get out of jail free]]
 
|-
 
|0x0021 ||byte ||[[0414|free health care]]
 
|-
 
|0x0022 ||byte ||[[0501|can do drive by]]
 
<!--
 
0x0023 - -
 
0x0069 - -
 
0x006A - -
 
-->
 
|}
 
</div>
 
</div>
 
  
==== Block 19: Stats ====
+
==== Block 15: Particles ====
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
Line 1,549: Line 1,407:
 
| 0x00
 
| 0x00
 
| dword
 
| dword
| size of block 19
+
| size of block 15
 
|-
 
|-
 
| 0x04
 
| 0x04
 
| -
 
| -
| start of block 19, data below
+
| start of block 15, data below
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 1,564: Line 1,422:
 
|-
 
|-
 
| 0x04
 
| 0x04
| -
+
| dword
| start of subblock, data below
+
| number of particle objects
 +
|-
 +
| 0x08
 +
| style="white-space: nowrap;" |132 bytes[n]
 +
| particle structures (see below)
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 1,571: Line 1,433:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0000 ||dword ||people wasted by player
+
| 0x30
 +
| float[3]
 +
| x,y,z coordinates
 
|-
 
|-
|0x0004 ||dword ||people wasted by others
+
| 0x58
 +
| dword
 +
| particle type
 
|-
 
|-
|0x0008 ||dword ||road vehicles destroyed
+
| 0x5C
 +
| dword
 +
| particle type
 
|-
 
|-
|0x000C ||dword ||boats destroyed
+
| 0x60
 +
| byte
 +
| visibility
 
|-
 
|-
|0x0010 ||dword ||tires popped with gunfire
+
| 0x61
 +
| byte
 +
| sparsity
 
|-
 
|-
|0x0014 ||dword ||bullets fired
+
| 0x62
 +
| word
 +
| sparsity counter
 
|-
 
|-
|0x0018 ||dword[23] ||peds of [[ped type]] wasted
+
| 0x68
 +
| float[3]
 +
| x,y,z strength
 
|-
 
|-
|0x0074 ||dword ||planes and helicopters destroyed
+
| 0x78
 +
| float
 +
| scale
 +
|}
 +
</div>
 +
</div>
 +
 
 +
==== Block 16: Audio Script Objects ====
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0078 ||float ||[[030C|current progress]]
+
|0x0000 ||dword ||size of block 16
 
|-
 
|-
|0x007C ||float ||[[030D|total progress]]
+
|0x0004 ||- ||start of block 16, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0080 ||dword ||kilograms of explosives used
+
|0x0000 ||dword ||size of subblock
 
|-
 
|-
|0x0084 ||dword ||bullets that hit
+
|0x0004 ||- ||start of subblock, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0088 ||dword ||number of headshots
+
|0x0000 ||char[4] ||<code>AUD\0</code>
 
|-
 
|-
|0x008C ||dword ||total number of wanted stars attained
+
|0x0004 ||dword ||size of rest of subblock
 
|-
 
|-
|0x0090 ||dword ||total number of wanted stars evaded
+
|0x0008 ||dword ||number of [[018D#Vice City|audio script objects]]
 
|-
 
|-
|0x0094 ||dword ||times busted
+
|0x0012 ||AudioScriptObject[n] ||audio script object structures (see below) where n is the number of audio script objects
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|AudioScriptObject ({{Hint|0x18|24}} bytes):
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0098 ||dword ||hospital visits
+
|0x0000 ||dword ||audio pool index
 
|-
 
|-
|0x009C ||dword ||days passed in game
+
|0x0004 ||word ||sound index
 
|-
 
|-
|0x00A0 ||dword ||safehouse visits
+
|0x0006 ||word ||''align''
 
|-
 
|-
|0x00A4 ||dword ||sprayings
+
|0x0008 ||float[3] ||x,y,z coordinates
 
|-
 
|-
|0x00A8 ||float ||[[030E|max insane jump distance]]
+
|0x0014 ||dword ||audio entity
 +
|}
 +
</div>
 +
</div>
 +
</div>
 +
 
 +
==== Block 17: Script Paths ====
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x00AC ||float ||[[030F|max insane jump height]]
+
|0x0000 ||dword ||size of block 17
 
|-
 
|-
|0x00B0 ||dword ||[[0310|max insane jump flips]]
+
|0x0004 ||- ||start of block 17, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x00B4 ||dword ||[[0311|max insane jump rotation]]
+
|0x0000 ||dword ||size of subblock
 
|-
 
|-
|0x00B8 ||dword ||[[0312|best insane stunt so far]]
+
|0x0004 ||ScriptPath[3] ||[[Script Path|script path]] structures (see below)
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|ScriptPath:
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x00BC ||dword ||[[0313|unique jumps completed]]
+
|0x0000 ||dword ||total number of nodes on path
 
|-
 
|-
|0x00C0 ||dword ||[[0314|total unique jumps]]
+
|0x0004 ||dword ||pointer to path nodes data
 
|-
 
|-
|0x00C4 ||dword ||[[0317|mission attempts]]
+
|0x0008 ||float ||total distance of path
 
|-
 
|-
|0x00C8 ||dword ||[[0315|passengers dropped off]]
+
|0x000C ||float ||[[049E|path speed]]
 
|-
 
|-
|0x00CC ||dword ||[[0316|cash made in taxi]]
+
|0x0010 ||float ||[[049F|distance along path]]
 
|-
 
|-
|0x00D0 ||dword ||unused stat
+
|0x0014 ||float ||width
 
|-
 
|-
|0x00D4 ||dword ||unused stat
+
|0x0018 ||dword ||state
 
|-
 
|-
|0x00D8 ||dword ||unused stat
+
|0x001C ||dword[6] ||object handles
 
|-
 
|-
|0x00DC ||dword ||[[055A|porn leaflet rubbish visibility]]
+
|0x0034 ||Node[n] ||path nodes data (see below) where n is the number of nodes
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|Node ({{Hint|0x14|20}} bytes):
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x00E0 ||dword ||[[057C|allows hurricane weather]]
+
|0x0000 ||float[3] ||coordinate point
 
|-
 
|-
|0x00E4 ||float ||distance traveled on foot
+
|0x000C ||float ||distance along path to coordinate point
|-
+
<!--
|0x00E8 ||float ||distance traveled by car
+
0x0010 - -
|-
+
-->
|0x00EC ||float ||distance traveled by bike
+
|}
 +
</div>
 +
</div>
 +
</div>
 +
 
 +
==== Block 18: Player Info ====
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x00F0 ||float ||distance traveled by boat
+
|0x0000 ||dword ||size of block 18 (constant 0x170)
 
|-
 
|-
|0x00F4 ||float ||distance traveled by golf cart
+
|0x0004 ||- ||start of block 18, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x00F8 ||float ||distance traveled by helicopter
+
|0x0000 ||dword ||size of subblock
 
|-
 
|-
|0x00FC ||float ||distance traveled by plane
+
|0x0004 ||- ||start of subblock, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0100 ||dword ||[[0401|people saved in an ambulance]]
+
|0x0000 ||dword ||current money
 
|-
 
|-
|0x0104 ||dword ||[[0402|criminals killed on vigilante mission]]
+
|0x0004 ||byte ||wasted/busted status
 +
<!--
 +
0x0005 - -
 +
0x0009 - -
 +
0x000B - -
 +
-->
 
|-
 
|-
|0x0108 ||dword ||[[0404|total fires extinguished]]
+
|0x000F ||dword ||currently displayed money
 
|-
 
|-
|0x010C ||dword ||[[0578|highest vigilante mission level]]
+
|0x0013 ||dword ||number of packages picked up
 
|-
 
|-
|0x0110 ||dword ||[[0403|highest paramedic mission level]]
+
|0x0017 ||dword ||[[02ED|total number of packages]]
 
|-
 
|-
|0x0114 ||dword ||[[0599|fire truck mission level]]
+
|0x001B ||byte ||[[0330|never gets tired]]
 
|-
 
|-
|0x0118 ||dword ||photographs taken
+
|0x001C ||byte ||[[0331|fast reload]]
 
|-
 
|-
|0x011C ||dword ||rampages passed
+
|0x001D ||byte ||[[055D|fire proof]]
 
|-
 
|-
|0x0120 ||dword ||[[0408|total number of rampages]]
+
|0x001E ||byte ||max health
 
|-
 
|-
|0x0124 ||dword ||[[042C|total number of missions]]
+
|0x001F ||byte ||max armor
 
|-
 
|-
|0x0128 ||dword ||flight hours
+
|0x0020 ||byte ||[[0413|get out of jail free]]
 
|-
 
|-
|0x012C ||dword ||fishes fed (number of times drowned)
+
|0x0021 ||byte ||[[0414|free health care]]
 
|-
 
|-
|0x0130 ||dword ||seagulls sniped
+
|0x0022 ||byte ||[[0501|can do drive by]]
 +
<!--
 +
0x0023 - -
 +
-->
 
|-
 
|-
|0x0134 ||float ||[[0528|weapon budget]]
+
|0x0069 ||byte ||Rosenberg's audio status
 +
<!--
 +
0x006A - -
 +
-->
 +
|}
 +
</div>
 +
</div>
 +
 
 +
==== Block 19: Stats ====
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0138 ||float ||[[04CF|fashion budget]]
+
|0x0000 ||dword ||size of block 19
 
|-
 
|-
|0x013C ||float ||visits from loan sharks (unused)
+
|0x0004 ||- ||start of block 19, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0140 ||float ||[[0531|stores knocked off]]
+
|0x0000 ||dword ||size of subblock
 
|-
 
|-
|0x0144 ||float ||movie stunts (unused)
+
|0x0004 ||- ||start of subblock, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
|0x0148 ||float ||[[0533|assassination contracts completed]]
+
|0x0000 ||dword ||people wasted by player
 
|-
 
|-
|0x014C ||float ||[[0534|pizzas delivered]]
+
|0x0004 ||dword ||people wasted by others
 
|-
 
|-
|0x0150 ||float ||garbage pickups made (unused)
+
|0x0008 ||dword ||road vehicles destroyed
 
|-
 
|-
|0x0154 ||float ||[[0536|'ice cream' sold]]
+
|0x000C ||dword ||boats destroyed
 
|-
 
|-
|0x0158 ||float ||top shooting range score (unused, see 0x01FF)
+
|0x0010 ||dword ||tires popped with gunfire
 
|-
 
|-
|0x015C ||float ||shooting range rank (unused, see 0x01FF)
+
|0x0014 ||dword ||bullets fired
 
|-
 
|-
|0x0160 ||dword ||longest wheelie time
+
|0x0018 ||dword[23] ||peds of [[ped type]] wasted
 
|-
 
|-
|0x0164 ||dword ||longest stoppie time
+
|0x0074 ||dword ||planes and helicopters destroyed
 
|-
 
|-
|0x0168 ||dword ||longest two wheels time
+
|0x0078 ||float ||[[030C|current progress]]
 
|-
 
|-
|0x016C ||dword ||longest wheelie distance
+
|0x007C ||float ||[[030D|total progress]]
 
|-
 
|-
|0x0170 ||dword ||longest stoppie distance
+
|0x0080 ||dword ||kilograms of explosives used
 
|-
 
|-
|0x0174 ||dword ||longest two wheels distance
+
|0x0084 ||dword ||bullets that hit
 
|-
 
|-
|0x0178 ||dword ||[[0529|property budget]]
+
|0x0088 ||dword ||number of headshots
 
|-
 
|-
|0x017C ||dword ||auto repair and painting budget
+
|0x008C ||dword ||total number of wanted stars attained
 
|-
 
|-
|0x0180 ||dword ||property destroyed
+
|0x0090 ||dword ||total number of wanted stars evaded
 
|-
 
|-
|0x0184 ||dword ||[[0542|number of properties owned]]
+
|0x0094 ||dword ||times busted
 
|-
 
|-
|0x0188 ||dword ||[[0543|bloodring kills]]
+
|0x0098 ||dword ||hospital visits
 
|-
 
|-
|0x018C ||dword ||[[0544|longest time in bloodring]]
+
|0x009C ||dword ||days passed in game
 
|-
 
|-
|0x0190 ||byte[15] ||[[0542|properties owned]]
+
|0x00A0 ||dword ||safehouse visits
 
|-
 
|-
|0x019F ||dword ||highest media attention
+
|0x00A4 ||dword ||sprayings
 
|-
 
|-
|0x01A3 ||dword[23] ||[[042E|best times for races/vehicle missions in seconds]]
+
|0x00A8 ||float ||[[030E|max insane jump distance]]
 
|-
 
|-
|0x01FF ||dword[5] ||[[042F|minigame records]]
+
|0x00AC ||float ||[[030F|max insane jump height]]
*0 - Highest score for Shooter
 
*1 - Best Percentage of hits for Shooter
 
*2 - Number of drug deals made
 
*3 - Highest score with Keepie-Uppy beach ball
 
*4 - Unused
 
 
|-
 
|-
|0x0213 ||dword ||[[0582|hotring best result]]
+
|0x00B0 ||dword ||[[0310|max insane jump flips]]
 
|-
 
|-
|0x0217 ||dword ||peds killed recently (always zero while saving)
+
|0x00B4 ||dword ||[[0311|max insane jump rotation]]
 
|-
 
|-
|0x021B ||dword ||total peds killed (used for calculating rating)
+
|0x00B8 ||dword ||[[0312|best insane stunt so far]]
 
|-
 
|-
|0x021F ||char[8] ||[[0318|last passed mission]] GXT entry name
+
|0x00BC ||dword ||[[0313|unique jumps completed]]
 
|-
 
|-
|0x0227 ||dword ||cheat rating
+
|0x00C0 ||dword ||[[0314|total unique jumps]]
 
|-
 
|-
|0x022B ||float[10] ||listening time per [[List of radio stations (VC)|radio station]] in milliseconds
+
|0x00C4 ||dword ||[[0317|mission attempts]]
|}
+
|-
</div>
+
|0x00C8 ||dword ||[[0315|passengers dropped off]]
</div>
 
 
 
==== Block 20: Set Pieces ====
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x00
+
|0x00CC ||dword ||[[0316|cash made in taxi]]
| dword
 
| size of block 20
 
 
|-
 
|-
| 0x04
+
|0x00D0 ||dword ||Portland passed (unused)
| -
 
| start of block 20, data below
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x00
+
|0x00D4 ||dword ||Staunton passed (unused)
| dword
 
| size of subblock
 
 
|-
 
|-
| 0x04
+
|0x00D8 ||dword ||Shoreside passed (unused)
| -
 
| start of subblock, data below
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
 
|-
 
|-
| 0x00
+
|0x00DC ||dword ||[[055A|porn leaflet rubbish visibility]]
| dword
+
|-
| number of trigger zones ([[04F8]])
+
|0x00E0 ||dword ||[[057C|allows hurricane weather]]
|-
+
|-
| 0x04
+
|0x00E4 ||float ||distance traveled on foot
| [96]
+
|-
| 56 bytes each, trigger zone structures (see below)
+
|0x00E8 ||float ||distance traveled by car
|}
+
|-
<div style="margin-left: 3em;">
+
|0x00EC ||float ||distance traveled by bike
{|class="wikitable" style="max-width: 48em;"
+
|-
|+ style="text-align: left;"| Trigger zone structure:
+
|0x00F0 ||float ||distance traveled by boat
!Offset ||Type ||style="width: 100%;" |Description
+
|-
|-
+
|0x00F4 ||float ||distance traveled by golf cart
| 0x00
+
|-
| dword
+
|0x00F8 ||float ||distance traveled by helicopter
| type
+
|-
|-
+
|0x00FC ||float ||distance traveled by plane
| 0x08
+
|-
| float
+
|0x0100 ||dword ||[[0401|people saved in an ambulance]]
| timer
+
|-
|-
+
|0x0104 ||dword ||[[0402|criminals killed on vigilante mission]]
| 0x08
+
|-
| float
+
|0x0108 ||dword ||[[0404|total fires extinguished]]
| trigger area x1
+
|-
|-
+
|0x010C ||dword ||[[0578|highest vigilante mission level]]
| 0x0C
+
|-
| float
+
|0x0110 ||dword ||[[0403|highest paramedic mission level]]
| trigger area y2
+
|-
|-
+
|0x0114 ||dword ||[[0599|fire truck mission level]]
| 0x10
+
|-
| float
+
|0x0118 ||dword ||photographs taken
| trigger area x2
+
|-
|-
+
|0x011C ||dword ||rampages passed
| 0x14
+
|-
| float
+
|0x0120 ||dword ||[[0408|total number of rampages]]
| trigger area y1
+
|-
|-
+
|0x0124 ||dword ||[[042C|total number of missions]]
| 0x18
+
|-
| float[2]
+
|0x0128 ||dword ||flight hours
| policeA spawn x,y
+
|-
|-
+
|0x012C ||dword ||fishes fed (number of times drowned)
| 0x20
+
|-
| float[2]
+
|0x0130 ||dword ||seagulls sniped
| policeB spawn x,y
+
|-
|-
+
|0x0134 ||float ||[[0528|weapon budget]]
| 0x28
+
|-
| float[2]
+
|0x0138 ||float ||[[04CF|fashion budget]]
| policeA heading x,y
+
|-
|-
+
|0x013C ||float ||visits from loan sharks (unused)
| 0x30
+
|-
| float[2]
+
|0x0140 ||float ||[[0531|stores knocked off]]
| policeB heading x,y
+
|-
|}
+
|0x0144 ||float ||movie stunts (unused)
</div>
+
|-
</div>
+
|0x0148 ||float ||[[0533|assassination contracts completed]]
</div>
+
|-
 
+
|0x014C ||float ||[[0534|pizzas delivered]]
 +
|-
 +
|0x0150 ||float ||garbage pickups made (unused)
 +
|-
 +
|0x0154 ||float ||[[0536|'ice cream' sold]]
 +
|-
 +
|0x0158 ||float ||top shooting range score (unused, see 0x01FF)
 +
|-
 +
|0x015C ||float ||shooting range rank (unused, see 0x01FF)
 +
|-
 +
|0x0160 ||dword ||longest wheelie time
 +
|-
 +
|0x0164 ||dword ||longest stoppie time
 +
|-
 +
|0x0168 ||dword ||longest two wheels time
 +
|-
 +
|0x016C ||dword ||longest wheelie distance
 +
|-
 +
|0x0170 ||dword ||longest stoppie distance
 +
|-
 +
|0x0174 ||dword ||longest two wheels distance
 +
|-
 +
|0x0178 ||dword ||[[0529|property budget]]
 +
|-
 +
|0x017C ||dword ||auto repair and painting budget
 +
|-
 +
|0x0180 ||dword ||property destroyed
 +
|-
 +
|0x0184 ||dword ||[[0542|number of properties owned]]
 +
|-
 +
|0x0188 ||dword ||[[0543|bloodring kills]]
 +
|-
 +
|0x018C ||dword ||[[0544|longest time in bloodring]]
 +
|-
 +
|0x0190 ||byte[15] ||[[0542|properties owned]]
 +
|-
 +
|0x019F ||dword ||highest media attention
 +
|-
 +
|0x01A3 ||dword[23] ||[[042E|best times for races/vehicle missions in seconds]]
 +
|-
 +
|0x01FF ||dword[5] ||[[042F|minigame records]]
 +
*0 - Highest score for Shooter
 +
*1 - Best Percentage of hits for Shooter
 +
*2 - Number of drug deals made
 +
*3 - Highest score with Keepie-Uppy beach ball
 +
*4 - Unused
 +
|-
 +
|0x0213 ||dword ||[[0582|hotring best result]]
 +
|-
 +
|0x0217 ||dword ||peds killed recently (always zero while saving)
 +
|-
 +
|0x021B ||dword ||total peds killed (used for calculating rating)
 +
|-
 +
|0x021F ||char[8] ||[[0318|last passed mission]] GXT key
 +
|-
 +
|0x0227 ||dword ||cheat rating
 +
|-
 +
|0x022B ||float[10] ||listening time per [[List of radio stations (VC)|radio station]] in milliseconds
 +
|}
 +
</div>
 +
</div>
 +
 
 +
==== Block 20: Set Pieces ====
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 +
|-
 +
|0x0000 ||dword ||size of block 20
 +
|-
 +
|0x0004 ||- ||start of block 20, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 +
|-
 +
|0x0000 ||dword ||size of subblock
 +
|-
 +
|0x0004 ||- ||start of subblock, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 +
|-
 +
|0x0000 ||dword ||number of [[04F8|set pieces]]
 +
|-
 +
|0x0004 ||SetPiece[96] ||set piece structures (see below)
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
|+ style="text-align: left;"|SetPiece ({{Hint|0x38|56}} bytes):
 +
!Offset ||Type ||style="width: 100%;" |Description
 +
|-
 +
|0x0000 ||dword ||type
 +
|-
 +
|0x0008 ||float ||timer
 +
|-
 +
|0x0008 ||float ||trigger area x1
 +
|-
 +
|0x000C ||float ||trigger area y2
 +
|-
 +
|0x0010 ||float ||trigger area x2
 +
|-
 +
|0x0014 ||float ||trigger area y1
 +
|-
 +
|0x0018 ||float[2] ||policeA spawn x,y
 +
|-
 +
|0x0020 ||float[2] ||policeB spawn x,y
 +
|-
 +
|0x0028 ||float[2] ||policeA heading x,y
 +
|-
 +
|0x0030 ||float[2] ||policeB heading x,y
 +
|}
 +
</div>
 +
</div>
 +
</div>
 +
 
 
==== Block 21: Streaming ====
 
==== Block 21: Streaming ====
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
Line 1,869: Line 1,918:
 
|-
 
|-
 
| 0x00
 
| 0x00
|style="white-space: nowrap;" |20 bytes[15]
+
|style="white-space: nowrap;" |300 bytes
| streaming structures
+
| streaming flags for first 300 model indices (0-299) (-1 if model is not loaded)
 
|}
 
|}
 
</div>
 
</div>
Line 1,879: Line 1,928:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||dword ||size of block 22
| dword
+
|-
| size of block 22
+
|0x0004 ||- ||start of block 22, data below
 +
|}
 +
<div style="margin-left: 3em;">
 +
{|class="wikitable" style="max-width: 48em;"
 +
!Offset ||Type ||style="width: 100%;" |Description
 +
|-
 +
|0x0000 ||dword ||size of subblock (constant 0x2E8)
 
|-
 
|-
| 0x04
+
|0x0004 ||- ||start of subblock, data below
| -
 
| start of block 22, data below
 
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
Line 1,891: Line 1,944:
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||char[4] ||<code>PTP\0</code>
| dword
+
|-
| size of subblock (constant 0x2E8)
+
|0x0004 ||dword ||size of rest of subblock
|-
 
| 0x04
 
| -
 
| start of subblock, data below
 
|}
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
| 0x00
 
| char[4]
 
| <code>PTP\0</code>
 
|-
 
| 0x04
 
| dword
 
| total size of pedtype structures
 
 
|-
 
|-
| 0x08
+
|0x0008 ||PedType[23] ||ped type structures (see below)
| style="white-space: nowrap;" |32 bytes[23]
 
| pedtype structures (see below)
 
 
|}
 
|}
 
<div style="margin-left: 3em;">
 
<div style="margin-left: 3em;">
 
{|class="wikitable" style="max-width: 48em;"
 
{|class="wikitable" style="max-width: 48em;"
|+ style="text-align: left;"| Pedtype structure:
+
|+ style="text-align: left;"|PedType ({{Hint|0x20|32}} bytes):
 
!Offset ||Type ||style="width: 100%;" |Description
 
!Offset ||Type ||style="width: 100%;" |Description
 
|-
 
|-
| 0x00
+
|0x0000 ||dword ||bitstring (each associated to an entry in ped.dat)
| dword
 
| bitstring (each associated to an entry in ped.dat)
 
 
|-
 
|-
| 0x04
+
|0x0004 ||float ||first value/50.0
| float
 
| first value/50.0
 
 
|-
 
|-
| 0x08
+
|0x0008 ||float ||second value/50.0
| float
 
| second value/50.0
 
 
|-
 
|-
| 0x0C
+
|0x000C ||float ||third value/50.0
| float
 
| third value/50.0
 
 
|-
 
|-
| 0x10
+
|0x0010 ||float ||fourth value
| float
 
| fourth value
 
 
|-
 
|-
| 0x14
+
|0x0014 ||float ||fifth value
| float
 
| fifth value
 
 
|-
 
|-
| 0x18
+
|0x0018 ||dword ||threat flags
| dword
 
| threat flags
 
 
|-
 
|-
| 0x1C
+
|0x001C ||dword ||avoid flags
| dword
 
| avoid flags
 
 
|}
 
|}
 
</div>
 
</div>
Line 1,966: Line 1,985:
 
*{{GTAF|457357|Current development topic}}
 
*{{GTAF|457357|Current development topic}}
 
*{{GTAF|454001|Savefile Editor}}, by voodoo48
 
*{{GTAF|454001|Savefile Editor}}, by voodoo48
 +
*{{GTAF|646386|Vice City Save Converter}}, by {{U|Silent}} &ndash; converts between Steam and retail versions
 
*[http://gtasnp.com/resources/010/gtavc.bt 010 template for VC save files]
 
*[http://gtasnp.com/resources/010/gtavc.bt 010 template for VC save files]
  
 
{{Savegame-navi}}
 
{{Savegame-navi}}
 
{{VC-navi}}
 
{{VC-navi}}

Latest revision as of 16:19, 3 December 2017

This article deals with the format of a save game file for the PC version of GTA Vice City.

Location

By default, the game places its save game files into the folder "GTA Vice City User Files" which is located in the current user's Documents folder. The location of this folder varies depending upon the version of Windows installed.

The save files themselves are named in the format GTAVCsfX.b where X represents the in-game slot number. There are 8 slots available in the game (1-8).

Format details

The save file is in binary format (little endian format -> least significant byte first) consisting of 23 blocks of data. Each block starts with the size of the current block. To reach the next block, read the size of the currently selected block, add that value to the block's start address, and add four. Initial offset listed here starts four bytes after the start of the block.

Data Blocks

There is a DWORD value preceding any block of data which is equal to the size of the block.

Block 0: Simple Vars

Offset Type Description
0x0000 dword size of block 0
0x0004 - start of block 0, data below
Offset Type Description
0x0000 wchar_t[24] last mission passed
0x0030 word SYSTEMTIME wYear
0x0032 word SYSTEMTIME wMonth
0x0034 word SYSTEMTIME wDayOfWeek
0x0036 word SYSTEMTIME wDay
0x0038 word SYSTEMTIME wHour
0x003A word SYSTEMTIME wMinute
0x003C word SYSTEMTIME wSecond
0x003E word SYSTEMTIME wMilliseconds
0x0040 dword unknown, value is always 12609
0x0044 dword current level
0x0048 float[3] camera coordinates (x,y,z)
0x0054 dword unknown, but only present in Steam version saves. If present, n = 4 in following offsets for this block, otherwise n = 0.
0x0054+n dword number of milliseconds per game minute (1000 = normal)
0x0058+n dword game timer when game clock last ticked
0x005C+n byte game hour
0x005D+n byte[3] align
0x0060+n byte game minute
0x0061+n byte[3] align
0x0064+n dword pad number?
0x0068+n dword game timer in milliseconds
0x006C+n float time scale
0x0070+n float time step (frame delta time)
0x0074+n float time step (not clipped)
0x0078+n dword number of the frames processed from the beginning of the game
0x007C+n float time step #2 (constant 1.0, unused)
0x0080+n float frames per update (constant 1.0, unused)
0x0084+n float time scale (constant 1.0, unused)
0x0088+n word old (previous) weather type
0x008A+n byte[2] align
0x008C+n word new (next) weather type
0x008E+n byte[2] align
0x0090+n word forced weather type (01B5 or 01B6), -1 if not forced
0x0092+n byte[2] align
0x0094+n float weather interpolation value
0x0098+n dword current weather list offset (between 0 and 63)
0x009C+n float current vehicle camera view (between 0.0 and 5.0)
0x00A0+n float current on foot camera view (classic controls only)
0x00A4+n dword current interior
0x00A8+n byte taxi boost jump
0x00A9+n byte[3] align
0x00AC+n byte invert look option
0x00AD+n byte[3] align
0x00B0+n dword extra color
0x00B4+n dword is extra color on
0x00B8+n float extra color interpolation (between 0.0 and 1.0)
0x00BC+n dword[10] current radio station position
0x00E4+n dword size of script block
0x00E8+n - start of script block, see below
Subblock A:
Offset Type Description
0x0000 char[4] SCR\0
0x0004 dword size of script block again
0x0008 dword size of subblock A
0x000C - start of subblock A: global variables - each variable is 4 bytes long
Subblock B:
Offset Type Description
0x0000 dword size of subblock B (constant 0x248)
0x0004 dword on mission flag offset in global variable space
0x0008 dword game timer when last mission is passed (0318 or 0595), -1 if never passed a mission
0x000C BuildingSwap[25] swapped building model structures (see below)
BuildingSwap (0x10 bytes):
Offset Type Description
0x0000 dword object type
  • 0 = no object
  • 1 = treadable (PATH is attached to model, value is never used)
  • 2 = building (no PATH is attached, value is always used)
0x0004 dword object index
0x0008 dword new building IDE model, -1 if no model
0x000C dword old building IDE model, -1 if no model
0x019C InvisibilitySetting[20] object invisibility setting structures (see below)
InvisibilitySetting (8 bytes):
Offset Type Description
0x0000 dword object type
  • 0 = no model
  • 1 = treadable
  • 2 = building
  • 3 = script objects/loaded dynamic objects
  • 4 = unloaded dynamic objects
0x0004 dword object index
0x023C - start of another set of offset below
Offset Type Description
0x0000 byte is mission script running
0x0001 byte is Kaufman Cabs radio on
0x0002 byte[2] align
0x0004 dword size of main
0x0008 dword size of largest mission
0x000C word number of mission scripts
0x000E word number of exclusive mission scripts
0x0010 dword number of running scripts
0x0014 Script[n] script structures (see below) where n is the number of scripts
Script (0x88 bytes):
Offset Type Description
0x0000 dword pointer to next script
0x0004 dword pointer to previous script
0x0008 char[8] name
0x0010 dword current instruction pointer
0x0014 dword[6] return stack
0x002C word stack counter
0x002E word align
0x0030 dword[16] 16 local variables
0x0070 dword timerA (local variable 16)
0x0074 dword timerB (local variable 17)
0x0078 byte is active
0x0079 byte "if" statement result
0x007A byte uses mission cleanup
0x007B byte skip wake time (always 0)
0x007C dword wake time
0x0080 word "if" check result
0x0082 byte "not" flag
0x0083 byte death/arrest state
0x0084 byte death/arrest has been executed
0x0085 byte mission flag

Block 1: Player Peds

Offset Type Description
0x0000 dword size of block 1
0x0004 - start of block 1, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword number of players
0x0004 Player[n] player structure (see below) where n is the number of players
Player (0x6FF bytes):
Offset Type Description
0x0000 dword ped type, always 0
0x0004 word ped model index
0x0006 dword ped pool index
0x000A CPlayerPed ped structure dump (see structure below)

Only data that are loaded by the game are listed here. The rest of the data get saved but do not get loaded.

CPlayerPed (0x6D8 bytes):
Offset Type Description
0x0034 float[3] x,y,z coordinates
0x0354 float health
0x0358 float armor
0x0408 dword weapon slot 0 type
0x0414 dword weapon slot 0 ammo
0x0420 dword weapon slot 1 type
0x042C dword weapon slot 1 ammo
0x0438 dword weapon slot 2 type
0x0444 dword weapon slot 2 ammo
0x0450 dword weapon slot 3 type
0x045C dword weapon slot 3 ammo
0x0468 dword weapon slot 4 type
0x0474 dword weapon slot 4 ammo
0x0480 dword weapon slot 5 type
0x048C dword weapon slot 5 ammo
0x0498 dword weapon slot 6 type
0x04A4 dword weapon slot 6 ammo
0x04B0 dword weapon slot 7 type
0x04BC dword weapon slot 7 ammo
0x04C8 dword weapon slot 8 type
0x04D4 dword weapon slot 8 ammo
0x04E0 dword weapon slot 9 type
0x04EC dword weapon slot 9 ammo
0x0504 byte currently selected weapon slot, always set to 0 upon loading
0x0604 float max stamina
0x0624 dword[4] targettable object index, -1 if no object
0x06E2 dword max wanted level
0x06E6 dword max chaos level
0x06EA char[21] current model name

Block 2: Garages

Offset Type Description
0x0000 dword size of block 2
0x0004 - start of block 2, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x1EC4)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword number of garages
0x0004 dword free bombs
0x0008 dword free resprays
0x000C dword number of cars collected (unused)
0x0010 dword number of Securicars collected (unused)
0x0014 dword number of Police cars collected (unused)
0x0018 dword cars collected by garage type 8 in flag field representation
  • 0b000001 = car 1 collected
  • 0b000010 = car 2 collected
  • 0b000100 = car 3 collected
  • 0b001000 = car 4 collected
  • 0b010000 = car 5 collected
  • 0b100000 = car 6 collected
0x001C dword cars collected by garage type 9 in flag field representation
0x0020 dword cars collected by garage type 10 in flag field representation
0x0024 dword cars collected by garage type 22 in flag field representation
0x0028 dword game timer when garage full message was last shown
0x002C StoredCar[48] stored car structures (see below)
0x07AC Garage[32] garage structures (see below)
StoredCar (0x28 bytes):
Offset Type Description
0x0000 dword model ID
0x0004 float[3] x,y,z position
0x0010 float[3] x,y,z vector rotation
0x001C dword proofs
0x0020 byte primary color
0x0021 byte secondary color
0x0022 byte current radio station
0x0023 byte variation 1
0x0024 byte variation 2
0x0025 byte bomb type
Garage (0xA8 bytes):
Offset Type Description
0x0000 byte type
0x0001 byte state
  • 0 = closed
  • 1 = opened
  • 2 = closing
  • 3 = opening
  • 4 = opened with serviced car (bomb and spray shops)
  • 5 = closed with vehicle dropped off (mission keepcar)
0x0002 byte maximum number of cars in garage (4 = default)
0x0004 byte closed but nothing dropped off (mission keepcar)
0x0005 byte is inactive (unused)
0x0006 byte has respray happened
0x0007 byte align
0x0008 dword target model (unused)
0x000C pointer door object
0x0010 pointer crusher top object (unused)
0x0019 byte rotating door
0x001A byte special camera for garage
0x001B byte align
0x001C float[3] primary x,y,z coordinates (garage opcode parameters 1, 2, 3)
0x0028 float[4] rx,ry,rz,rw quaternion rotation
0x0038 float ceiling z coordinate (garage opcode parameter 8)
0x0044 float lower x coordinate (min of x1 + x2 - x primary, x primary, x1, or x2)
0x0048 float upper x coordinate (max of x1 + x2 - x primary, x primary, x1, or x2)
0x004C float lower y coordinate
0x0050 float upper y coordinate
0x0054 float door current height relative to base of garage
0x0058 float door maximum height relative to base of garage
0x005C float door object x position, 0 if no door
0x0060 float door object y position, 0 if no door
0x0064 float crusher top object x position (unused)
0x0068 float crusher top object y position (unused)
0x006C float door object z position
0x0070 float crusher top object z position (unused)
0x0074 dword game timer to open a closed garage
0x007C pointer target vehicle

Block 3: Game Logic

Offset Type Description
0x0000 dword size of block 3
0x0004 - start of block 3, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x104)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword number of taxi shortcut pick-up points for mission
0x0004 TaxiShortcut[16] taxi shortcut structures (see below)
TaxiShortcut (0x10 bytes):
Offset Type Description
0x0000 float[3] x,y,z coordinates
0x000C float heading

Block 4: Vehicles

Offset Type Description
0x0000 dword size of block 4
0x0004 - start of block 4, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 - start of another set of offset below
Offset Type Description
0x0000 dword number of general vehicles
0x0004 dword number of boats
0x0008 dword number of bikes
0x000C Vehicle[n] vehicle structures (see below) where n is the number of general vehicles, boats, and bikes
Vehicle (0x5E6 (automobile) | 0x4CA (boat) | 0x4F6 (bike) bytes):
Offset Type Description
0x0000 dword vehicle type
  • 0 = automobile
  • 1 = boat
  • 5 = bike
0x0004 word vehicle model index
0x0006 dword vehicle pool index
0x000A CAutomobile
CBoat
CBike
vehicle structure dump (see below, dependent on vehicle type)

If vehicle is type automobile (any vehicles with four wheels, including pilotable helicopters):

CAutomobile (0x5DC bytes):
Offset Type Description
0x0034 float[3] x,y,z coordinates
0x005C word IDE model number

If vehicle is type boat:

CBoat (0x4C0 bytes):
Offset Type Description
0x0034 float[3] x,y,z coordinates
0x005C word IDE model number

If vehicle is type bike:

CBike (0x4EC bytes):
Offset Type Description
0x0034 float[3] x,y,z coordinates
0x005C word IDE model number

Block 5: Objects

Offset Type Description
0x0000 dword size of block 5
0x0004 - start of block 5, data below
Offset Type Description
0x0000 dword size of subblock (4 bytes less than block header)
0x0004 - start of another set of offset below
Offset Type Description
0x0000 dword number of objects
0x0004 Object[n] object structures (see below) where n is the number of objects
Object (0x58 bytes):
Offset Type Description
0x0000 word object model index
0x0002 dword object pool index
0x0006 float[3] x,y,z coordinates
0x000F char[6] compressed rotational data
0x003A byte always 2
0x003B byte is a pickup
0x003C byte is a pickup in shop (type 1 pickup)
0x003D byte is a pickup in shop out of stock (type 7 pickup)

Block 6: Paths

Block 7: Cranes

Offset Type Description
0x0000 dword size of block 7
0x0004 - start of block 7, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x3E8)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword number of cranes
0x0004 dword cars collected by military crane
0x0008 Crane[8] crane structures (see below)
Crane (0x7C bytes):
Offset Type Description
0x0000 pointer crane object
0x0004 pointer magnet object
0x0008 float pickup zone x1 (crane opcode parameter 3)
0x000C float pickup zone x2 (crane opcode parameter 5)
0x0010 float pickup zone y1 (crane opcode parameter 6)
0x0014 float pickup zone y2 (crane opcode parameter 4)
0x0018 float drop off point x (crane opcode parameter 7)
0x001C float drop off point y (crane opcode parameter 8)
0x0020 float drop off point z (crane opcode parameter 9)
0x0024 float drop off heading in radians (crane opcode parameter 10)
0x0028 float crane arm pick up rotation in radians
0x002C float crane arm drop off rotation in radians
0x0030 float crane arm pick up distance from center of crane
0x0034 float crane arm drop off distance from center of crane
0x0038 float crane arm pick up height
0x003C float crane arm drop off height
0x0040 float crane arm current rotation in radians
0x0044 float crane arm current distance from center of crane
0x0048 float crane arm current height
0x004C float[3] crane hook initial x, y, z
0x0058 float[3] crane hook current x, y, z
0x006C pointer vehicle to pick up
0x0070 dword game timer + 10000 when crane has finished lifting car
0x0074 byte crane activity
  • 0 = idle crane
  • 1 = crusher/military crane active
  • 2 = crane inactive
0x0075 byte crane status
  • 0 = idle
  • 1 = crane moving to pick up
  • 3 = moving upwards from pick up
  • 2 = moving to destination
  • 4 = moving downwards to drop off
  • 5 = moving upwards from drop off
0x0076 byte number of vehicles collected
0x0077 byte is crusher crane
0x0078 byte is military crane
0x007A byte model is not doc_crane_cab0
0x007B byte align

Block 8: Pickups

Offset Type Description
0x0000 dword size of block 8
0x0004 - start of block 8, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x4494)
0x0004 Pickup[336] pickup structures (see below)
Pickup (0x34 bytes):
Offset Type Description
0x0000 float[3] x,y,z coordinates
0x000C float current protection revenue
0x0010 dword pickup object entity
0x0014 dword pickup extra object entity (weapons bomb or minigun for example)
0x0018 dword ammo/money/text/protection revenue limit
0x001C dword timer
0x0020 word protection revenue rate
0x0022 word IDE model
0x0026 char[8] string to display in help box (0517/0518)
0x002E byte type
0x002F byte has been picked up
0x4444 word collected index for below, always between 0 and 19
0x4446 byte[2] align
0x4448 dword[20] pickup index, latest collected pickup pointed by collected index from above

Block 9: Phone Info

Offset Type Description
0x0000 dword size of block 9
0x0004 - start of block 9, data below
Offset Type Description
0x0000 dword size of subblock (constant 0xA30)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword number of phone objects
0x0004 dword number of active phones
0x0008 Phone[50] phone structures (see below)
Phone (0x34 bytes):
Offset Type Description
0x0000 float[3] x,y,z coordinates
0x000C dword[6] pointer to phone message string
0x0024 dword game timer when phone message ends for states 5 and 6
0x0028 dword object index
0x002C dword phone state
  • 3 = no ringing
  • 4 = ringing, message just once
  • 5 = ringing, message repeated, phone was never picked up
  • 6 = ringing, message repeated, phone was picked up before
  • 7 = no ringing, finished state of state 4
  • 8 = no ringing, finished state of states 5 and 6
  • 9 = only ringing
0x0030 byte is player within range of phone
0x0031 byte[3] align

Block 10: Restart Points

Offset Type Description
0x00 dword size of block 10
0x04 - start of block 10, data below
Offset Type Description
0x00 dword size of subblock (constant 0x124)
0x04 - start of subblock, data below
Offset Type Description
0x000 char[4] RST\0
0x004 dword size of rest of subblock
0x008 float[3] hospital restart x,y,z coordinates
0x014 float hospital restart heading
7 additional hospital restarts
0x088 float[3] police restart x,y,z coordinates
0x094 float police restart heading
7 additional police restarts
0x108 word number of hospital restarts
0x10A word number of police restarts
0x10C byte override next restart active
0x10D byte[3] align
0x110 float[3] override next restart x,y,z coordinates
0x11C float override next restart heading
0x120 byte always 1, leftover from GTA III's 040F
0x121 byte always 1, leftover from GTA III's 040E
0x122 byte override hospital level
0x123 byte override police station level

Block 11: Radar Blips

Offset Type Description
0x0000 dword size of block 11
0x0004 - start of block 11, data below
Offset Type Description
0x0000 dword size of subblock (constant 0xE18)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 char[4] RDR\0
0x0004 dword size of rest of subblock
0x0008 Blip[75] blip structures (see below)
Blip (0x30 bytes):
Offset Type Description
0x0000 dword blip color
0x0004 float debug sphere cross offset, unused, always 1.0
0x0008 dword blip type
  • 0 = none
  • 1 = car
  • 2 = char
  • 3 = object/pickup
  • 4 = coord
  • 5 = contact point
0x000C dword entity (0 = not an entity)
0x0010 float[2] x,y coordinates (does not apply to entities)
0x0018 float[3] x,y,z coordinates (does not apply to entities)
0x0026 byte dim blip
0x0028 byte is short range
0x002A word blip scale
0x002C word blip display
0x002E word sprite blip

Block 12: Zones

Offset Type Description
0x0000 dword size of block 12
0x0004 - start of block 12, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x8BE0)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 char[4] ZNS\0
0x0004 dword size of rest of subblock
0x0008 dword current level
  • 1 = Vice City Beach
  • 2 = Vice City Mainland
0x000E byte[2] align
0x0010 Zone[20] type 0 and 1 (navig) zone structures (see below)
0x0470 Zone[169] type 2 (info) zone structures (see below)
0x2968 ZoneInfo[338] ped/car/gang info zone structures (see below)
0x8330 word total number of type 0 and 1 (navig) zones
0x8332 word total number of type 2 (info) zones
0x8334 word total number of type 2 (info) zones * 2 - 1
0x8336 byte[2] align
0x8338 Zone[39] type 3 (map) zone structures (see below)
0x8BC0 word[14] crime report audio zones
0x8BDC word total number of type 1 (map) zones
0x8BDE word total number of crime report audio zones
Zone (0x38 bytes):
Offset Type Description
0x0000 char[8] name
0x0008 float[3] x1,y1,z1 coordinates
0x0014 float[3] x2,y2,z2 coordinates
0x0020 dword type
0x0024 dword level
0x0028 word zone info id night
0x002A word zone info id day
0x002C dword child zone index
0x0030 dword parent zone index
ZoneInfo (0x44 bytes):
Offset Type Description
0x0000 word in car ped density
0x0002 word car class 0 density
0x0004 word car class 0 and 1 density
0x0006 word car class 0, 1, and 2 density
0x0008 word car class 0, 1, 2, and 3 density
0x000A word car class 0, 1, 2, 3, and 4 density
0x000C word car class 0, 1, 2, 3, 4, and 5 density
0x000E word car class 0, 1, 2, 3, 4, 5, and 6 density
0x0010 word car class 0, 1, 2, 3, 4, 5, 6, and 7 density
0x0012 word car class 0, 1, 2, 3, 4, 5, 6, 7, and 8 density
0x0014 word car class 9 density
0x0016 word car class 9 and 10 density
0x0018 word in car cop + gang 0 density
0x001A word in car cop + gang 0 and 1 density
0x001C word in car cop + gang 0, 1, and 2 density
0x001E word in car cop + gang 0, 1, 2, and 3 density
0x0020 word in car cop + gang 0, 1, 2, 3, and 4 density
0x0022 word in car cop + gang 0, 1, 2, 3, 4, and 5 density
0x0024 word in car cop + gang 0, 1, 2, 3, 4, 5, and 6 density
0x0026 word in car cop + gang 0, 1, 2, 3, 4, 5, 6, and 7 density
0x0028 word in car cop + gang 0, 1, 2, 3, 4, 5, 6, 7, and 8 density
0x002A word in car cop density
0x002C word on foot ped density
0x002E word on foot cop + gang 0 density
0x0030 word on foot cop + gang 0 and 1 density
0x0032 word on foot cop + gang 0, 1, and 2 density
0x0034 word on foot cop + gang 0, 1, 2, and 3 density
0x0036 word on foot cop + gang 0, 1, 2, 3, and 4 density
0x0038 word on foot cop + gang 0, 1, 2, 3, 4, and 5 density
0x003A word on foot cop + gang 0, 1, 2, 3, 4, 5, and 6 density
0x003C word on foot cop + gang 0, 1, 2, 3, 4, 5, 6, and 7 density
0x003E word on foot cop + gang 0, 1, 2, 3, 4, 5, 6, 7, and 8 density
0x0040 word on foot cop density
0x0042 word ped group

Block 13: Gangs

Offset Type Description
0x0000 dword size of block 13
0x0004 - start of block 13, data below
Offset Type Description
0x0000 dword size of subblock (constant 0xE0)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 char[4] GNG\0
0x0004 dword size of rest of subblock
0x0008 GangInfo[9] gang structures (see below)
GangInfo (0x18 bytes):
Offset Type Description
0x0000 dword gang car model
0x0004 dword gang ped model 1
0x0008 dword gang ped model 2
0x000C byte gang ped model preference
0x000D byte[3] align
0x0010 dword gang weapon type 1
0x0014 dword gang weapon type 2

Block 14: Car Generators

Offset Type Description
0x0000 dword size of block 14
0x0004 - start of block 14, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x1FE8)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 char[4] CGN\0
0x0004 dword size of rest of subblock
0x0008 dword size of subdata before car generator structures (constant 0xC)
0x000C dword total number of car generators
0x0010 dword total number of active car generators
0x0014 byte process counter
0x0015 byte generate even if player is close counter
0x0016 byte[2] align
0x0018 dword size of rest of subblock (constant 0x1FCC)
0x001C CarGenerator[185] car generator structures (see below)
CarGenerator (0x2C bytes):
Offset Type Description
0x0000 dword vehicle IDE model
0x0004 float[3] x,y,z coordinates
0x0010 float heading
0x0014 word primary color
0x0016 word secondary color
0x0018 byte force spawn
0x0019 byte alarm
0x001A byte lock
0x001B byte align
0x001C word min delay
0x001E word max delay
0x0020 dword game timer when car is generated, game timer + 60000 when car is stolen
0x0024 dword vehicle index, -1 if not spawned or is stolen
0x0028 word switch car generator, -1 = always spawn, 0 = never spawn
0x002A byte has recently been stolen
0x002B byte align

Block 15: Particles

Offset Type Description
0x00 dword size of block 15
0x04 - start of block 15, data below
Offset Type Description
0x00 dword size of subblock
0x04 dword number of particle objects
0x08 132 bytes[n] particle structures (see below)
Offset Type Description
0x30 float[3] x,y,z coordinates
0x58 dword particle type
0x5C dword particle type
0x60 byte visibility
0x61 byte sparsity
0x62 word sparsity counter
0x68 float[3] x,y,z strength
0x78 float scale

Block 16: Audio Script Objects

Offset Type Description
0x0000 dword size of block 16
0x0004 - start of block 16, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 - start of subblock, data below
Offset Type Description
0x0000 char[4] AUD\0
0x0004 dword size of rest of subblock
0x0008 dword number of audio script objects
0x0012 AudioScriptObject[n] audio script object structures (see below) where n is the number of audio script objects
AudioScriptObject (0x18 bytes):
Offset Type Description
0x0000 dword audio pool index
0x0004 word sound index
0x0006 word align
0x0008 float[3] x,y,z coordinates
0x0014 dword audio entity

Block 17: Script Paths

Offset Type Description
0x0000 dword size of block 17
0x0004 - start of block 17, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 ScriptPath[3] script path structures (see below)
ScriptPath:
Offset Type Description
0x0000 dword total number of nodes on path
0x0004 dword pointer to path nodes data
0x0008 float total distance of path
0x000C float path speed
0x0010 float distance along path
0x0014 float width
0x0018 dword state
0x001C dword[6] object handles
0x0034 Node[n] path nodes data (see below) where n is the number of nodes
Node (0x14 bytes):
Offset Type Description
0x0000 float[3] coordinate point
0x000C float distance along path to coordinate point

Block 18: Player Info

Offset Type Description
0x0000 dword size of block 18 (constant 0x170)
0x0004 - start of block 18, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword current money
0x0004 byte wasted/busted status
0x000F dword currently displayed money
0x0013 dword number of packages picked up
0x0017 dword total number of packages
0x001B byte never gets tired
0x001C byte fast reload
0x001D byte fire proof
0x001E byte max health
0x001F byte max armor
0x0020 byte get out of jail free
0x0021 byte free health care
0x0022 byte can do drive by
0x0069 byte Rosenberg's audio status

Block 19: Stats

Offset Type Description
0x0000 dword size of block 19
0x0004 - start of block 19, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword people wasted by player
0x0004 dword people wasted by others
0x0008 dword road vehicles destroyed
0x000C dword boats destroyed
0x0010 dword tires popped with gunfire
0x0014 dword bullets fired
0x0018 dword[23] peds of ped type wasted
0x0074 dword planes and helicopters destroyed
0x0078 float current progress
0x007C float total progress
0x0080 dword kilograms of explosives used
0x0084 dword bullets that hit
0x0088 dword number of headshots
0x008C dword total number of wanted stars attained
0x0090 dword total number of wanted stars evaded
0x0094 dword times busted
0x0098 dword hospital visits
0x009C dword days passed in game
0x00A0 dword safehouse visits
0x00A4 dword sprayings
0x00A8 float max insane jump distance
0x00AC float max insane jump height
0x00B0 dword max insane jump flips
0x00B4 dword max insane jump rotation
0x00B8 dword best insane stunt so far
0x00BC dword unique jumps completed
0x00C0 dword total unique jumps
0x00C4 dword mission attempts
0x00C8 dword passengers dropped off
0x00CC dword cash made in taxi
0x00D0 dword Portland passed (unused)
0x00D4 dword Staunton passed (unused)
0x00D8 dword Shoreside passed (unused)
0x00DC dword porn leaflet rubbish visibility
0x00E0 dword allows hurricane weather
0x00E4 float distance traveled on foot
0x00E8 float distance traveled by car
0x00EC float distance traveled by bike
0x00F0 float distance traveled by boat
0x00F4 float distance traveled by golf cart
0x00F8 float distance traveled by helicopter
0x00FC float distance traveled by plane
0x0100 dword people saved in an ambulance
0x0104 dword criminals killed on vigilante mission
0x0108 dword total fires extinguished
0x010C dword highest vigilante mission level
0x0110 dword highest paramedic mission level
0x0114 dword fire truck mission level
0x0118 dword photographs taken
0x011C dword rampages passed
0x0120 dword total number of rampages
0x0124 dword total number of missions
0x0128 dword flight hours
0x012C dword fishes fed (number of times drowned)
0x0130 dword seagulls sniped
0x0134 float weapon budget
0x0138 float fashion budget
0x013C float visits from loan sharks (unused)
0x0140 float stores knocked off
0x0144 float movie stunts (unused)
0x0148 float assassination contracts completed
0x014C float pizzas delivered
0x0150 float garbage pickups made (unused)
0x0154 float 'ice cream' sold
0x0158 float top shooting range score (unused, see 0x01FF)
0x015C float shooting range rank (unused, see 0x01FF)
0x0160 dword longest wheelie time
0x0164 dword longest stoppie time
0x0168 dword longest two wheels time
0x016C dword longest wheelie distance
0x0170 dword longest stoppie distance
0x0174 dword longest two wheels distance
0x0178 dword property budget
0x017C dword auto repair and painting budget
0x0180 dword property destroyed
0x0184 dword number of properties owned
0x0188 dword bloodring kills
0x018C dword longest time in bloodring
0x0190 byte[15] properties owned
0x019F dword highest media attention
0x01A3 dword[23] best times for races/vehicle missions in seconds
0x01FF dword[5] minigame records
  • 0 - Highest score for Shooter
  • 1 - Best Percentage of hits for Shooter
  • 2 - Number of drug deals made
  • 3 - Highest score with Keepie-Uppy beach ball
  • 4 - Unused
0x0213 dword hotring best result
0x0217 dword peds killed recently (always zero while saving)
0x021B dword total peds killed (used for calculating rating)
0x021F char[8] last passed mission GXT key
0x0227 dword cheat rating
0x022B float[10] listening time per radio station in milliseconds

Block 20: Set Pieces

Offset Type Description
0x0000 dword size of block 20
0x0004 - start of block 20, data below
Offset Type Description
0x0000 dword size of subblock
0x0004 - start of subblock, data below
Offset Type Description
0x0000 dword number of set pieces
0x0004 SetPiece[96] set piece structures (see below)
SetPiece (0x38 bytes):
Offset Type Description
0x0000 dword type
0x0008 float timer
0x0008 float trigger area x1
0x000C float trigger area y2
0x0010 float trigger area x2
0x0014 float trigger area y1
0x0018 float[2] policeA spawn x,y
0x0020 float[2] policeB spawn x,y
0x0028 float[2] policeA heading x,y
0x0030 float[2] policeB heading x,y

Block 21: Streaming

Offset Type Description
0x00 dword size of block 21
0x04 - start of block 21, data below
Offset Type Description
0x00 dword size of subblock (constant 0x12C)
0x04 - start of subblock, data below
Offset Type Description
0x00 300 bytes streaming flags for first 300 model indices (0-299) (-1 if model is not loaded)

Block 22: Ped Types

Offset Type Description
0x0000 dword size of block 22
0x0004 - start of block 22, data below
Offset Type Description
0x0000 dword size of subblock (constant 0x2E8)
0x0004 - start of subblock, data below
Offset Type Description
0x0000 char[4] PTP\0
0x0004 dword size of rest of subblock
0x0008 PedType[23] ped type structures (see below)
PedType (0x20 bytes):
Offset Type Description
0x0000 dword bitstring (each associated to an entry in ped.dat)
0x0004 float first value/50.0
0x0008 float second value/50.0
0x000C float third value/50.0
0x0010 float fourth value
0x0014 float fifth value
0x0018 dword threat flags
0x001C dword avoid flags

Padding

Following the last data block is a variable amount of padding. Since every save file is exactly 0x31464 bytes in length this padding is necessary to fill the space between the data blocks which start the file and the checksum value which ends it. There could be up to 4 padding blocks, each one is up to 55,000 bytes in length.

Checksum

The last four bytes of the save file is the checksum value. It is the sum of all preceding bytes in the file. If the checksum does not match that sum, the game will consider the save file to be "corrupted" and refuse to load it. For any change in the save file, make sure the checksum value is updated.

External links