Saves (GTA 3)

From GTAMods Wiki
Revision as of 22:23, 21 March 2015 by Seemann (talk | contribs) (External links)
Jump to navigation Jump to search

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: Miscellaneous

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

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 block size
0x0004 - start of block, data below
OFFSET TYPE DESCRIPTION
0x0000 dword[102] different statistics values
0x0198 char[8] last mission passed GXT key

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