This article aims to document the save file format of GTA LCS.
Data Blocks
- A save file consists of 5 blocks
- The first 4 bytes of the block contain a string describing the block ("SIMP", "SCRT", "GRGE", "PLYR" and "STAT")
- The next 4 bytes contain the size of the block
- Byte order is little endian. For example, the number 3452 (0x0D7C) is represented as 0x7C 0x0D in little endian.
Block 0: SIMP (Simple Variables)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
+0 |
+0 |
+0 |
char[4] |
block magic number ("SIMP")
|
+4 |
+4 |
+4 |
+0 |
uint32 |
block size
|
+8 |
+8 |
+8 |
+0 |
- |
start of block, data below
|
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+12 |
|
|
|
char[120] |
last mission passed name
|
+132 |
|
|
|
uint32 |
current level
|
+136 |
|
|
|
uint32 |
current area
|
+140 |
|
|
|
uint32 |
language
|
+144 |
|
|
|
uint32 |
milliseconds per game minute
|
+148 |
|
|
|
uint32 |
last clock tick
|
+152 |
|
|
|
uint8 |
game clock hours
|
+153 |
|
|
|
uint8 |
game clock minutes
|
+154 |
|
|
|
uint16 |
game clock seconds
|
+156 |
|
|
|
uint32 |
total time played in milliseconds
|
+160 |
|
|
|
float |
time scale
|
+164 |
|
|
|
float |
time step
|
+168 |
|
|
|
float |
time step non clipped
|
+172 |
|
|
|
float |
frames per update
|
+176 |
|
|
|
uint32 |
frame counter
|
+180 |
|
|
|
uint16 |
old weather type
|
+182 |
|
|
|
uint16 |
new weather type
|
+184 |
|
|
|
uint16 |
forced weather type
|
+188 |
|
|
|
uint32 |
weather type in list
|
+192 |
|
|
|
uint32 |
interpolation value
|
+196 |
|
|
|
uint32 |
(unknown)
|
+200 |
|
|
|
uint32 |
(unknown)
|
+204 |
|
|
|
uint32 |
(unknown)
|
+208 |
|
|
|
uint32 |
(unknown)
|
+212 |
|
|
|
uint32 |
(unknown)
|
+216 |
|
|
|
uint32 |
(unknown)
|
+220 |
|
|
|
uint32 |
(unknown)
|
+224 |
|
|
|
uint32 |
(unknown)
|
+228 |
|
|
|
uint32 |
brightness
|
+232 |
|
|
|
uint8 |
display hud
|
+233 |
|
|
|
uint8 |
show subtitles
|
+236 |
|
|
|
uint32 |
radar mode
|
+240 |
|
|
|
uint8 |
blur on
|
+244 |
|
|
|
uint32 |
music volume
|
+248 |
|
|
|
uint32 |
sfx volume
|
+252 |
|
|
|
uint8 |
radio station
|
+253 |
|
|
|
uint8 |
output
|
+254 |
|
|
|
uint8 |
(unknown) (always 0)
|
+300 |
|
|
|
uint16 |
pad status
|
+302 |
|
|
|
uint8 |
invert look
|
+303 |
|
|
|
uint8 |
swap stick and d-pad
|
+304 |
|
|
|
uint8 |
has player cheated
|
+305 |
|
|
|
uint8 |
do all taxis have nitro (unused)
|
+306 |
|
|
|
uint8 |
target is on (unused)
|
+308 |
|
|
|
float |
target pos (unused)
|
+312 |
|
|
|
uint32 |
(unknown)
|
Block 1: SCRT (Scripts)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
+0 |
+0 |
+0 |
char[4] |
block magic number ("SCRT")
|
+4 |
+4 |
+4 |
+0 |
uint32 |
block size
|
+8 |
+8 |
+8 |
+0 |
- |
start of block, data below
|
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
char[4] |
"SCR\0"
|
+4 |
|
|
|
uint32 |
size of block following this variable
|
+8 |
|
|
|
uint32 |
total size of script space (n)
|
+12 |
|
|
|
uint32[n/4] |
script space content (global variables)
|
+12+n |
|
|
|
- |
the content in the following table is offset by 12+n
|
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
uint32 |
(unknown) (constant 1720)
|
+4 |
|
|
|
uint32 |
on mission flag location
|
+8 |
|
|
|
uint32 |
last mission passed time
|
+12 |
|
|
|
uint32[64] |
Collective array
|
+268 |
|
|
|
uint32 |
next free collective index
|
+272 |
|
|
|
BuildingSwap[?] |
BuildingSwap array (unknown structure as of now)
|
+1552 |
|
|
|
InvisibilitySettings[52] |
invisible objects array
|
+1968 |
|
|
|
uint8 |
is using a multiple script file
|
+1969 |
|
|
|
uint8 |
has player met Debbie Harry
|
+1970 |
|
|
|
uint16 |
(unknown) (constant 0)
|
+1972 |
|
|
|
uint32 |
main script size
|
+1976 |
|
|
|
uint32 |
largest mission script size
|
+1980 |
|
|
|
uint16 |
number of mission scripts
|
+1982 |
|
|
|
uint16 |
number of exclusive mission scripts
|
+1984 |
|
|
|
uint32 |
number of active scripts
|
+1988 |
|
|
|
RunningScript[ ] |
threads
|
InvisibilitySettings (8 bytes)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
uint32 |
type
|
+4 |
|
|
|
uint32 |
handle
|
CRunningScript (540 bytes)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
uint32 |
next script
|
+4 |
|
|
|
uint32 |
previous script
|
+8 |
|
|
|
uint32 |
id
|
+12 |
|
|
|
uint32 |
(unknown)
|
+16 |
|
|
|
char* |
script name
|
+24 |
|
|
|
uint32 |
instruction pointer
|
+28 |
|
|
|
uint32[16] |
stack
|
+92 |
|
|
|
uint16 |
number of stack pointers
|
+94 |
|
|
|
uint16 |
(unknown)
|
+96 |
|
|
|
uint32[104] |
local variables
|
+512 |
|
|
|
uint32[2] |
timers
|
+520 |
|
|
|
uint8[5] |
unknown
|
+525 |
|
|
|
uint8 |
condition result
|
+526 |
|
|
|
uint8 |
use mission cleanup
|
+527 |
|
|
|
uint8 |
is active
|
+528 |
|
|
|
uint32 |
wake time
|
+532 |
|
|
|
uint16 |
logical operation
|
+534 |
|
|
|
uint8 |
not flag
|
+535 |
|
|
|
uint8 |
wasted or busted check enabled
|
+536 |
|
|
|
uint8 |
wasted or busted check result
|
+537 |
|
|
|
uint8 |
is a mission
|
+538 |
|
|
|
uint8[2] |
(unknown) (pad?)
|
Block 2: GRGE (Garages)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
+0 |
+0 |
+0 |
char[4] |
block magic number ("GRGE")
|
+4 |
+4 |
+4 |
+0 |
uint32 |
block size
|
+8 |
+8 |
+8 |
+0 |
- |
start of block, data below
|
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
uint32 |
garage count
|
+4 |
|
|
|
uint32 |
are bombs free
|
+8 |
|
|
|
uint32 |
are resprays free
|
+12 |
|
|
|
uint32 |
cars collected (unused)
|
+16 |
|
|
|
uint32 |
bank vans collected (unused)
|
+20 |
|
|
|
uint32 |
police cars collected (unused)
|
+24 |
|
|
|
uint32 |
love media cars collected
|
+28 |
|
|
|
uint32 |
unused I/E cars collected
|
+32 |
|
|
|
uint32 |
unused I/E cars collected
|
+36 |
|
|
|
uint32 |
unused I/E cars collected
|
+40 |
|
|
|
uint32 |
help message last displayed (timestamp)
|
+44 |
|
|
|
StoredCar[48] |
cars stored in garages
|
+2156 |
|
|
|
Garage[32] |
defined garages
|
Stored Car (44 bytes)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
uint32 |
model id
|
+4 |
float[3] |
position
|
+16 |
float[3] |
rotation
|
+28 |
uint32 |
handling multiplier
|
+32 |
uint32 |
immunities
|
+36 |
uint8 |
primary colour
|
+37 |
uint8 |
secondary colour
|
+38 |
uint8 |
radio station
|
+39 |
uint8 |
extra 1
|
+40 |
uint8 |
extra 2
|
+41 |
uint8[3] |
(unknown)
|
Garage (224 bytes)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
uint8[144] |
(unknown)
|
+144 |
float[6] |
position (x1,x2, y1,y2, z1,z2)
|
+168 |
uint8[32] |
(unknown)
|
+200 |
uint8 |
garage type
|
+201 |
uint8 |
garage state
|
+202 |
uint8[22] |
(unknown)
|
Love Media Cars - Bitfield
- 0b000000000000001 = Hearse
- 0b000000000000010 = Faggio
- 0b000000000000100 = Freeway
- 0b000000000001000 = Deimos SP
- 0b000000000010000 = Manana
- 0b000000000100000 = Hellenbach GT
- 0b000000001000000 = Phobos Vt
- 0b000000010000000 = V8 Ghost
- 0b000000100000000 = Thunder-Rodd
- 0b000001000000000 = PCJ-600
- 0b000010000000000 = Infernus
- 0b000100000000000 = Banshee
- 0b001000000000000 = Patriot
- 0b010000000000000 = Injection
- 0b100000000000000 = Landstalker
Immunities - Bitfield
- 0b000001 = Bullet proof
- 0b000010 = Fire proof
- 0b000100 = Explosion proof
- 0b001000 = Collision proof
- 0b010000 = Melee proof
- 0b100000 = Hellenbach GT
Radio Stations
- 0 = Head Radio
- 1 = Double Cleff FM
- 2 = K-Jah
- 3 = Rise FM
- 4 = Lips 106
- 5 = Radio Del Mundo
- 6 = MSX 98
- 7 = Flashback FM
- 8 = The Liberty Jam
- 9 = LCFR
- 10 = Mix Tape
Block 3: PLYR (Player)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
+0 |
+0 |
+0 |
char[4] |
block magic number ("PLYR")
|
+4 |
+4 |
+4 |
+0 |
uint32 |
block size
|
+8 |
+8 |
+8 |
+0 |
- |
start of block, data below
|
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
char[128] |
blank
|
+128 |
|
|
|
uint32 |
player money
|
+132 |
|
|
|
uint32 |
(unknown)
|
+136 |
|
|
|
uint32 |
(player money on display)
|
+140 |
|
|
|
uint32 |
(unknown)
|
+144 |
|
|
|
uint32 |
total packages
|
+148 |
|
|
|
uint32 |
(unknown)
|
+152 |
|
|
|
uint16 |
(unknown)
|
+154 |
|
|
|
uint16 |
(unknown)
|
+156 |
|
|
|
uint8 |
max health
|
+157 |
|
|
|
uint8 |
max armour
|
+158 |
|
|
|
uint8 |
(unknown)
|
+159 |
|
|
|
uint8 |
(unknown)
|
+160 |
|
|
|
uint8 |
never tired
|
+161 |
|
|
|
uint8 |
fast reload
|
+162 |
|
|
|
uint8 |
fireproof
|
+163 |
|
|
|
uint8 |
get out of jail free
|
+164 |
|
|
|
uint8 |
can do drive by
|
+165 |
|
|
|
char[3] |
blank
|
Block 4: STAT (Statistics)
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
+0 |
+0 |
+0 |
char[4] |
block magic number ("STAT")
|
+4 |
+4 |
+4 |
+0 |
uint32 |
block size
|
+8 |
+8 |
+8 |
+0 |
- |
start of block, data below
|
APK
|
IOS
|
PSP
|
PS2
|
TYPE
|
DESCRIPTION
|
+0 |
|
|
|
uint32 |
people killed by player
|
+4 |
|
|
|
uint32 |
people killed by others
|
+8 |
|
|
|
uint32 |
cars exploded
|
+12 |
|
|
|
uint32 |
boats exploded
|
+16 |
|
|
|
uint32 |
tyres popped
|
+20 |
|
|
|
uint32 |
rounds fired by player
|
+24 |
|
|
|
uint32[14] |
peds killed of type
|
+116 |
|
|
|
uint32 |
helis destroyed
|
+120 |
|
|
|
float |
progress made
|
+124 |
|
|
|
uint32 |
total progress in game
|
+128 |
|
|
|
float |
kgs of explosives used
|
+132 |
|
|
|
uint32 |
bullets that hit
|
+136 |
|
|
|
uint32 |
cars crushed
|
+140 |
|
|
|
uint32 |
heads popped
|
+144 |
|
|
|
uint32 |
wanted stars attained
|
+148 |
|
|
|
uint32 |
wanted stars evaded
|
+152 |
|
|
|
uint32 |
times arrested
|
+156 |
|
|
|
uint32 |
times died
|
+160 |
|
|
|
uint32 |
days passed
|
+164 |
|
|
|
uint32 |
safe house visits
|
+168 |
|
|
|
uint32 |
sprayings
|
+172 |
|
|
|
float |
maximum jump distance
|
+176 |
|
|
|
float |
maximum jump height
|
+180 |
|
|
|
uint32 |
maximum jump flips
|
+184 |
|
|
|
uint32 |
maximum jump spins
|
+188 |
|
|
|
uint32 |
best stunt jump
|
+192 |
|
|
|
uint32 |
number of unique jumps found
|
+196 |
|
|
|
uint32 |
total number of unique jumps
|
+200 |
|
|
|
uint32 |
missions given
|
+204 |
|
|
|
uint32 |
passengers dropped off with taxi
|
+208 |
|
|
|
uint32 |
money made with taxi
|
+212 |
|
|
|
uint32 |
industrial passed (portland)
|
+216 |
|
|
|
uint32 |
commercial passed (staunton)
|
+220 |
|
|
|
uint32 |
suburban passed (shoreside vale)
|
+224 |
|
|
|
uint32 |
pamphlet mission passed (VC leftover)
|
+228 |
|
|
|
uint32 |
no more hurricanes
|
+232 |
|
|
|
float |
distance travelled on foot
|
+236 |
|
|
|
float |
distance travelled by car
|
+240 |
|
|
|
float |
distance travelled by bike
|
+244 |
|
|
|
float |
distance travelled by boat
|
+248 |
|
|
|
float |
distance travelled by plane
|
+252 |
|
|
|
uint32 |
lives saved with ambulance
|
+256 |
|
|
|
uint32 |
criminals caught
|
+260 |
|
|
|
uint32 |
fires extinguished
|
+264 |
|
|
|
uint32 |
highest level vigilante mission
|
+268 |
|
|
|
uint32 |
highest level ambulance mission
|
+272 |
|
|
|
uint32 |
highest level fire mission
|
+276 |
|
|
|
uint32 |
photos taken
|
+280 |
|
|
|
uint32 |
number kill frenzies passed
|
+284 |
|
|
|
uint32 |
max seconds on karmageddon left
|
+288 |
|
|
|
uint32 |
max kills on rc triad
|
+292 |
|
|
|
uint32 |
total number kill frenzies
|
+296 |
|
|
|
uint32 |
total number missions
|
+300 |
|
|
|
uint32 |
times drowned
|
+304 |
|
|
|
uint32 |
seagulls killed
|
+308 |
|
|
|
uint32 |
weapon budget
|
+312 |
|
|
|
uint32 |
loan sharks (unused)
|
+316 |
|
|
|
uint32 |
movie stunts (unused)
|
+320 |
|
|
|
uint32 |
pizzas delivered
|
+324 |
|
|
|
uint32 |
noodles delivered
|
+328 |
|
|
|
uint32 |
money made from tourist
|
+332 |
|
|
|
uint32 |
tourists taken to spots
|
+336 |
|
|
|
uint32 |
garbage pickups
|
+340 |
|
|
|
uint32 |
ice cream sold
|
+344 |
|
|
|
uint32 |
top shooting range score
|
+348 |
|
|
|
uint32 |
shooting rank
|
+352 |
|
|
|
uint32 |
top scrapyard challenge score
|
+356 |
|
|
|
uint32 |
top 9mm mayhem score
|
+360 |
|
|
|
uint32 |
top scooter shooter score
|
+364 |
|
|
|
uint32 |
top wichita wipeout score
|
+368 |
|
|
|
uint32 |
longest wheelie
|
+372 |
|
|
|
uint32 |
longest stoppie
|
+376 |
|
|
|
uint32 |
longest 2 wheel
|
+380 |
|
|
|
float |
longest wheelie distance
|
+384 |
|
|
|
float |
longest stoppie distance
|
+388 |
|
|
|
float |
longest 2 wheel distance
|
+392 |
|
|
|
float |
longest face plant distance
|
+396 |
|
|
|
uint32 |
auto painting budget
|
+400 |
|
|
|
uint32 |
property destroyed
|
+404 |
|
|
|
uint32 |
num property owned
|
+408 |
|
|
|
uint16 |
unlocked costumes
|
+410 |
|
|
|
uint32 |
blood ring kills
|
+414 |
|
|
|
uint32 |
blood ring time
|
+418 |
|
|
|
uint8[14] |
properties owned (unused)
|
+433 |
|
|
|
uint32 |
highest chase value
|
+437 |
|
|
|
uint32[23] |
fastest times
|
+529 |
|
|
|
uint32[5] |
highest scores
|
+561 |
|
|
|
char[8] |
last mission passed name
|
+569 |
|
|
|
uint32 |
cheated count
|
+573 |
|
|
|
uint32 |
cars sold
|
+577 |
|
|
|
uint32 |
money made with car sales
|
+581 |
|
|
|
uint32 |
bikes sold
|
+585 |
|
|
|
uint32 |
money made with bike sales
|
+589 |
|
|
|
uint32 |
number of exported cars
|
+593 |
|
|
|
uint32 |
total number of car export
|
+597 |
|
|
|
uint32 |
highest level slash tv
|
+601 |
|
|
|
uint32 |
money made with slash tv
|
+605 |
|
|
|
uint32 |
total kills on slash tv
|
+609 |
|
|
|
uint32 |
packages smuggled
|
+613 |
|
|
|
uint32 |
smugglers wasted
|
+617 |
|
|
|
uint32 |
fastest smuggling time
|
+621 |
|
|
|
uint32 |
money made in coach
|
+625 |
|
|
|
uint32 |
money made collecting trash
|
+629 |
|
|
|
uint32 |
hitmen killed
|
+633 |
|
|
|
uint32 |
highest avenging angel justice dished
|
+637 |
|
|
|
uint32 |
avenging angel missions passed
|
+641 |
|
|
|
uint32 |
avenging angel highest level portland
|
+645 |
|
|
|
uint32 |
avenging angel highest level staunton
|
+649 |
|
|
|
uint32 |
avenging angel highest level shoreside vale
|
+653 |
|
|
|
uint32 |
most time left train race
|
+657 |
|
|
|
uint32 |
best time go go faggio
|
+661 |
|
|
|
uint32 |
highest train cash earned
|
+665 |
|
|
|
uint32 |
dirt bike most air
|
+669 |
|
|
|
uint32 |
fastest heli race time
|
+673 |
|
|
|
uint32 |
best heli race position
|
+677 |
|
|
|
uint32 |
number outfit changes
|
+681 |
|
|
|
uint32[3] |
fastest rc bandit lap times
|
+693 |
|
|
|
uint32[3] |
best rc bandit positions
|
+705 |
|
|
|
uint32[6] |
best street race positions
|
+753 |
|
|
|
uint32[6] |
fastest street race times
|
+777 |
|
|
|
uint32[10] |
fastest dirt bike lap times
|
+817 |
|
|
|
uint32[10] |
fastest dirt bike times
|
+857 |
|
|
|
uint32[11] |
radio station listen times
|
Tools