This article deals with the format of a save game file for the PC version of GTA 3.
Location
By default, the game places its save game files into the folder "GTA3 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 GTA3sfX.b where X represents the in-game slot number. There are 8 slots available in the game (1-8).
Format Details
- Save files are ALWAYS 0x3145C (201820) bytes long.
- Byte order is little endian. For example, the number 3452 (0x0D7C) is represented as as 0x7C 0x0D.
- File is divided into 20 blocks, followed by padding and then ending with a 4-byte checksum
Data Blocks
There is a DWORD value preceding any block of data which is equal to the size of the block.
Block 0: SimpleVars
Game "meta-information" giving the overall state of things. Also includes 'TheScripts' sub-block.
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
wchar_t[24] |
save name (long names are truncated on the save/load screen)
|
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
|
0x0044 |
enum |
current island (1=Portland; 2=Staunton; 3=Shoreside Vale)
|
0x0048 |
float[3] |
camera coordinates (x,y,z)
|
0x0054 |
dword |
length (ms) of in-game minute
|
0x0058 |
dword |
last clock tick (weather timer)
|
0x005C |
byte |
game hour
|
0x005D |
byte[3] |
(align)
|
0x0060 |
byte |
game minute
|
0x0061 |
byte[3] |
(align)
|
0x0064 |
word |
current pad mode
|
0x0066 |
byte[2] |
(align)
|
0x0068 |
dword |
time in milliseconds (global timer)
|
0x006C |
float |
time scale (opcode 051D)
|
0x0070 |
float |
time step (frame delta time)
|
0x0074 |
float |
time step (not clipped)
|
0x0078 |
dword |
number of the frames processed from the beginning of the game
|
0x007C |
float |
time step #2 (constant 1.0, unused)
|
0x0080 |
float |
frames per update (constant 1.0, unused)
|
0x0084 |
float |
time scale (constant 1.0, unused)
|
0x0088 |
word |
old weather type
|
0x008A |
byte[2] |
(align)
|
0x008C |
word |
new weather type
|
0x008E |
byte[2] |
(align)
|
0x0090 |
word |
forced weather type
|
0x0092 |
byte[2] |
(align)
|
0x0094 |
float |
weather interpolation value
|
0x0098 |
byte[24] |
compilation date and time (unused, always 0)
|
0x00B0 |
dword |
weather type in list
|
0x00B4 |
float |
(unknown, camera related)
|
0x00B8 |
float |
(unknown, camera related)
|
0x00BC |
dword |
block size
|
0x00C0 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'SCR\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
script global variable space size (n)
|
0x0004 |
dword[n/4] |
script global variables dump
|
0x0004 + n |
dword |
block size (always 0x03C8)
|
0x0008 + n |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
$onmission offset in global variable space
|
0x0004 |
ContactInfo[16] |
8 bytes each, contact info
|
ContactInfo
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
mission flag (opcode 0181)
|
0x0004 |
dword |
base brief (opcode 0182)
|
0x0084 |
Unknown[4] |
(unknown)
|
0x0184 |
dword |
last mission passed time
|
0x0188 |
BuildingSwap[25] |
16 bytes each, building model replacements
|
BuildingSwap
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
type
|
0x0004 |
dword |
building handle
|
0x0008 |
dword |
new model
|
0x000C |
dword |
old model
|
0x0318 |
InvisibliltySetting[20] |
8 bytes each, invisible objects
|
InvisibilitySetting
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
type
|
0x0004 |
dword |
handle
|
0x03B8 |
byte |
already running a mission script flag (0 = false, 1 = true)
|
0x03B9 |
byte[3] |
(align)
|
0x03BC |
dword |
size of the MAIN section in the main.scm
|
0x03C0 |
dword |
size of largest mission
|
0x03C4 |
word |
number of exclusive mission scripts
|
0x03C6 |
byte[2] |
(align)
|
0x03D0 + n |
dword |
number of active scripts (n2)
|
0x03D4 + n |
CRunningScript[n2] |
136 bytes each, active scripts
|
CRunningScript
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
CRunningScript * |
next script pointer
|
0x0004 |
CRunningScript * |
previous script pointer
|
0x0008 |
char[8] |
name
|
0x0010 |
dword |
current ip
|
0x0014 |
dword[4] |
return stack
|
0x0024 |
dword |
(unknown)
|
0x0028 |
dword |
(unknown)
|
0x002C |
word |
stack counter
|
0x002E |
word |
(unknown)
|
0x0030 |
dword[16] |
local variables
|
0x0070 |
dword |
timerA
|
0x0074 |
dword |
timerB
|
0x0078 |
byte |
if result
|
0x0079 |
byte |
(unknown)
|
0x007A |
byte |
(unknown)
|
0x007B |
byte |
(align)
|
0x007C |
dword |
wake time
|
0x0080 |
word |
if number
|
0x0082 |
byte |
(unknown)
|
0x0083 |
byte |
(unknown)
|
0x0084 |
byte |
(unknown)
|
0x0085 |
byte |
(unknown)
|
0x0086 |
byte |
(unknown)
|
0x0087 |
byte |
(unknown)
|
Block 1: Player peds
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
players count (n)
|
0x0004 |
PlayerPed[n] |
player peds array
|
PlayerPed
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
unknown
|
0x0004 |
word |
unknown
|
0x0006 |
dword |
(unknown) ped reference
|
0x000A |
CPed |
CPed dump (0x05F0 bytes)
|
CPed
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
byte[52] |
unknown
|
0x0034 |
float[3] |
position (X, Y, Z)
|
0x0040 |
byte[1456] |
unknown
|
0x05FA |
dword |
max wanted level
|
0x05FE |
dword |
max chaos level
|
0x0602 |
char[24] |
model name
|
0x061A |
byte[2] |
(align)
|
Block 2: Garages
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
garages count (n)
|
0x0004 |
dword |
free bombs (opcode 021D)
|
0x0008 |
dword |
free resprays (opcode 0335)
|
0x000C |
dword |
(unknown)
|
0x0010 |
dword |
(unknown)
|
0x0014 |
dword |
(unknown)
|
0x0018 |
dword |
Portland IE status (bitstring) (opcode 03D4)
|
0x001C |
dword |
Shoreside IE status
|
0x0020 |
dword |
unused IE status
|
0x0024 |
dword |
time when 'GA_21' was last shown
|
0x0028 |
StoredCar[18] |
40 bytes each, stored cars
|
StoredCar
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
model ID
|
0x0004 |
float[3] |
position (X, Y, Z)
|
0x0010 |
float[3] |
vector rotation
|
0x001C |
dword |
immunities (bitstring) (see below)
|
0x0020 |
byte |
primary color ID
|
0x0021 |
byte |
secondary color ID
|
0x0022 |
byte |
radio station ID (see below)
|
0x0023 |
byte |
model variation A
|
0x0024 |
byte |
model variation B
|
0x0025 |
byte |
bomb type ID (see below)
|
0x0026 |
byte[2] |
(align)
|
0x02F8 |
Garage[n] |
140 bytes each, garages
|
Garage
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
byte |
garage type ID (see Garage)
|
0x0001 |
byte |
(unknown)
|
0x0002 |
byte |
(unknown)
|
0x0003 |
byte |
(unknown)
|
0x0004 |
byte |
(unknown)
|
0x0005 |
byte |
(unknown)
|
0x0006 |
byte[2] |
(align)
|
0x0008 |
dword |
(unknown)
|
0x000C |
dword |
(unknown) pointer
|
0x0010 |
dword |
(unknown) pointer
|
0x0014 |
byte |
(unknown)
|
0x0015 |
byte |
(unknown)
|
0x0016 |
byte |
(unknown)
|
0x0017 |
byte |
(unknown)
|
0x0018 |
byte |
(unknown)
|
0x0019 |
byte |
(unknown)
|
0x001A |
byte |
(unknown)
|
0x001B |
byte |
(align)
|
0x001C |
float[6] |
position (x1, x2, y1, y2, z1, z2)
|
0x0034 |
float |
door open start (z coord) (how far door is open when garage is loaded into view)
|
0x0038 |
float |
door open (z coord) (how far door can open)
|
0x003C |
float |
(unknown) x coord
|
0x0040 |
float |
(unknown) y coord
|
0x0044 |
float |
(unknown) x coord
|
0x0048 |
float |
(unknown) y coord
|
0x004C |
float |
door A position (z coord)
|
0x0050 |
float |
door B position (z coord)
|
0x0054 |
dword |
(unknown)
|
0x0058 |
byte |
(unknown)
|
0x0059 |
byte[3] |
(align)
|
0x005C |
dword |
(unknown)
|
0x0060 |
dword |
(unknown)
|
0x0064 |
dword |
(unknown)
|
0x0068 |
float |
(unknown)
|
0x006C |
float |
(unknown)
|
0x0070 |
float |
(unknown)
|
0x0074 |
float |
(unknown)
|
0x0078 |
float |
(unknown)
|
0x007C |
float |
(unknown)
|
0x0080 |
dword |
(unknown)
|
0x0084 |
byte |
(unknown)
|
0x0085 |
byte |
(unknown)
|
0x0086 |
byte |
(unknown)
|
0x0087 |
byte |
(unknown)
|
0x0088 |
byte |
(unknown)
|
0x0089 |
byte |
(unknown)
|
0x008A |
byte[2] |
(align)
|
Vehicle immunities:
- 0b00000001 = bulletproof
- 0b00000010 = fireproof
- 0b00000100 = explosion-proof
- 0b00001000 = collision-proof
- 0b00010000 = ?
Radio stations:
- 0 = Head Radio
- 1 = Double Clef FM
- 2 = Jah Radio
- 3 = Rise FM
- 4 = Lips 106
- 5 = Game FM
- 6 = MSX FM
- 7 = Flashback 95.6
- 8 = Chatterbox 109
- 9 = User track player (if user tracks loaded, random station otherwise)
- 10 = Police radio
- 11 = Radio off
Bomb types:
- 0 = no bomb
- 1 = timer bomb
- 2 = ignition bomb
- 3 = remote bomb
- 4 = timer bomb (armed)
- 5 = ignition bomb (armed)
Block 3: Vehicles
TYPE
|
OFFSET
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
TYPE
|
OFFSET
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
TYPE
|
OFFSET
|
DESCRIPTION
|
0x0000 |
dword |
number of vehicles (n)
|
0x0004 |
dword |
number of boats (n2)
|
0x0008 |
Vehicle[n] |
1458 bytes each, vehicles array
|
Vehicle
TYPE
|
OFFSET
|
DESCRIPTION
|
0x0000 |
dword |
unknown
|
0x0004 |
word |
model ID
|
0x0006 |
dword |
unknown
|
0x000A |
CVehicle |
CVehicle dump
|
CVehicle
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
byte[52] |
unknown
|
0x0034 |
float[3] |
position (X, Y, Z)
|
0x0040 |
byte[1384] |
unknown
|
0x0000 + (1458 * n) |
Boat[n2] |
1166(?) bytes each, boats array
|
Boat
TYPE
|
OFFSET
|
DESCRIPTION
|
0x0000 |
dword |
unknown
|
0x0004 |
word |
model ID
|
0x0006 |
dword |
unknown
|
0x000A |
CBoat |
CBoat dump
|
CBoat
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
byte[52] |
unknown
|
0x0034 |
float[3] |
position (X, Y, Z)
|
0x0040 |
byte[1092] |
unknown
|
Block 4: Objects
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
number of objects (n)
|
0x0004 |
CObject[n] |
Objects
|
CObject
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
word |
model id
|
0x0002 |
dword |
object reference
|
0x0006 |
float[3] |
pos
|
0x0012 |
byte[12] |
unknown
|
0x001E |
float |
unknown
|
0x0022 |
float[3] |
unknown
|
0x002E |
byte[12] |
unknown
|
0x003A |
byte |
unknown
|
0x003B |
byte |
unknown
|
0x003C |
byte |
unknown
|
0x003D |
byte |
unknown
|
0x003E |
byte |
unknown
|
0x003F |
byte |
unknown
|
0x0040 |
byte |
unknown
|
0x0041 |
byte |
unknown
|
0x0042 |
float |
unknown
|
0x0046 |
byte |
unknown
|
0x0047 |
byte |
unknown
|
0x0048 |
dword |
unknown
|
0x004C |
dword |
unknown
|
0x0050 |
dword |
unknown
|
Block 5: Path find
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
number of entries (n)
|
0x0004 |
byte[n] |
unknown flags
|
Block 6: Cranes
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
number of cranes (n)
|
0x0004 |
dword |
cars collected by military crane (opcode 03EC)
|
0x0008 |
Crane[8] |
Crane data
|
Crane
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
index in static objects pool
|
0x0004 |
dword |
unknown
|
0x0008 |
dword |
unknown
|
0x000C |
float[25] |
unknown
|
0x0070 |
dword |
unknown
|
0x0074 |
dword |
unknown
|
0x0078 |
byte[7] |
unknown
|
0x007F |
byte |
(align)
|
Block 7: Pickups
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
Pickup[336] |
pickups structures -- each is 0x1C bytes in size; see details below
|
Pickup
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
byte |
type
|
0x0001 |
byte |
unknown
|
0x0002 |
word |
ammo (for weapon pickups)
|
0x0004 |
dword |
index in objects pool
|
0x0008 |
dword |
regeneration time
|
0x000C |
word |
model id
|
0x000E |
word |
flags
|
0x0010 |
float[3] |
x,y,z position
|
0x24C0 |
word |
number of pickups collected
|
0x24C2 |
byte[2] |
(align)
|
0x24C4 |
CollectedPickup[4] |
exact meaning is unknown -- each is 0x14 bytes in size; see details below
|
CollectedPickup
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
unknown
|
0x0004 |
dword |
unknown
|
0x0008 |
dword |
unknown
|
0x000C |
dword |
unknown
|
0x0010 |
dword |
unknown
|
Block 8: Phone info
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
number of phones (n)
|
0x0004 |
dword |
number of active phones
|
0x0008 |
PhoneInfo[n] |
52 bytes each, phone info structs
|
OFFSET
|
TYPE
|
DESCRIPTION
|
PhoneInfo
0x0000 |
float[3] |
position (X, Y, Z)
|
0x000C |
dword[6] |
phone text (?)
|
0x0024 |
dword |
(unknown)
|
0x0028 |
dword |
static index
|
0x002C |
dword |
status (3 = idle, 9 = ringing)
|
0x0030 |
byte |
(unknown)
|
0x0031 |
byte[3] |
(align)
|
Block 9: Restarts
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size (constant 0x128)
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size (constant 0x124)
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'RST\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
RestartPoint[8] |
restart point after wasted
|
0x0080 |
RestartPoint[8] |
restart point after busted
|
0x0100 |
word |
wasted restart points count
|
0x0102 |
word |
busted restart points count
|
0x0104 |
byte |
override next restart flag (opcodes 016E, 0255)
|
0x0105 |
byte[3] |
(align)
|
0x0108 |
RestartPoint |
overriden restart point (opcodes 016E, 0255)
|
0x0118 |
byte |
fade in after next death flag (opcode 040F)
|
0x0119 |
byte |
fade in after next arrest flag (opcode 040E)
|
0x011A |
byte |
override hospital level flag (opcode 041F)
|
0x011B |
byte |
override police level flag (opcode 0420)
|
RestartPoint
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
float[3] |
x,y,z coordinates
|
0x000C |
float |
z_angle
|
Block 10: Radar
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'RDR\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
RadarBlip[32] |
radar blips structures -- each is 0x30 bytes in size, see below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
RadarBlip
0x0000 |
dword |
color (opcode 0165)
|
0x0004 |
dword |
type
|
0x0008 |
dword |
entity (car, actor, object) handle
|
0x000C |
float |
(unknown)
|
0x0010 |
float |
(unknown)
|
0x0014 |
float[3] |
position x,y,z
|
0x0020 |
word |
(unknown)
|
0x0022 |
byte |
brightness (opcode 0166)
|
0x0023 |
byte |
(unknown)
|
0x0024 |
float |
(unknown)
|
0x0028 |
word |
scale (opcode 0168)
|
0x002A |
word |
display (opcode 018B)
|
0x002C |
word |
blip sprite
|
0x002E |
word |
(align)
|
Block 11: Zones
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'ZNS\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
current zone index
|
0x0004 |
dword |
current level (1: Portland, 2: Staunton Island, 3: Shoreside Vale)
|
0x0008 |
word |
find index (index of last search invoked by a script)
|
0x000A |
word |
(align)
|
0x000C |
Zone[50] |
navigation zones (from gta3.zon)
|
0x0AFC |
ZoneInfo[100] |
day/night pairs for each Zone
|
0x21A4 |
word |
total number of navigation zones
|
0x21A6 |
word |
total number of zone infos
|
0x21A8 |
Zone[25] |
map zones (from map.zon)
|
0x2720 |
AudioZone[36] |
audio zones
|
0x2768 |
word |
total number of map zones
|
0x276A |
word |
total number of audio zones
|
OFFSET
|
TYPE
|
DESCRIPTION
|
Zone
0x0000 |
char[8] |
zone name
|
0x0008 |
float[3] |
zone coord A
|
0x0014 |
float[3] |
zone coord B
|
0x0020 |
dword |
zone type (0, 1, 2 or 3 for MapZone)
|
0x0024 |
dword |
zone level (1: Portland, 2: Staunton Island, 3: Shoreside Vale)
|
0x0028 |
word |
zone info id night
|
0x002A |
word |
zone info id day
|
0x002C |
dword |
child zone index
|
0x0030 |
dword |
parent zone index
|
0x0034 |
dword |
sibling zone index
|
OFFSET
|
TYPE
|
DESCRIPTION
|
ZoneInfo
0x0000 |
word |
density
|
OFFSET
|
TYPE
|
DESCRIPTION
|
AudioZone
0x0000 |
word |
zone id
|
Block 12: Gangs
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'GNG\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
Gang[9] |
gang structures -- each is 0x14 bytes in size, see below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
Gang
0x0000 |
dword |
car model id
|
0x0004 |
byte |
ped model override flag (opcode 0410)
|
0x0005 |
byte[3] |
(align)
|
0x0008 |
dword |
primary weapon id
|
0x0010 |
dword |
secondary weapon id
|
Block 13: Car Generators
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'CGN\0' signature
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size (constant 0x0C)
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
car generators count (n)
|
0x0004 |
dword |
active car generators count
|
0x0008 |
byte |
process counter
|
0x0009 |
byte |
generate even if player is close counter
|
0x000A |
byte[2] |
(align)
|
0x0010 |
dword |
size of car generator structs
|
0x0014 |
CarGenerator[n] |
72 bytes each, car generator structs
|
OFFSET
|
TYPE
|
DESCRIPTION
|
CarGenerator
0x0000 |
dword |
model ID
|
0x0004 |
float[3] |
position (X, Y, Z)
|
0x0010 |
float |
z angle
|
0x0014 |
word |
primary color ID
|
0x0016 |
word |
secondary color ID
|
0x0018 |
byte |
force spawn
|
0x0019 |
byte |
alarm (percentage)
|
0x001A |
byte |
locked (percentage)
|
0x001B |
byte |
(align)
|
0x001C |
word |
min delay
|
0x001E |
word |
max delay
|
0x0020 |
dword |
timestamp (time last stolen?)
|
0x0024 |
dword |
(unknown)
|
0x0028 |
dword |
(unknown)
|
0x002C |
float |
(unknown)
|
0x0030 |
float |
(unknown)
|
0x0034 |
float |
(unknown)
|
0x0038 |
float |
(unknown)
|
0x003C |
float |
(unknown)
|
0x0040 |
float |
(unknown)
|
0x0044 |
dword |
(unknown)
|
Block 14: Particles
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
number of particles (n);
|
0x0004 |
Particle[n] |
particle structures -- each is 0x88 bytes in size, see below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
Particle
0x0000 |
dword |
unknown
|
0x0004 |
float |
unknown
|
0x0008 |
dword |
unknown
|
0x000C |
dword |
unknown
|
0x0010 |
dword |
unknown
|
0x0014 |
dword |
unknown
|
0x0018 |
float |
unknown
|
0x001C |
dword |
unknown
|
0x0020 |
dword |
unknown
|
0x0024 |
dword |
unknown
|
0x0028 |
dword |
unknown
|
0x002C |
float |
unknown
|
0x0030 |
dword |
unknown
|
0x0034 |
float[3] |
unknown x,y,z
|
0x0040 |
dword |
unknown
|
0x0044 |
dword |
unknown
|
0x0048 |
dword |
unknown
|
0x004C |
pNext |
pointer to the next particle struct
|
0x0050 |
pPrev |
pointer to the prev particle struct
|
0x0054 |
dword |
unknown
|
0x0058 |
dword |
unknown time
|
0x005C |
dword |
unknown
|
0x0060 |
dword |
unknown
|
0x0064 |
byte |
unknown
|
0x0065 |
byte |
unknown
|
0x0066 |
word |
unknown
|
0x0068 |
word |
unknown
|
0x006A |
byte[2] |
(align)
|
0x006C |
float |
unknown
|
0x0070 |
float |
unknown
|
0x0074 |
float |
unknown
|
0x0078 |
float |
unknown
|
0x007C |
float |
unknown
|
0x0080 |
byte |
unknown
|
0x0081 |
byte |
unknown
|
0x0082 |
byte |
unknown
|
0x0083 |
byte |
unknown
|
0x0084 |
byte |
unknown
|
0x0085 |
byte |
unknown
|
0x0086 |
byte[2] |
(align)
|
Block 15: Audio script objects
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'AUD\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
number of audio script objects (n);
|
0x0004 |
AudioScriptObject[n] |
audio script object structures -- each is 0x18 bytes in size, see below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
AudioScriptObject
0x0000 |
dword |
index?
|
0x0004 |
word |
sound index?
|
0x0006 |
byte[2] |
(align)
|
0x0008 |
float[3] |
position x,y,z
|
0x0014 |
dword |
(unknown)
|
Block 16: Player info
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
player money
|
0x0004 |
byte |
unknown
|
0x0005 |
dword |
unknown
|
0x0009 |
word |
unknown
|
0x000B |
float |
unknown
|
0x000F |
dword |
money amount on screen
|
0x0013 |
dword |
number of hidden packages picked up
|
0x0017 |
dword |
total number of hidden packages (opcode 02ED)
|
0x001B |
byte |
player never gets tired flag (opcode 0330)
|
0x001C |
byte |
player fast reload flag (opcode 0331)
|
0x001D |
byte |
get out of jail free flag (opcode 0413)
|
0x001E |
byte |
free health care flag (opcode 0414)
|
0x001F |
byte[70] |
unknown
|
Block 17: Stats
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
people wasted by player
|
0x0004 |
dword |
people wasted by others
|
0x0008 |
dword |
cars exploded
|
0x000C |
dword |
shots made
|
0x0010 |
dword[23] |
peds of type wasted
|
0x006C |
dword |
helis destroyed
|
0x0070 |
dword |
player progress
|
0x0074 |
dword |
progress total (opcode 030D)
|
0x0078 |
dword |
kgs explosives used
|
0x007C |
dword |
bullets fired
|
0x0080 |
dword |
bullets that hit
|
0x0084 |
dword |
cars crushed
|
0x0088 |
dword |
headshots made
|
0x008C |
dword |
times busted
|
0x0090 |
dword |
hospital visits
|
0x0094 |
dword |
days passed
|
0x0098 |
dword |
mm rain fallen
|
0x009C |
dword |
max insane jump distance
|
0x00A0 |
dword |
max insane jump height
|
0x00A4 |
dword |
max insane jump flips
|
0x00A8 |
dword |
max insane jump rotation
|
0x00AC |
dword |
best stunt so far (see table below)
|
0x00B0 |
dword |
unique stunt jumps found (opcode 0313)
|
0x00B4 |
dword |
unique stunt jumps total (opcode 0314)
|
0x00B8 |
dword |
missions attempts (opcode 0317)
|
0x00BC |
dword |
missions passed (opcode 030C)
|
0x00C0 |
dword |
passengers dropped off (opcode 0315)
|
0x00C4 |
dword |
cash made in taxi (opcode 0316)
|
0x00C8 |
dword |
Portland passed
|
0x00CC |
dword |
Staunton Island passed
|
0x00D0 |
dword |
Shoreside Vale passed
|
0x00D4 |
dword |
el burro time (Best 'Turismo' time in secs)
|
0x00D8 |
dword |
distance travelled on foot
|
0x00DC |
dword |
distance travelled in car
|
0x00E0 |
dword |
4x4one time ('Patriot Playground' in secs)
|
0x00E4 |
dword |
4x4two time ('A Ride In The Park' in secs)
|
0x00E8 |
dword |
4x4three time ('Gripped!' in secs)
|
0x00EC |
dword |
4x4mayhem time ('Multistorey Mayhem' in secs)
|
0x00F0 |
dword |
people saved in an ambulance (opcode 0401)
|
0x00F4 |
dword |
criminals killed on vigilante mission (opcode 0402)
|
0x00F8 |
dword |
highest paramedic mission level (opcode 0403)
|
0x00FC |
dword |
total fires extinguished (opcode 0404)
|
0x0100 |
dword |
longest flight in dodo (opcode 0406)
|
0x0104 |
dword |
best time bomb defusal (opcode 0407)
|
0x0108 |
dword |
rampages passed (opcode 041B)
|
0x010C |
dword |
total number rampages (opcode 0408)
|
0x0110 |
dword |
total number missions (opcode 042C)
|
0x0114 |
dword[16] |
fastest time record (opcode 042E, unused)
|
0x0154 |
dword[16] |
highest score record (opcode 042F)
|
0x0194 |
dword |
people killed since last checkpoint
|
0x0198 |
dword |
people killed no wasted/busted
|
0x019C |
char[8] |
last mission passed gxt key
|
List of stunts
Id
|
Description
|
0 |
No insane stunts completed
|
1 |
insane stunt
|
2 |
perfect insane stunt
|
3 |
double insane stunt
|
4 |
perfect double insane stunt
|
5 |
triple insane stunt
|
4 |
perfect triple insane stunt
|
5 |
quadruple insane stunt
|
6 |
perfect quadruple insane stunt
|
See also: List_of_statistics_(III)
Block 18: Streaming
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
byte[200] |
unknown
|
Block 19: Ped types
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
dword |
block size (constant 0x2E8)
|
0x0004 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
char[4] |
'PTP\0' signature
|
0x0004 |
dword |
block size
|
0x0008 |
- |
start of block, data below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
0x0000 |
PedType[23] |
PedType structures -- each is 0x20 bytes in size, see below
|
OFFSET
|
TYPE
|
DESCRIPTION
|
PedType
0x0000 |
dword |
unknown
|
0x0004 |
float |
unknown
|
0x0008 |
float |
unknown
|
0x000C |
float |
unknown
|
0x0010 |
float |
unknown
|
0x0014 |
float |
unknown
|
0x0018 |
dword |
unknown
|
0x001C |
dword |
unknown
|
Padding
Following the last data block is a variable amount of padding. Since every save file is exactly 0x3145C 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 final four bytes of a save file are an unsigned integer checksum value. This checksum is simply the sum of all the preceding 0x3145C bytes. If the checksum value does not match the calculated sum of those bytes, the game will consider the save file to be "corrupted" and refuse to load it. Thus, any time you make any changes to a save file you must remember to update the checksum when you are finished.
External links