Difference between revisions of "Saves (GTA VC)"
(→Block 1: Player Peds: listing only data that can be loaded) |
m (→Block 21: Streaming) |
||
(25 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 14: | Line 14: | ||
==== Block 0: Simple Vars ==== | ==== Block 0: Simple Vars ==== | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 0 | |0x0000 ||dword ||size of block 0 | ||
Line 22: | Line 22: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||wchar_t[24] ||last mission passed | + | |0x0000 ||[[wikipedia:Wide character|wchar_t]][24] ||[[0318|last mission passed]] |
|- | |- | ||
|0x0030 ||word ||SYSTEMTIME wYear | |0x0030 ||word ||SYSTEMTIME wYear | ||
Line 31: | Line 31: | ||
|0x0032 ||word ||SYSTEMTIME wMonth | |0x0032 ||word ||SYSTEMTIME wMonth | ||
|- | |- | ||
− | |0x0034 ||word ||SYSTEMTIME wDayOfWeek | + | |0x0034 ||word ||SYSTEMTIME wDayOfWeek |
|- | |- | ||
|0x0036 ||word ||SYSTEMTIME wDay | |0x0036 ||word ||SYSTEMTIME wDay | ||
Line 45: | Line 45: | ||
|0x0040 ||dword ||unknown, value is always 12609 | |0x0040 ||dword ||unknown, value is always 12609 | ||
|- | |- | ||
− | |0x0044 ||dword ||current | + | |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 || | + | |0x0054+n ||dword ||number of milliseconds per game minute (1000 = normal) |
|- | |- | ||
− | |0x0058 + n ||dword || | + | |0x0058+n ||dword ||game timer when game clock last ticked |
|- | |- | ||
− | |0x005C + n ||byte ||game hour | + | |0x005C+n ||byte ||game hour |
|- | |- | ||
− | |0x005D + n ||byte[3] ||''align'' | + | |0x005D+n ||byte[3] ||''align'' |
|- | |- | ||
− | |0x0060 + n ||byte ||game minute | + | |0x0060+n ||byte ||game minute |
|- | |- | ||
− | |0x0061 + n ||byte[3] ||''align'' | + | |0x0061+n ||byte[3] ||''align'' |
|- | |- | ||
− | |0x0064 + n ||dword ||pad number? | + | |0x0064+n ||dword ||pad number? |
|- | |- | ||
− | |0x0068 + n ||dword || | + | |0x0068+n ||dword ||game timer in milliseconds |
|- | |- | ||
− | |0x006C + n ||float || | + | |0x006C+n ||float ||[[015D|time scale]] |
|- | |- | ||
− | |0x0070 + n ||float || | + | |0x0070+n ||float ||time step (frame delta time) |
|- | |- | ||
− | |0x0074 + n ||float || | + | |0x0074+n ||float ||time step (not clipped) |
|- | |- | ||
− | |0x0078 + n ||dword || | + | |0x0078+n ||dword ||number of the frames processed from the beginning of the game |
|- | |- | ||
− | |0x007C + n ||float || | + | |0x007C+n ||float ||time step #2 (constant 1.0, unused) |
|- | |- | ||
− | |0x0080 + n ||float || | + | |0x0080+n ||float ||frames per update (constant 1.0, unused) |
|- | |- | ||
− | |0x0084 + n ||float || | + | |0x0084+n ||float ||time scale (constant 1.0, unused) |
|- | |- | ||
− | |0x0088 + n ||word || | + | |0x0088+n ||word ||old (previous) weather type |
|- | |- | ||
− | |0x008A + n ||byte[2] ||''align'' | + | |0x008A+n ||byte[2] ||''align'' |
|- | |- | ||
− | |0x008C + n ||word || | + | |0x008C+n ||word ||new (next) weather type |
|- | |- | ||
− | |0x008E + n ||byte[2] ||''align'' | + | |0x008E+n ||byte[2] ||''align'' |
|- | |- | ||
− | |0x0090 + n ||word || | + | |0x0090+n ||word ||forced weather type ([[01B5]] or [[01B6]]), -1 if not forced |
|- | |- | ||
− | |0x0092 + n ||byte[2] ||''align'' | + | |0x0092+n ||byte[2] ||''align'' |
|- | |- | ||
− | |0x0094 + n || | + | |0x0094+n ||float ||weather interpolation value |
|- | |- | ||
− | |0x0098 + n ||dword ||current weather | + | |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) |
|- | |- | ||
− | |0x00A0 + n ||float ||current on foot camera view (classic controls only) | + | |0x00A0+n ||float ||current on foot camera view (classic controls only) |
|- | |- | ||
− | |0x00A4 + n ||dword || | + | |0x00A4+n ||dword ||[[04BB|current interior]] |
|- | |- | ||
− | |0x00A8 + n ||byte ||[[0572|taxi boost jump]] | + | |0x00A8+n ||byte ||[[0572|taxi boost jump]] |
|- | |- | ||
− | |0x00A9 + n ||byte[3] ||''align'' | + | |0x00A9+n ||byte[3] ||''align'' |
|- | |- | ||
− | |0x00AC + n ||byte || | + | |0x00AC+n ||byte ||invert look option |
|- | |- | ||
− | |0x00AD + n ||byte[3] ||''align'' | + | |0x00AD+n ||byte[3] ||''align'' |
|- | |- | ||
− | |0x00B0 + n ||dword ||[[04F9|extra color]] | + | |0x00B0+n ||dword ||[[04F9|extra color]] |
|- | |- | ||
− | |0x00B4 + n ||dword ||extra color | + | |0x00B4+n ||dword ||is extra color on |
|- | |- | ||
− | |0x00B8 + n ||float ||extra color | + | |0x00B8+n ||float ||extra color interpolation (between 0.0 and 1.0) |
|- | |- | ||
− | |0x00BC + n ||dword[10] || | + | |0x00BC+n ||dword[10] ||current radio station position |
|- | |- | ||
− | |0x00E4 + n ||dword ||size of script block | + | |0x00E4+n ||dword ||size of script block |
|- | |- | ||
− | |0x00E8 + n ||- ||start of script block, see below | + | |0x00E8+n ||- ||start of script block, see below |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
|+ style="text-align: left;"|Subblock A: | |+ style="text-align: left;"|Subblock A: | ||
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||char[4] || | + | |0x0000 ||char[4] ||<code>SCR\0</code> |
|- | |- | ||
|0x0004 ||dword ||size of script block again | |0x0004 ||dword ||size of script block again | ||
Line 136: | Line 136: | ||
|0x000C ||- ||start of subblock A: global variables - each variable is 4 bytes long | |0x000C ||- ||start of subblock A: global variables - each variable is 4 bytes long | ||
|} | |} | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
|+ style="text-align: left;"|Subblock B: | |+ style="text-align: left;"|Subblock B: | ||
− | !style="width: 3.5em;" |Offset ||style="width: 9.5em;" |Type ||style="width: | + | !style="width: 3.5em;" |Offset ||style="width: 9.5em;" |Type ||style="width: 34em;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock B (constant 0x248) | |0x0000 ||dword ||size of subblock B (constant 0x248) | ||
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) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"|BuildingSwap (16 | + | |+ style="text-align: left;"|BuildingSwap ({{Hint|0x10|16}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||object type | |0x0000 ||dword ||object type | ||
− | * 0 = no object | + | *0 = no object |
− | * 1 = treadable ([[PATH (IDE Section)|PATH]] is attached to model, value is never used) | + | *1 = treadable ([[PATH (IDE Section)|PATH]] is attached to model, value is never used) |
− | * 2 = building (no PATH is attached, value is always used) | + | *2 = building (no PATH is attached, value is always used) |
|- | |- | ||
|0x0004 ||dword ||object index | |0x0004 ||dword ||object index | ||
Line 165: | Line 165: | ||
|} | |} | ||
</div> | </div> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |style="width: 3.5em;" |0x019C ||style="width: 9.5em;" |InvisibilitySetting[20] ||style="width: | + | |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;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
|+ style="text-align: left;"|InvisibilitySetting (8 bytes): | |+ style="text-align: left;"|InvisibilitySetting (8 bytes): | ||
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||object type | |0x0000 ||dword ||object type | ||
− | * 0 = no model | + | *0 = no model |
− | * 1 = treadable | + | *1 = treadable |
− | * 2 = building | + | *2 = building |
− | * 3 = script objects/loaded dynamic objects | + | *3 = script objects/loaded dynamic objects |
− | * 4 = unloaded dynamic objects | + | *4 = unloaded dynamic objects |
|- | |- | ||
|0x0004 ||dword ||object index | |0x0004 ||dword ||object index | ||
|} | |} | ||
</div> | </div> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |style="width: 3.5em;" |0x023C ||style="width: 9.5em;" | - ||style="width: | + | |style="width: 3.5em;" |0x023C ||style="width: 9.5em;" | - ||style="width: 34em;" |start of another set of offset below |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|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 | + | |0x000C ||word ||number of mission scripts |
|- | |- | ||
− | |0x000E ||word || | + | |0x000E ||word ||number of exclusive mission scripts |
|- | |- | ||
|0x0010 ||dword ||number of running scripts | |0x0010 ||dword ||number of running scripts | ||
|- | |- | ||
− | |0x0014 || | + | |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" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"|Script | + | |+ style="text-align: left;"|Script ({{Hint|0x88|136}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||dword ||pointer to | + | |0x0000 ||dword ||pointer to next script |
|- | |- | ||
− | |0x0004 ||dword ||pointer to | + | |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[ | + | |0x0014 ||dword[6] ||return stack |
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
|0x002C ||word ||stack counter | |0x002C ||word ||stack counter | ||
|- | |- | ||
− | |0x002E ||word || | + | |0x002E ||word ||''align'' |
|- | |- | ||
|0x0030 ||dword[16] ||16 local variables | |0x0030 ||dword[16] ||16 local variables | ||
Line 263: | Line 259: | ||
==== Block 1: Player Peds ==== | ==== Block 1: Player Peds ==== | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 1 | |0x0000 ||dword ||size of block 1 | ||
Line 271: | Line 267: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock | |0x0000 ||dword ||size of subblock | ||
Line 279: | Line 275: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||number of players | |0x0000 ||dword ||number of players | ||
|- | |- | ||
− | |0x0004 || | + | |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" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;" | | + | |+ style="text-align: left;" |Player ({{Hint|0x6FF|1791}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||style="width: 4em;" |Type ||style="width: 40em;" |Description |
− | + | |- | |
− | 0x0000 | + | |0x0000 ||dword ||ped type, always 0 |
− | 0x0004 | + | |- |
− | + | |0x0004 ||word ||ped model index | |
|- | |- | ||
− | |0x0006 ||dword ||index | + | |0x0006 ||dword ||ped pool index |
|- | |- | ||
− | |0x000A || | + | |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 data that are loaded by the game are listed here. The rest of the data get saved but do not get loaded. |
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;" | | + | |+ style="text-align: left;" |CPlayerPed ({{Hint|0x6D8|1752}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0034 ||float[3] ||x,y,z coordinates | |0x0034 ||float[3] ||x,y,z coordinates | ||
Line 311: | Line 307: | ||
|0x0358 ||float ||armor | |0x0358 ||float ||armor | ||
|- | |- | ||
− | |0x0408 ||dword ||[[Weapon#Vice City|weapon]] | + | |0x0408 ||dword ||[[Weapon#Vice City|weapon]] slot 0 type |
|- | |- | ||
− | |0x0414 ||dword ||weapon | + | |0x0414 ||dword ||weapon slot 0 ammo |
|- | |- | ||
− | |0x0420 ||dword ||weapon | + | |0x0420 ||dword ||weapon slot 1 type |
|- | |- | ||
− | |0x042C ||dword ||weapon | + | |0x042C ||dword ||weapon slot 1 ammo |
|- | |- | ||
− | |0x0438 ||dword ||weapon | + | |0x0438 ||dword ||weapon slot 2 type |
|- | |- | ||
− | |0x0444 ||dword ||weapon | + | |0x0444 ||dword ||weapon slot 2 ammo |
|- | |- | ||
− | |0x0450 ||dword ||weapon | + | |0x0450 ||dword ||weapon slot 3 type |
|- | |- | ||
− | |0x045C ||dword ||weapon | + | |0x045C ||dword ||weapon slot 3 ammo |
|- | |- | ||
− | |0x0468 ||dword ||weapon | + | |0x0468 ||dword ||weapon slot 4 type |
|- | |- | ||
− | |0x0474 ||dword ||weapon | + | |0x0474 ||dword ||weapon slot 4 ammo |
|- | |- | ||
− | |0x0480 ||dword ||weapon | + | |0x0480 ||dword ||weapon slot 5 type |
|- | |- | ||
− | |0x048C ||dword ||weapon | + | |0x048C ||dword ||weapon slot 5 ammo |
|- | |- | ||
− | |0x0498 ||dword ||weapon | + | |0x0498 ||dword ||weapon slot 6 type |
|- | |- | ||
− | |0x04A4 ||dword ||weapon | + | |0x04A4 ||dword ||weapon slot 6 ammo |
|- | |- | ||
− | |0x04B0 ||dword ||weapon | + | |0x04B0 ||dword ||weapon slot 7 type |
|- | |- | ||
− | |0x04BC ||dword ||weapon | + | |0x04BC ||dword ||weapon slot 7 ammo |
|- | |- | ||
− | |0x04C8 ||dword ||weapon | + | |0x04C8 ||dword ||weapon slot 8 type |
|- | |- | ||
− | |0x04D4 ||dword ||weapon | + | |0x04D4 ||dword ||weapon slot 8 ammo |
|- | |- | ||
− | |0x04E0 ||dword ||weapon | + | |0x04E0 ||dword ||weapon slot 9 type |
|- | |- | ||
− | |0x04EC ||dword ||weapon | + | |0x04EC ||dword ||weapon slot 9 ammo |
|- | |- | ||
− | |0x0504 ||byte ||currently selected weapon | + | |0x0504 ||byte ||currently selected weapon slot, always set to 0 upon loading |
|- | |- | ||
|0x0604 ||float ||max stamina | |0x0604 ||float ||max stamina | ||
+ | |- | ||
+ | |0x0624 ||dword[4] ||[[035D|targettable object]] index, -1 if no object | ||
|} | |} | ||
</div> | </div> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |0x06E2 ||dword ||[[01F0|max wanted level]] | + | |0x06E2 ||style="width: 4em;" |dword ||style="width: 40em;" |[[01F0|max wanted level]] |
|- | |- | ||
− | |0x06E6 ||dword ||max | + | |0x06E6 ||dword ||[[Wanted level#Chaos Level|max chaos level]] |
|- | |- | ||
|0x06EA ||char[21] ||current model name | |0x06EA ||char[21] ||current model name | ||
Line 368: | Line 366: | ||
==== Block 2: Garages ==== | ==== Block 2: Garages ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 2 | |0x0000 ||dword ||size of block 2 | ||
Line 376: | Line 374: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock (constant 0x1EC4) | |0x0000 ||dword ||size of subblock (constant 0x1EC4) | ||
Line 384: | Line 382: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||style="width: 6.5em;" |Type ||style="width: | + | !Offset ||style="width: 6.5em;" |Type ||style="width: 37em;" |Description |
|- | |- | ||
− | |0x0000 ||dword ||number of | + | |0x0000 ||dword ||number of [[garage]]s |
|- | |- | ||
− | |0x0004 ||dword ||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 ||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 |
− | + | *0b00000'''1''' = car 1 collected | |
+ | *0b0000'''1'''0 = car 2 collected | ||
+ | *0b000'''1'''00 = car 3 collected | ||
+ | *0b00'''1'''000 = car 4 collected | ||
+ | *0b0'''1'''0000 = car 5 collected | ||
+ | *0b'''1'''00000 = 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 [[Text#Garage message|garage full message]] was last shown |
|- | |- | ||
− | | | + | |0x002C ||StoredCar[48] ||stored car structures (see below) |
|- | |- | ||
− | | | + | |0x07AC ||Garage[32] ||garage structures (see below) |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|StoredCar ({{Hint|0x28|40}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||model ID | |0x0000 ||dword ||model ID | ||
Line 439: | Line 443: | ||
|} | |} | ||
</div> | </div> | ||
− | |||
− | |||
− | |||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Garage | + | |+ style="text-align: left;"|Garage ({{Hint|0xA8|168}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||byte ||type | |0x0000 ||byte ||type | ||
|- | |- | ||
− | |0x0001 ||byte || | + | |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 | + | --> |
− | 0x0005 | + | |- |
− | 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 471: | Line 484: | ||
--> | --> | ||
|- | |- | ||
− | |0x0019 ||byte ||[[03BB|rotating | + | |0x0019 ||byte ||[[03BB|rotating door]] |
|- | |- | ||
|0x001A ||byte ||[[03DA|special camera for garage]] | |0x001A ||byte ||[[03DA|special camera for garage]] | ||
|- | |- | ||
− | |0x001C ||float[3] || | + | |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) |
+ | |- | ||
+ | |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> | </div> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==== Block 3: Game Logic ==== | ==== Block 3: Game Logic ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 3 | |0x0000 ||dword ||size of block 3 | ||
Line 504: | Line 537: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock (constant 0x104) | |0x0000 ||dword ||size of subblock (constant 0x104) | ||
Line 512: | Line 545: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||dword ||number of | + | |0x0000 ||dword ||number of [[058D|taxi shortcut pick-up points for mission]] |
|- | |- | ||
− | |0x0004 || | + | |0x0004 ||style="white-space: nowrap;" |TaxiShortcut[16] ||taxi shortcut structures (see below) |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|TaxiShortcut ({{Hint|0x10|16}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||float[3] ||x,y,z coordinates | |0x0000 ||float[3] ||x,y,z coordinates | ||
Line 533: | Line 566: | ||
==== Block 4: Vehicles ==== | ==== Block 4: Vehicles ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 4 | |0x0000 ||dword ||size of block 4 | ||
Line 541: | Line 574: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock | |0x0000 ||dword ||size of subblock | ||
Line 549: | Line 582: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||number of general vehicles | |0x0000 ||dword ||number of general vehicles | ||
Line 558: | 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" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Vehicle (0x5E6 ( | + | |+ style="text-align: left;"| Vehicle ({{Hint|0x5E6|1510}} (automobile) | {{Hint|0x4CA|1226}} (boat) | {{Hint|0x4F6|1270}} (bike) bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||vehicle type | |0x0000 ||dword ||vehicle type | ||
− | * 0 = | + | *0 = automobile |
− | * 1 = boat | + | *1 = boat |
− | * 5 = bike | + | *5 = bike |
|- | |- | ||
− | |0x0004 ||word ||vehicle | + | |0x0004 ||word ||[[CARS (IDE Section)#Vice City|vehicle model index]] |
|- | |- | ||
− | |0x0006 ||dword ||vehicle index | + | |0x0006 ||dword ||vehicle pool index |
|- | |- | ||
− | |0x000A || | + | |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 | + | If vehicle is type automobile (any vehicles with four wheels, including pilotable helicopters): |
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|CAutomobile ({{Hint|0x5DC|1500}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0034 ||float[3] ||x,y,z coordinates | |0x0034 ||float[3] ||x,y,z coordinates | ||
Line 589: | Line 622: | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
If vehicle is type boat: | If vehicle is type boat: | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|CBoat ({{Hint|0x4C0|1216}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0034 ||float[3] ||x,y,z coordinates | |0x0034 ||float[3] ||x,y,z coordinates | ||
Line 600: | Line 633: | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
If vehicle is type bike: | If vehicle is type bike: | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|CBike ({{Hint|0x4EC|1260}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0034 ||float[3] ||x,y,z coordinates | |0x0034 ||float[3] ||x,y,z coordinates | ||
Line 614: | Line 647: | ||
==== Block 5: Objects ==== | ==== Block 5: Objects ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 5 | |0x0000 ||dword ||size of block 5 | ||
Line 622: | Line 655: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock (4 bytes less than block header) | |0x0000 ||dword ||size of subblock (4 bytes less than block header) | ||
Line 630: | Line 663: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||number of objects | |0x0000 ||dword ||number of objects | ||
|- | |- | ||
− | |0x0004 || | + | |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" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Object | + | |+ style="text-align: left;"|Object ({{Hint|0x58|88}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||word ||object IDE | + | |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 675: | Line 715: | ||
==== Block 7: Cranes ==== | ==== Block 7: Cranes ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 7 | |0x0000 ||dword ||size of block 7 | ||
Line 683: | Line 723: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock (constant 0x3E8) | |0x0000 ||dword ||size of subblock (constant 0x3E8) | ||
Line 691: | Line 731: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||number of [[crane]]s | |0x0000 ||dword ||number of [[crane]]s | ||
Line 698: | Line 738: | ||
|0x0004 ||dword ||[[03EC|cars collected by military crane]] | |0x0004 ||dword ||[[03EC|cars collected by military crane]] | ||
|- | |- | ||
− | |0x0008 || | + | |0x0008 ||style="white-space: nowrap;" |Crane[8] ||crane structures (see below) |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Crane | + | |+ style="text-align: left;"|Crane ({{Hint|0x7C|124}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 || | + | |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 753: | Line 792: | ||
--> | --> | ||
|- | |- | ||
− | |0x006C || | + | |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 | ||
|- | |- | ||
|0x0074 ||byte ||crane activity | |0x0074 ||byte ||crane activity | ||
− | * 0 = idle crane | + | *0 = idle crane |
− | * 1 = crusher/military crane active | + | *1 = crusher/military crane active |
− | * 2 = crane inactive | + | *2 = crane inactive |
|- | |- | ||
|0x0075 ||byte ||crane status | |0x0075 ||byte ||crane status | ||
− | * 0 = idle | + | *0 = idle |
− | * 1 = crane moving to pick up | + | *1 = crane moving to pick up |
− | * 3 = moving upwards from pick up | + | *3 = moving upwards from pick up |
− | * 2 = moving to destination | + | *2 = moving to destination |
− | * 4 = moving downwards to drop off | + | *4 = moving downwards to drop off |
− | * 5 = moving upwards from drop off | + | *5 = moving upwards from drop off |
|- | |- | ||
|0x0076 ||byte ||number of vehicles collected | |0x0076 ||byte ||number of vehicles collected | ||
Line 788: | Line 827: | ||
==== Block 8: Pickups ==== | ==== Block 8: Pickups ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 8 | |0x0000 ||dword ||size of block 8 | ||
Line 796: | Line 835: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||style="width: 5.5em;" |Type ||style="width: 39em;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock (constant 0x4494) | |0x0000 ||dword ||size of subblock (constant 0x4494) | ||
Line 804: | Line 843: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Pickup (52 | + | |+ style="text-align: left;"| Pickup ({{Hint|0x34|52}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||float[3] ||x,y,z coordinates | |0x0000 ||float[3] ||x,y,z coordinates | ||
|- | |- | ||
− | |0x000C ||float ||current | + | |0x000C ||float ||current [[04A6|protection]] revenue |
|- | |- | ||
|0x0010 ||dword ||pickup object entity | |0x0010 ||dword ||pickup object entity | ||
Line 837: | Line 876: | ||
|} | |} | ||
</div> | </div> | ||
− | {|class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |0x4444 ||word ||style="width: | + | |0x4444 ||style="width: 5.5em;" |word ||style="width: 39em;" |collected index for below, always between 0 and 19 |
|- | |- | ||
|0x4446 ||byte[2] ||''align'' | |0x4446 ||byte[2] ||''align'' | ||
Line 847: | Line 886: | ||
==== Block 9: Phone Info ==== | ==== Block 9: Phone Info ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 9 |
− | | dword | ||
− | | size of block 9 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 9, data below |
− | | - | ||
− | | start of block 9, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock (constant 0xA30) |
− | | dword | ||
− | | size of subblock (constant 0xA30) | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | + | |- | |
− | + | |0x0000 ||dword ||number of phone objects | |
|- | |- | ||
− | + | |0x0004 ||dword ||number of active phones | |
− | |||
− | |||
− | | | ||
− | | dword | ||
− | | number of phones | ||
|- | |- | ||
− | | | + | |0x0008 ||Phone[50] ||[[024A|phone]] structures (see below) |
− | | | ||
− | | phone structures (see below) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Phone | + | |+ style="text-align: left;"|Phone ({{Hint|0x34|52}} bytes): |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |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'' |
− | | | ||
− | | | ||
|} | |} | ||
</div> | </div> | ||
Line 911: | Line 942: | ||
==== Block 10: Restart Points ==== | ==== Block 10: Restart Points ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 925: | Line 954: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 939: | Line 966: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x000 | | 0x000 | ||
| char[4] | | char[4] | ||
− | | | + | | <code>RST\0</code> |
|- | |- | ||
| 0x004 | | 0x004 | ||
| dword | | dword | ||
− | | size of | + | | size of rest of subblock |
|- | |- | ||
| 0x008 | | 0x008 | ||
| float[3] | | float[3] | ||
− | | hospital restart x,y,z coordinates | + | | [[016C|hospital restart]] x,y,z coordinates |
|- | |- | ||
| 0x014 | | 0x014 | ||
Line 964: | Line 989: | ||
| 0x088 | | 0x088 | ||
| float[3] | | float[3] | ||
− | | police restart x,y,z coordinates | + | | [[016D|police restart]] x,y,z coordinates |
|- | |- | ||
| 0x094 | | 0x094 | ||
Line 990: | Line 1,015: | ||
| 0x110 | | 0x110 | ||
| float[3] | | float[3] | ||
− | | override next restart x,y,z coordinates | + | | [[016E|override next restart]] x,y,z coordinates |
|- | |- | ||
| 0x11C | | 0x11C | ||
Line 1,006: | Line 1,031: | ||
| 0x122 | | 0x122 | ||
| byte | | byte | ||
− | | | + | | [[041F|override hospital level]] |
|- | |- | ||
| 0x123 | | 0x123 | ||
| byte | | byte | ||
− | | | + | | [[0420|override police station level]] |
|} | |} | ||
</div> | </div> | ||
Line 1,016: | Line 1,041: | ||
==== Block 11: Radar Blips ==== | ==== Block 11: Radar Blips ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 11 |
− | | dword | ||
− | | size of block 11 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 11, data below |
− | | - | ||
− | | start of block 11, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock (constant 0xE18) |
− | | dword | ||
− | | size of subblock (constant 0xE18) | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||char[4] ||<code>RDR\0</code> |
− | | char[4] | + | |- |
− | | | + | |0x0004 ||dword ||size of rest of subblock |
− | < | ||
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0008 ||style="white-space: nowrap;" |Blip[75] ||blip structures (see below) |
− | | | ||
− | | blip structures (see below) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| Blip | + | |+style="text-align: left;"|Blip ({{Hint|0x30|48}} bytes): |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | + | |- | |
− | + | |0x0000 ||dword ||[[0165|blip color]] | |
+ | |- | ||
+ | |0x0004 ||float ||[[Saves_(GTA_3)#Notes|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) |
− | | | ||
− | | | ||
<!-- | <!-- | ||
− | + | 0x0024 - - | |
− | |||
− | |||
--> | --> | ||
|- | |- | ||
− | | | + | |0x0026 ||byte ||[[0166|dim blip]] |
− | | | ||
− | | | ||
− | | | ||
− | | | ||
− | | | ||
− | |||
<!-- | <!-- | ||
− | + | 0x0027 - - | |
--> | --> | ||
|- | |- | ||
− | | | + | |0x0028 ||byte ||is short range |
− | | byte | ||
− | | | ||
<!-- | <!-- | ||
− | + | 0x0029 - - | |
− | |||
− | |||
--> | --> | ||
|- | |- | ||
− | | | + | |0x002A ||word ||[[0168|blip scale]] |
− | | word | ||
− | | | ||
|- | |- | ||
− | | | + | |0x002C ||word ||[[018B|blip display]] |
− | | word | ||
− | | | ||
|- | |- | ||
− | | | + | |0x002E ||word ||[[Blip#Vice City|sprite blip]] |
− | | word | ||
− | | | ||
|} | |} | ||
</div> | </div> | ||
Line 1,113: | Line 1,113: | ||
==== Block 12: Zones ==== | ==== Block 12: Zones ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 12 | |0x0000 ||dword ||size of block 12 | ||
Line 1,121: | Line 1,121: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock (constant 0x8BE0) | |0x0000 ||dword ||size of subblock (constant 0x8BE0) | ||
Line 1,129: | Line 1,129: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
+ | |- | ||
+ | |0x0000 ||char[4] ||<code>ZNS\0</code> | ||
+ | |- | ||
+ | |0x0004 ||dword ||size of rest of subblock | ||
+ | |- | ||
+ | |0x0008 ||dword ||current level | ||
+ | *1 = Vice City Beach | ||
+ | *2 = Vice City Mainland | ||
+ | <!-- | ||
+ | 0x0027 word - | ||
+ | --> | ||
+ | |- | ||
+ | |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 |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | |+ style="text-align: left;"|Zone ({{Hint|0x38|56}} bytes): |
+ | !Offset ||Type ||style="width: 100%;" |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 | ||
+ | <!-- | ||
+ | 0x0034 dword - | ||
+ | --> | ||
|} | |} | ||
+ | </div> | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|ZoneInfo ({{Hint|0x44|68}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
+ | |- | ||
+ | |0x0000 ||word ||[[0152|in car ped density]] | ||
+ | |- | ||
+ | |0x0002 ||word ||[[04EC|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 ||[[015C|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 ||[[0324|ped group]] | ||
|} | |} | ||
− | |||
</div> | </div> | ||
</div> | </div> | ||
Line 1,189: | Line 1,272: | ||
==== Block 13: Gangs ==== | ==== Block 13: Gangs ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 13 |
− | | dword | ||
− | | size of block 13 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 13, data below |
− | | - | ||
− | | start of block 13, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock (constant 0xE0) |
− | | dword | ||
− | | size of subblock | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||char[4] ||<code>GNG\0</code> |
− | | char[4] | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0004 ||dword ||size of rest of subblock |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0008 ||GangInfo[9] ||[[gang]] structures (see below) |
− | | | ||
− | | gang structures (see below) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|GangInfo ({{Hint|0x18|24}} bytes): |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||[[0236|gang car model]] |
− | | dword | + | |- |
− | | car model | + | |0x0004 ||dword ||[[0235|gang ped model]] 1 |
+ | |- | ||
+ | |0x0008 ||dword ||gang ped model 2 | ||
|- | |- | ||
− | | | + | |0x000C ||byte ||gang ped model preference |
− | | | ||
− | | ped model | ||
|- | |- | ||
− | | | + | |0x000D ||byte[3] ||''align'' |
− | | | ||
− | | | ||
− | |||
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0010 ||dword ||[[0237|gang weapon]] type 1 |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0014 ||dword ||gang weapon type 2 |
− | | dword | ||
− | | weapon | ||
|} | |} | ||
</div> | </div> | ||
Line 1,269: | Line 1,321: | ||
==== Block 14: Car Generators ==== | ==== Block 14: Car Generators ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 14 | |0x0000 ||dword ||size of block 14 | ||
Line 1,277: | Line 1,329: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||dword ||size of subblock | + | |0x0000 ||dword ||size of subblock (constant 0x1FE8) |
|- | |- | ||
|0x0004 ||- ||start of subblock, data below | |0x0004 ||- ||start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||char[4] || | + | |0x0000 ||char[4] ||<code>CGN\0</code> |
|- | |- | ||
− | |0x0004 ||dword ||size of | + | |0x0004 ||dword ||size of rest of subblock |
|- | |- | ||
|0x0008 ||dword ||size of subdata before car generator structures (constant 0xC) | |0x0008 ||dword ||size of subdata before car generator structures (constant 0xC) | ||
Line 1,304: | Line 1,356: | ||
|0x0016 ||byte[2] ||''align'' | |0x0016 ||byte[2] ||''align'' | ||
|- | |- | ||
− | |0x0018 ||dword ||size of | + | |0x0018 ||dword ||size of rest of subblock (constant 0x1FCC) |
|- | |- | ||
|0x001C ||CarGenerator[185] ||car generator structures (see below) | |0x001C ||CarGenerator[185] ||car generator structures (see below) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| CarGenerator (44 | + | |+ style="text-align: left;"|CarGenerator ({{Hint|0x2C|44}} bytes): |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||vehicle IDE model | |0x0000 ||dword ||vehicle IDE model | ||
Line 1,339: | Line 1,391: | ||
|0x0024 ||dword ||vehicle index, -1 if not spawned or is stolen | |0x0024 ||dword ||vehicle index, -1 if not spawned or is stolen | ||
|- | |- | ||
− | |0x0028 ||word ||[[014C]], | + | |0x0028 ||word ||[[014C|switch car generator]], -1 = always spawn, 0 = never spawn |
|- | |- | ||
|0x002A ||byte ||has recently been stolen | |0x002A ||byte ||has recently been stolen | ||
Line 1,350: | Line 1,402: | ||
==== Block 15: Particles ==== | ==== Block 15: Particles ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 1,364: | Line 1,414: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 1,378: | Line 1,426: | ||
|- | |- | ||
| 0x08 | | 0x08 | ||
− | | 132 bytes[n] | + | | style="white-space: nowrap;" |132 bytes[n] |
| particle structures (see below) | | particle structures (see below) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x30 | | 0x30 | ||
Line 1,423: | Line 1,469: | ||
==== Block 16: Audio Script Objects ==== | ==== Block 16: Audio Script Objects ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 16 |
− | | dword | ||
− | | size of block 16 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 16, data below |
− | | - | ||
− | | start of block 16, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock |
− | | dword | ||
− | | size of subblock | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||char[4] ||<code>AUD\0</code> |
− | | char[4] | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0004 ||dword ||size of rest of subblock |
− | | dword | ||
− | | size of | ||
|- | |- | ||
− | | | + | |0x0008 ||dword ||number of [[018D#Vice City|audio script objects]] |
− | | dword | ||
− | | number of audio objects | ||
|- | |- | ||
− | | | + | |0x0012 ||AudioScriptObject[n] ||audio script object structures (see below) where n is the number of audio script objects |
− | | | ||
− | | audio structures (see below) | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|AudioScriptObject ({{Hint|0x18|24}} bytes): |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | + | |- | |
− | + | |0x0000 ||dword ||audio pool index | |
+ | |- | ||
+ | |0x0004 ||word ||sound index | ||
+ | |- | ||
+ | |0x0006 ||word ||''align'' | ||
|- | |- | ||
− | | | + | |0x0008 ||float[3] ||x,y,z coordinates |
− | | | ||
− | | [ | ||
− | |||
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0014 ||dword ||audio entity |
− | | | ||
− | | | ||
− | |||
− | |||
− | |||
|} | |} | ||
</div> | </div> | ||
Line 1,498: | Line 1,516: | ||
==== Block 17: Script Paths ==== | ==== Block 17: Script Paths ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of block 17 | |0x0000 ||dword ||size of block 17 | ||
Line 1,506: | Line 1,524: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock | |0x0000 ||dword ||size of subblock | ||
|- | |- | ||
− | |0x0004 || | + | |0x0004 ||ScriptPath[3] ||[[Script Path|script path]] structures (see below) |
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | |+ style="text-align: left;"|ScriptPath: |
+ | !Offset ||Type ||style="width: 100%;" |Description | ||
|- | |- | ||
− | |0x0000 ||dword ||total number of nodes on | + | |0x0000 ||dword ||total number of nodes on path |
− | + | |- | |
− | 0x0004 | + | |0x0004 ||dword ||pointer to path nodes data |
− | |||
|- | |- | ||
|0x0008 ||float ||total distance of path | |0x0008 ||float ||total distance of path | ||
Line 1,528: | Line 1,546: | ||
|0x0010 ||float ||[[049F|distance along path]] | |0x0010 ||float ||[[049F|distance along path]] | ||
|- | |- | ||
− | |0x0014 ||float || | + | |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 | ||
+ | |} | ||
+ | <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 | ||
+ | |- | ||
+ | |0x0000 ||float[3] ||coordinate point | ||
+ | |- | ||
+ | |0x000C ||float ||distance along path to coordinate point | ||
<!-- | <!-- | ||
− | + | 0x0010 - - | |
--> | --> | ||
− | |||
− | |||
|} | |} | ||
+ | </div> | ||
</div> | </div> | ||
</div> | </div> | ||
==== Block 18: Player Info ==== | ==== Block 18: Player Info ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
− | |0x0000 ||dword ||size of block 18 | + | |0x0000 ||dword ||size of block 18 (constant 0x170) |
|- | |- | ||
|0x0004 ||- ||start of block 18, data below | |0x0004 ||- ||start of block 18, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||size of subblock | |0x0000 ||dword ||size of subblock | ||
Line 1,555: | Line 1,587: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | !Offset ||Type ||style="width: | + | !Offset ||Type ||style="width: 100%;" |Description |
|- | |- | ||
|0x0000 ||dword ||current money | |0x0000 ||dword ||current money | ||
Line 1,571: | Line 1,603: | ||
|0x0013 ||dword ||number of packages picked up | |0x0013 ||dword ||number of packages picked up | ||
|- | |- | ||
− | |0x0017 ||dword ||total number of packages | + | |0x0017 ||dword ||[[02ED|total number of packages]] |
|- | |- | ||
|0x001B ||byte ||[[0330|never gets tired]] | |0x001B ||byte ||[[0330|never gets tired]] | ||
|- | |- | ||
− | |0x001C ||byte || | + | |0x001C ||byte ||[[0331|fast reload]] |
|- | |- | ||
− | |0x001D ||byte || | + | |0x001D ||byte ||[[055D|fire proof]] |
|- | |- | ||
|0x001E ||byte ||max health | |0x001E ||byte ||max health | ||
Line 1,590: | Line 1,622: | ||
<!-- | <!-- | ||
0x0023 - - | 0x0023 - - | ||
− | 0x0069 | + | --> |
+ | |- | ||
+ | |0x0069 ||byte ||Rosenberg's audio status | ||
+ | <!-- | ||
0x006A - - | 0x006A - - | ||
--> | --> | ||
Line 1,598: | Line 1,633: | ||
==== Block 19: Stats ==== | ==== Block 19: Stats ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 19 |
− | | dword | ||
− | | size of block 19 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 19, data below |
− | | - | ||
− | | start of block 19, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock |
− | | dword | ||
− | | size of subblock | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||people wasted by player |
− | | dword | ||
− | | people wasted by player | ||
|- | |- | ||
− | | | + | |0x0004 ||dword ||people wasted by others |
− | | dword | ||
− | | people wasted by others | ||
|- | |- | ||
− | | | + | |0x0008 ||dword ||road vehicles destroyed |
− | | dword | ||
− | | road vehicles destroyed | ||
|- | |- | ||
− | | | + | |0x000C ||dword ||boats destroyed |
− | | dword | ||
− | | boats destroyed | ||
|- | |- | ||
− | | | + | |0x0010 ||dword ||tires popped with gunfire |
− | | dword | ||
− | | tires popped with gunfire | ||
|- | |- | ||
− | | | + | |0x0014 ||dword ||bullets fired |
− | | dword | ||
− | | bullets fired | ||
|- | |- | ||
− | | | + | |0x0018 ||dword[23] ||peds of [[ped type]] wasted |
− | | dword[23] | ||
− | | peds of [[ped type]] wasted | ||
|- | |- | ||
− | | | + | |0x0074 ||dword ||planes and helicopters destroyed |
− | | dword | ||
− | | planes and helicopters destroyed | ||
|- | |- | ||
− | | | + | |0x0078 ||float ||[[030C|current progress]] |
− | | float | ||
− | | | ||
|- | |- | ||
− | | | + | |0x007C ||float ||[[030D|total progress]] |
− | | float | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0080 ||dword ||kilograms of explosives used |
− | | dword | ||
− | | kilograms of explosives used | ||
|- | |- | ||
− | | | + | |0x0084 ||dword ||bullets that hit |
− | | dword | ||
− | | bullets that hit | ||
|- | |- | ||
− | | | + | |0x0088 ||dword ||number of headshots |
− | | dword | ||
− | | number of headshots | ||
|- | |- | ||
− | | | + | |0x008C ||dword ||total number of wanted stars attained |
− | | dword | ||
− | | total number of wanted stars attained | ||
|- | |- | ||
− | | | + | |0x0090 ||dword ||total number of wanted stars evaded |
− | | dword | ||
− | | total number of wanted stars evaded | ||
|- | |- | ||
− | | | + | |0x0094 ||dword ||times busted |
− | | dword | ||
− | | times busted | ||
|- | |- | ||
− | | | + | |0x0098 ||dword ||hospital visits |
− | | dword | ||
− | | hospital visits | ||
|- | |- | ||
− | | | + | |0x009C ||dword ||days passed in game |
− | | dword | ||
− | | days passed in game | ||
|- | |- | ||
− | | | + | |0x00A0 ||dword ||safehouse visits |
− | | dword | ||
− | | safehouse visits | ||
|- | |- | ||
− | | | + | |0x00A4 ||dword ||sprayings |
− | | dword | ||
− | | sprayings | ||
|- | |- | ||
− | | | + | |0x00A8 ||float ||[[030E|max insane jump distance]] |
− | | float | ||
− | | max insane | ||
|- | |- | ||
− | | | + | |0x00AC ||float ||[[030F|max insane jump height]] |
− | | float | ||
− | | max insane | ||
|- | |- | ||
− | | | + | |0x00B0 ||dword ||[[0310|max insane jump flips]] |
− | | dword | ||
− | | max insane | ||
|- | |- | ||
− | | | + | |0x00B4 ||dword ||[[0311|max insane jump rotation]] |
− | | dword | ||
− | | max insane | ||
|- | |- | ||
− | | | + | |0x00B8 ||dword ||[[0312|best insane stunt so far]] |
− | | dword | ||
− | | best insane stunt so far | ||
|- | |- | ||
− | | | + | |0x00BC ||dword ||[[0313|unique jumps completed]] |
− | | dword | ||
− | | unique jumps completed | ||
|- | |- | ||
− | | | + | |0x00C0 ||dword ||[[0314|total unique jumps]] |
− | | dword | ||
− | | total unique jumps | ||
|- | |- | ||
− | | | + | |0x00C4 ||dword ||[[0317|mission attempts]] |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x00C8 ||dword ||[[0315|passengers dropped off]] |
− | | dword | ||
− | | passengers dropped off | ||
|- | |- | ||
− | | | + | |0x00CC ||dword ||[[0316|cash made in taxi]] |
− | | dword | ||
− | | cash made in taxi | ||
|- | |- | ||
− | | | + | |0x00D0 ||dword ||Portland passed (unused) |
− | | dword | ||
− | | unused | ||
|- | |- | ||
− | | | + | |0x00D4 ||dword ||Staunton passed (unused) |
− | | dword | ||
− | | unused | ||
|- | |- | ||
− | | | + | |0x00D8 ||dword ||Shoreside passed (unused) |
− | | dword | ||
− | | unused | ||
|- | |- | ||
− | | | + | |0x00DC ||dword ||[[055A|porn leaflet rubbish visibility]] |
− | | dword | ||
− | | porn leaflet rubbish visibility | ||
|- | |- | ||
− | | | + | |0x00E0 ||dword ||[[057C|allows hurricane weather]] |
− | | dword | ||
− | | allows hurricane weather | ||
|- | |- | ||
− | | | + | |0x00E4 ||float ||distance traveled on foot |
− | | float | ||
− | | distance traveled foot | ||
|- | |- | ||
− | | | + | |0x00E8 ||float ||distance traveled by car |
− | | float | ||
− | | distance traveled car | ||
|- | |- | ||
− | | | + | |0x00EC ||float ||distance traveled by bike |
− | | float | ||
− | | distance traveled bike | ||
|- | |- | ||
− | | | + | |0x00F0 ||float ||distance traveled by boat |
− | | float | ||
− | | distance traveled boat | ||
|- | |- | ||
− | | | + | |0x00F4 ||float ||distance traveled by golf cart |
− | | float | ||
− | | distance traveled golf cart | ||
|- | |- | ||
− | | | + | |0x00F8 ||float ||distance traveled by helicopter |
− | | float | ||
− | | distance traveled helicopter | ||
|- | |- | ||
− | | | + | |0x00FC ||float ||distance traveled by plane |
− | | float | ||
− | | distance traveled plane | ||
|- | |- | ||
− | | | + | |0x0100 ||dword ||[[0401|people saved in an ambulance]] |
− | | dword | ||
− | | people saved in an ambulance | ||
|- | |- | ||
− | | | + | |0x0104 ||dword ||[[0402|criminals killed on vigilante mission]] |
− | | dword | ||
− | | criminals killed on vigilante mission | ||
|- | |- | ||
− | | | + | |0x0108 ||dword ||[[0404|total fires extinguished]] |
− | | dword | ||
− | | total fires extinguished | ||
|- | |- | ||
− | | | + | |0x010C ||dword ||[[0578|highest vigilante mission level]] |
− | | dword | ||
− | | highest vigilante mission level | ||
|- | |- | ||
− | | | + | |0x0110 ||dword ||[[0403|highest paramedic mission level]] |
− | | dword | ||
− | | highest paramedic mission level | ||
|- | |- | ||
− | | | + | |0x0114 ||dword ||[[0599|fire truck mission level]] |
− | | dword | ||
− | | fire truck mission level | ||
|- | |- | ||
− | | | + | |0x0118 ||dword ||photographs taken |
− | | dword | ||
− | | photographs taken | ||
|- | |- | ||
− | | | + | |0x011C ||dword ||rampages passed |
− | | dword | ||
− | | rampages passed | ||
|- | |- | ||
− | | | + | |0x0120 ||dword ||[[0408|total number of rampages]] |
− | | dword | ||
− | | total number of rampages | ||
|- | |- | ||
− | | | + | |0x0124 ||dword ||[[042C|total number of missions]] |
− | | dword | ||
− | | total number of missions | ||
|- | |- | ||
− | | | + | |0x0128 ||dword ||flight hours |
− | | dword | ||
− | | flight hours | ||
|- | |- | ||
− | | | + | |0x012C ||dword ||fishes fed (number of times drowned) |
− | | dword | ||
− | | fishes fed (number of times drowned) | ||
|- | |- | ||
− | | | + | |0x0130 ||dword ||seagulls sniped |
− | | dword | ||
− | | seagulls sniped | ||
|- | |- | ||
− | | | + | |0x0134 ||float ||[[0528|weapon budget]] |
− | | float | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0138 ||float ||[[04CF|fashion budget]] |
− | | float | ||
− | | | ||
|- | |- | ||
− | | | + | |0x013C ||float ||visits from loan sharks (unused) |
− | | float | ||
− | | visits from loan sharks (unused) | ||
|- | |- | ||
− | | | + | |0x0140 ||float ||[[0531|stores knocked off]] |
− | | float | ||
− | | stores knocked off | ||
|- | |- | ||
− | | | + | |0x0144 ||float ||movie stunts (unused) |
− | | float | ||
− | | movie stunts (unused) | ||
|- | |- | ||
− | | | + | |0x0148 ||float ||[[0533|assassination contracts completed]] |
− | | float | ||
− | | assassination contracts completed | ||
|- | |- | ||
− | | | + | |0x014C ||float ||[[0534|pizzas delivered]] |
− | | float | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0150 ||float ||garbage pickups made (unused) |
− | | float | ||
− | | garbage pickups made (unused) | ||
|- | |- | ||
− | | | + | |0x0154 ||float ||[[0536|'ice cream' sold]] |
− | | float | ||
− | | 'ice cream' sold | ||
|- | |- | ||
− | | | + | |0x0158 ||float ||top shooting range score (unused, see 0x01FF) |
− | | float | ||
− | | top shooting range score (unused, see | ||
|- | |- | ||
− | | | + | |0x015C ||float ||shooting range rank (unused, see 0x01FF) |
− | | float | ||
− | | shooting range rank (unused, see | ||
|- | |- | ||
− | | | + | |0x0160 ||dword ||longest wheelie time |
− | | dword | ||
− | | longest wheelie time | ||
|- | |- | ||
− | | | + | |0x0164 ||dword ||longest stoppie time |
− | | dword | ||
− | | longest stoppie time | ||
|- | |- | ||
− | | | + | |0x0168 ||dword ||longest two wheels time |
− | | dword | ||
− | | longest | ||
|- | |- | ||
− | | | + | |0x016C ||dword ||longest wheelie distance |
− | | dword | ||
− | | longest wheelie distance | ||
|- | |- | ||
− | | | + | |0x0170 ||dword ||longest stoppie distance |
− | | dword | ||
− | | longest stoppie distance | ||
|- | |- | ||
− | | | + | |0x0174 ||dword ||longest two wheels distance |
− | | dword | ||
− | | longest | ||
|- | |- | ||
− | | | + | |0x0178 ||dword ||[[0529|property budget]] |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x017C ||dword ||auto repair and painting budget |
− | | dword | ||
− | | auto repair and painting budget | ||
|- | |- | ||
− | | | + | |0x0180 ||dword ||property destroyed |
− | | dword | ||
− | | property destroyed | ||
|- | |- | ||
− | | | + | |0x0184 ||dword ||[[0542|number of properties owned]] |
− | | dword | ||
− | | number of properties owned | ||
|- | |- | ||
− | | | + | |0x0188 ||dword ||[[0543|bloodring kills]] |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x018C ||dword ||[[0544|longest time in bloodring]] |
− | | dword | ||
− | | longest time in bloodring | ||
|- | |- | ||
− | | | + | |0x0190 ||byte[15] ||[[0542|properties owned]] |
− | | byte[15] | ||
− | | | ||
|- | |- | ||
− | | | + | |0x019F ||dword ||highest media attention |
− | | dword | ||
− | | highest media attention | ||
|- | |- | ||
− | | | + | |0x01A3 ||dword[23] ||[[042E|best times for races/vehicle missions in seconds]] |
− | | dword[23] | ||
− | | best times for races/vehicle missions in seconds | ||
|- | |- | ||
− | | | + | |0x01FF ||dword[5] ||[[042F|minigame records]] |
− | | dword[5] | + | *0 - Highest score for Shooter |
− | | | + | *1 - Best Percentage of hits for Shooter |
− | * 0 - Highest score for Shooter | + | *2 - Number of drug deals made |
− | * 1 - Best Percentage of hits for Shooter | + | *3 - Highest score with Keepie-Uppy beach ball |
− | * 2 - Number of drug deals made | + | *4 - Unused |
− | * 3 - Highest score with Keepie-Uppy beach ball | ||
− | * 4 - Unused | ||
|- | |- | ||
− | | | + | |0x0213 ||dword ||[[0582|hotring best result]] |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0217 ||dword ||peds killed recently (always zero while saving) |
− | | dword | ||
− | | peds killed recently (always zero while saving) | ||
|- | |- | ||
− | | | + | |0x021B ||dword ||total peds killed (used for calculating rating) |
− | | dword | ||
− | | total peds killed (used for calculating rating) | ||
|- | |- | ||
− | | | + | |0x021F ||char[8] ||[[0318|last passed mission]] GXT key |
− | | char[8] | ||
− | | last passed mission | ||
|- | |- | ||
− | | | + | |0x0227 ||dword ||cheat rating |
− | | dword | ||
− | | cheat rating | ||
|- | |- | ||
− | | | + | |0x022B ||float[10] ||listening time per [[List of radio stations (VC)|radio station]] in milliseconds |
− | | float[10] | ||
− | | listening time per [[List of radio stations (VC)|radio station]] in milliseconds | ||
|} | |} | ||
</div> | </div> | ||
Line 1,992: | Line 1,837: | ||
==== Block 20: Set Pieces ==== | ==== Block 20: Set Pieces ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 20 |
− | | dword | ||
− | | size of block 20 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 20, data below |
− | | - | ||
− | | start of block 20, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock |
− | | dword | ||
− | | size of subblock | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||number of [[04F8|set pieces]] |
− | | dword | ||
− | | number of | ||
|- | |- | ||
− | | | + | |0x0004 ||SetPiece[96] ||set piece structures (see below) |
− | | [96] | ||
− | | | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|SetPiece ({{Hint|0x38|56}} bytes): |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||type |
− | | dword | ||
− | | type | ||
|- | |- | ||
− | | | + | |0x0008 ||float ||timer |
− | | float | ||
− | | timer | ||
|- | |- | ||
− | | | + | |0x0008 ||float ||trigger area x1 |
− | | float | ||
− | | trigger area x1 | ||
|- | |- | ||
− | | | + | |0x000C ||float ||trigger area y2 |
− | | float | ||
− | | trigger area y2 | ||
|- | |- | ||
− | | | + | |0x0010 ||float ||trigger area x2 |
− | | float | ||
− | | trigger area x2 | ||
|- | |- | ||
− | | | + | |0x0014 ||float ||trigger area y1 |
− | | float | ||
− | | trigger area y1 | ||
|- | |- | ||
− | | | + | |0x0018 ||float[2] ||policeA spawn x,y |
− | | float[2] | ||
− | | policeA spawn x,y | ||
|- | |- | ||
− | | | + | |0x0020 ||float[2] ||policeB spawn x,y |
− | | float[2] | ||
− | | policeB spawn x,y | ||
|- | |- | ||
− | | | + | |0x0028 ||float[2] ||policeA heading x,y |
− | | float[2] | ||
− | | policeA heading x,y | ||
|- | |- | ||
− | | | + | |0x0030 ||float[2] ||policeB heading x,y |
− | | float[2] | ||
− | | policeB heading x,y | ||
|} | |} | ||
</div> | </div> | ||
Line 2,085: | Line 1,890: | ||
==== Block 21: Streaming ==== | ==== Block 21: Streaming ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 2,099: | Line 1,902: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
Line 2,113: | Line 1,914: | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
| 0x00 | | 0x00 | ||
− | | | + | |style="white-space: nowrap;" |300 bytes |
− | | streaming | + | | streaming flags for first 300 model indices (0-299) (-1 if model is not loaded) |
|} | |} | ||
</div> | </div> | ||
Line 2,126: | Line 1,925: | ||
==== Block 22: Ped Types ==== | ==== Block 22: Ped Types ==== | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of block 22 |
− | | dword | ||
− | | size of block 22 | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of block 22, data below |
− | | - | ||
− | | start of block 22, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||size of subblock (constant 0x2E8) |
− | | dword | ||
− | | size of subblock (constant 0x2E8) | ||
|- | |- | ||
− | | | + | |0x0004 ||- ||start of subblock, data below |
− | | - | ||
− | | start of subblock, data below | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||char[4] ||<code>PTP\0</code> |
− | | char[4] | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0004 ||dword ||size of rest of subblock |
− | | dword | ||
− | | | ||
|- | |- | ||
− | | | + | |0x0008 ||PedType[23] ||ped type structures (see below) |
− | | | ||
− | | | ||
|} | |} | ||
<div style="margin-left: 3em;"> | <div style="margin-left: 3em;"> | ||
− | {| class="wikitable" | + | {|class="wikitable" style="max-width: 48em;" |
− | |+ style="text-align: left;"| | + | |+ style="text-align: left;"|PedType ({{Hint|0x20|32}} bytes): |
− | ! Offset | + | !Offset ||Type ||style="width: 100%;" |Description |
− | |||
− | |||
|- | |- | ||
− | | | + | |0x0000 ||dword ||bitstring (each associated to an entry in ped.dat) |
− | | dword | ||
− | | bitstring (each associated to an entry in ped.dat) | ||
|- | |- | ||
− | | | + | |0x0004 ||float ||first value/50.0 |
− | | float | ||
− | | first value/50.0 | ||
|- | |- | ||
− | | | + | |0x0008 ||float ||second value/50.0 |
− | | float | ||
− | | second value/50.0 | ||
|- | |- | ||
− | | | + | |0x000C ||float ||third value/50.0 |
− | | float | ||
− | | third value/50.0 | ||
|- | |- | ||
− | | | + | |0x0010 ||float ||fourth value |
− | | float | ||
− | | fourth value | ||
|- | |- | ||
− | | | + | |0x0014 ||float ||fifth value |
− | | float | ||
− | | fifth value | ||
|- | |- | ||
− | | | + | |0x0018 ||dword ||threat flags |
− | | dword | ||
− | | threat flags | ||
|- | |- | ||
− | | | + | |0x001C ||dword ||avoid flags |
− | | dword | ||
− | | avoid flags | ||
|} | |} | ||
</div> | </div> | ||
Line 2,224: | 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}} – 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 |
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 |
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) |
Offset | Type | Description |
---|---|---|
0x0000 | dword | object type
|
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) |
Offset | Type | Description |
---|---|---|
0x0000 | dword | object type
|
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 |
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 |
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.
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
|
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) |
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 |
Offset | Type | Description |
---|---|---|
0x0000 | byte | type |
0x0001 | byte | state
|
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) |
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 |
Offset | Type | Description |
---|---|---|
0x0000 | dword | vehicle type
|
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):
Offset | Type | Description |
---|---|---|
0x0034 | float[3] | x,y,z coordinates |
0x005C | word | IDE model number |
If vehicle is type boat:
Offset | Type | Description |
---|---|---|
0x0034 | float[3] | x,y,z coordinates |
0x005C | word | IDE model number |
If vehicle is type bike:
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 |
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) |
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
|
0x0075 | byte | crane status
|
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) |
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) |
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
|
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) |
Offset | Type | Description |
---|---|---|
0x0000 | dword | blip color |
0x0004 | float | debug sphere cross offset, unused, always 1.0 |
0x0008 | dword | blip type
|
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
|
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 |
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 |
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) |
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) |
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 |
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) |
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 |
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
|
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) |
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) |
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
- Very old development topic – retrieved from archive.org
- GTAForums: Current development topic
- GTAForums: Savefile Editor, by voodoo48
- GTAForums: Vice City Save Converter, by Silent – converts between Steam and retail versions
- 010 template for VC save files
Savegame | |
---|---|
Formats | Saves (GTA 3) • Saves (GTA VC) • Saves (GTA SA) • Saves (GTA LCS) • Saves (GTA 4) |
Tools | GTASnP - Save File Sharing • GTAForums: GTASum Gamesave Checksum Calculator |
Resources | GTAForums: GTA III Save File Documentation • GTAForums: Vice City Save File Format • Savegames Formats Description |