Difference between revisions of "FF8/GameSaveFormat"

From Final Fantasy Inside
< FF8
Jump to navigation Jump to search
my_wiki>Myst6re
my_wiki>Myst6re
Line 1: Line 1:
 
== The save format ==
 
== The save format ==
 
=== Header & Preview ===
 
  
 
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
 
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
Line 8: Line 6:
 
! style="background:rgb(204,204,204)" | Data
 
! style="background:rgb(204,204,204)" | Data
 
|-
 
|-
| 0x00
+
| 0x0000
 
| 2 bytes
 
| 2 bytes
 
| Checksum
 
| Checksum
 
|-
 
|-
| 0x02
+
| 0x0002
 
| 2 bytes
 
| 2 bytes
 
| Always 0x08FF
 
| Always 0x08FF
 
|-
 
|-
| 0x04
+
| 0x0004
 
| 2 bytes
 
| 2 bytes
 
| '''Preview:''' Location ID
 
| '''Preview:''' Location ID
 
|-
 
|-
| 0x06
+
| 0x0006
 
| 2 bytes
 
| 2 bytes
 
| '''Preview:''' Lead character's current HP
 
| '''Preview:''' Lead character's current HP
 
|-
 
|-
| 0x08
+
| 0x0008
 
| 2 bytes
 
| 2 bytes
 
| '''Preview:''' Lead character's max HP
 
| '''Preview:''' Lead character's max HP
 
|-
 
|-
| 0x0A
+
| 0x000A
 
| 2 bytes
 
| 2 bytes
 
| '''Preview:''' save count
 
| '''Preview:''' save count
 
|-
 
|-
| 0x0C
+
| 0x000C
 
| 4 bytes
 
| 4 bytes
 
| '''Preview:''' Amount of Gil
 
| '''Preview:''' Amount of Gil
 
|-
 
|-
| 0x20
+
| 0x0020
 
| 4 bytes
 
| 4 bytes
 
| '''Preview:''' Total number of seconds played
 
| '''Preview:''' Total number of seconds played
 
|-
 
|-
| 0x24
+
| 0x0024
 
| 1 byte
 
| 1 byte
 
| '''Preview:''' Lead character's level
 
| '''Preview:''' Lead character's level
 
|-
 
|-
| 0x25
+
| 0x0025
 
| 1 byte
 
| 1 byte
 
| '''Preview:''' 1st character's portrait
 
| '''Preview:''' 1st character's portrait
 
|-
 
|-
| 0x26
+
| 0x0026
 
| 1 byte
 
| 1 byte
 
| '''Preview:''' 2nd character's portrait
 
| '''Preview:''' 2nd character's portrait
 
|-
 
|-
| 0x27
+
| 0x0027
 
| 1 byte
 
| 1 byte
 
| '''Preview:''' 3rd character's portrait
 
| '''Preview:''' 3rd character's portrait
 
|-
 
|-
| 0x28
+
| 0x0028
 
| 12 bytes
 
| 12 bytes
 
| '''Preview:''' Squall's name (0x00 terminated)
 
| '''Preview:''' Squall's name (0x00 terminated)
 
|-
 
|-
| 0x34
+
| 0x0034
 
| 12 bytes
 
| 12 bytes
 
| '''Preview:''' Rinoa's name (0x00 terminated)
 
| '''Preview:''' Rinoa's name (0x00 terminated)
 
|-
 
|-
| 0x40
+
| 0x0040
 
| 12 bytes
 
| 12 bytes
 
| '''Preview:''' Angelo's name (0x00 terminated)
 
| '''Preview:''' Angelo's name (0x00 terminated)
 
|-
 
|-
| 0x4C
+
| 0x004C
 
| 12 bytes
 
| 12 bytes
 
| '''Preview:''' Boko's name (0x00 terminated)
 
| '''Preview:''' Boko's name (0x00 terminated)
 
|-
 
|-
| 0x58
+
| 0x0058
 
| 4 bytes
 
| 4 bytes
 
| '''Preview:''' Current Disk (0 based)
 
| '''Preview:''' Current Disk (0 based)
 
|-
 
|-
| 0x5C
+
| 0x005C
 
| 4 bytes
 
| 4 bytes
 
| '''Preview:''' Current save (last saved game)
 
| '''Preview:''' Current save (last saved game)
 +
|-
 +
| 0x0060
 +
| 68 bytes
 +
| '''Guardian Forces:''' Quetzalcoatl
 +
|-
 +
| 0x00A4
 +
| 68 bytes
 +
| '''Guardian Forces:''' Shiva
 +
|-
 +
| 0x00E8
 +
| 68 bytes
 +
| '''Guardian Forces:''' Ifrit
 +
|-
 +
| 0x012C
 +
| 68 bytes
 +
| '''Guardian Forces:''' Siren
 +
|-
 +
| 0x0170
 +
| 68 bytes
 +
| '''Guardian Forces:''' Brothers
 +
|-
 +
| 0x01B4
 +
| 68 bytes
 +
| '''Guardian Forces:''' Diablos
 +
|-
 +
| 0x01F8
 +
| 68 bytes
 +
| '''Guardian Forces:''' Carbuncle
 +
|-
 +
| 0x023C
 +
| 68 bytes
 +
| '''Guardian Forces:''' Leviathan
 +
|-
 +
| 0x0280
 +
| 68 bytes
 +
| '''Guardian Forces:''' Pandemonia
 +
|-
 +
| 0x02C4
 +
| 68 bytes
 +
| '''Guardian Forces:''' Cerberus
 +
|-
 +
| 0x0308
 +
| 68 bytes
 +
| '''Guardian Forces:''' Alexander
 +
|-
 +
| 0x034C
 +
| 68 bytes
 +
| '''Guardian Forces:''' Doomtrain
 +
|-
 +
| 0x0390
 +
| 68 bytes
 +
| '''Guardian Forces:''' Bahamut
 +
|-
 +
| 0x03D4
 +
| 68 bytes
 +
| '''Guardian Forces:''' Cactuar
 +
|-
 +
| 0x0418
 +
| 68 bytes
 +
| '''Guardian Forces:''' Tonberry
 +
|-
 +
| 0x045C
 +
| 68 bytes
 +
| '''Guardian Forces:''' Eden
 +
|-
 +
| 0x04A0
 +
| 152 bytes
 +
| '''Characters:''' Squall
 +
|-
 +
| 0x0538
 +
| 152 bytes
 +
| '''Characters:''' Zell
 +
|-
 +
| 0x05D0
 +
| 152 bytes
 +
| '''Characters:''' Irvine
 +
|-
 +
| 0x0668
 +
| 152 bytes
 +
| '''Characters:''' Quistis
 +
|-
 +
| 0x0700
 +
| 152 bytes
 +
| '''Characters:''' Rinoa
 +
|-
 +
| 0x0798
 +
| 152 bytes
 +
| '''Characters:''' Selphie
 +
|-
 +
| 0x0830
 +
| 152 bytes
 +
| '''Characters:''' Seifer
 +
|-
 +
| 0x08C8
 +
| 152 bytes
 +
| '''Characters:''' Edea
 +
|-
 +
| 0x0960
 +
|  bytes
 +
| TODO
 
|}
 
|}
  
Line 85: Line 183:
  
 
The checksum calculation starts here.
 
The checksum calculation starts here.
 +
 +
There are 16 G-F: Quetzalcoatl, Shiva, Ifrit, Siren, Brothers, Diablos, Carbuncle, Leviathan, Pandemonia, Cerberus, Alexander, Doomtrain, Bahamut, Cactuar, Tonberry, Eden.<br/>
 +
For each G-F:
 +
 +
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
 +
! style="background:rgb(204,204,204)" | Offset
 +
! style="background:rgb(204,204,204)" | Size
 +
! style="background:rgb(204,204,204)" | Data
 +
|-
 +
| 0x00
 +
| 12 bytes
 +
| Name (0x00 terminated)
 +
|-
 +
| 0x0C
 +
| 4 bytes
 +
| Experience
 +
|-
 +
| style="background:rgb(255,255,204)" | 0x10
 +
| style="background:rgb(255,255,204)" | 1 byte
 +
| style="background:rgb(255,255,204)" | Unknown
 +
|-
 +
| 0x11
 +
| 1 byte
 +
| Exists
 +
|-
 +
| 0x12
 +
| 2 bytes
 +
| HP
 +
|-
 +
| 0x14
 +
| 16 bytes
 +
| Complete abilities (1 bit = 1 ability completed, 9 bits unused)
 +
|-
 +
| 0x24
 +
| 24 bytes
 +
| APs (1 byte = 1 ability of the GF, 2 bytes unused)
 +
|-
 +
| 0x3C
 +
| 2 bytes
 +
| Number of kills
 +
|-
 +
| 0x3E
 +
| 2 bytes
 +
| Number of KOs
 +
|-
 +
| 0x41
 +
| 1 byte
 +
| Learning ability
 +
|-
 +
| 0x42
 +
| 3 bytes
 +
| Forgotten abilities (1 bit = 1 ability of the GF forgotten, 2 bits unused)
 +
|}
 +
 +
=== Characters ===
 +
 +
Squall, Zell, Irvine, Quistis, Rinoa, Selphie, Seifer, Edea.
 +
For each character:
 +
 +
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
 +
! style="background:rgb(204,204,204)" | Offset
 +
! style="background:rgb(204,204,204)" | Size
 +
! style="background:rgb(204,204,204)" | Data
 +
|-
 +
| 0x00
 +
| 2 bytes
 +
| Current HPs
 +
|-
 +
| 0x02
 +
| 2 bytes
 +
| Max HPs
 +
|-
 +
| 0x04
 +
| 4 bytes
 +
| Experience
 +
|-
 +
| 0x08
 +
| 1 byte
 +
| Model ID
 +
|-
 +
| 0x09
 +
| 1 byte
 +
| Weapon ID
 +
|-
 +
| 0x0A
 +
| 1 byte
 +
| STR
 +
|-
 +
| 0x0B
 +
| 1 byte
 +
| VIT
 +
|-
 +
| 0x0C
 +
| 1 byte
 +
| MAG
 +
|-
 +
| 0x0D
 +
| 1 byte
 +
| SPR
 +
|-
 +
| 0x0E
 +
| 1 byte
 +
| SPD
 +
|-
 +
| 0x0F
 +
| 1 byte
 +
| LCK
 +
|-
 +
| 0x10
 +
| 2*32 bytes
 +
| Magics
 +
|-
 +
| 0x50
 +
| 3 bytes
 +
| Commands
 +
|-
 +
| 0x53
 +
| 1 byte
 +
| ''Padding or unused command''
 +
|-
 +
| 0x54
 +
| 4 bytes
 +
| Abilities
 +
|-
 +
| 0x58
 +
| 2 bytes
 +
| Junctionned GFs
 +
|-
 +
| style="background:rgb(255,255,204)" | 0x5A
 +
| style="background:rgb(255,255,204)" | 1 byte
 +
| style="background:rgb(255,255,204)" | Unknown
 +
|-
 +
| 0x5B
 +
| 1 byte
 +
| Alternative model (Normal, SeeD, Soldier...)
 +
|-
 +
| 0x5C
 +
| 1 byte
 +
| Junction HP
 +
|-
 +
| 0x5D
 +
| 1 byte
 +
| Junction STR
 +
|-
 +
| 0x5E
 +
| 1 byte
 +
| Junction VIT
 +
|-
 +
| 0x5F
 +
| 1 byte
 +
| Junction MAG
 +
|-
 +
| 0x60
 +
| 1 byte
 +
| Junction SPR
 +
|-
 +
| 0x61
 +
| 1 byte
 +
| Junction SPD
 +
|-
 +
| 0x62
 +
| 1 byte
 +
| Junction EVA
 +
|-
 +
| 0x63
 +
| 1 byte
 +
| Junction HIT
 +
|-
 +
| 0x64
 +
| 1 byte
 +
| Junction LCK
 +
|-
 +
| 0x65
 +
| 1 byte
 +
| Junction elemental attack
 +
|-
 +
| 0x66
 +
| 1 byte
 +
| Junction mental attack
 +
|-
 +
| 0x67
 +
| 4 bytes
 +
| Junction elemental defense
 +
|-
 +
| 0x6B
 +
| 4 bytes
 +
| Junction mental defense
 +
|-
 +
| style="background:rgb(255,255,204)" | 0x6F
 +
| style="background:rgb(255,255,204)" | 1 byte
 +
| style="background:rgb(255,255,204)" | Unknown (padding?)
 +
|-
 +
| 0x70
 +
| 16 * 2 bytes
 +
| Compatibility with GFs
 +
|-
 +
| 0x90
 +
| 2 bytes
 +
| Number of kills
 +
|-
 +
| 0x92
 +
| 2 bytes
 +
| Number of KOs
 +
|-
 +
| 0x94
 +
| 1 byte
 +
| Exists
 +
|-
 +
| style="background:rgb(255,255,204)" | 0x95
 +
| style="background:rgb(255,255,204)" | 1 byte
 +
| style="background:rgb(255,255,204)" | Unknown
 +
|-
 +
| 0x96
 +
| 1 byte
 +
| Mental Status
 +
|-
 +
| style="background:rgb(255,255,204)" | 0x97
 +
| style="background:rgb(255,255,204)" | 1 byte
 +
| style="background:rgb(255,255,204)" | Unknown
 +
|-
 +
|}

Revision as of 15:50, 12 August 2012

The save format

Offset Size Data
0x0000 2 bytes Checksum
0x0002 2 bytes Always 0x08FF
0x0004 2 bytes Preview: Location ID
0x0006 2 bytes Preview: Lead character's current HP
0x0008 2 bytes Preview: Lead character's max HP
0x000A 2 bytes Preview: save count
0x000C 4 bytes Preview: Amount of Gil
0x0020 4 bytes Preview: Total number of seconds played
0x0024 1 byte Preview: Lead character's level
0x0025 1 byte Preview: 1st character's portrait
0x0026 1 byte Preview: 2nd character's portrait
0x0027 1 byte Preview: 3rd character's portrait
0x0028 12 bytes Preview: Squall's name (0x00 terminated)
0x0034 12 bytes Preview: Rinoa's name (0x00 terminated)
0x0040 12 bytes Preview: Angelo's name (0x00 terminated)
0x004C 12 bytes Preview: Boko's name (0x00 terminated)
0x0058 4 bytes Preview: Current Disk (0 based)
0x005C 4 bytes Preview: Current save (last saved game)
0x0060 68 bytes Guardian Forces: Quetzalcoatl
0x00A4 68 bytes Guardian Forces: Shiva
0x00E8 68 bytes Guardian Forces: Ifrit
0x012C 68 bytes Guardian Forces: Siren
0x0170 68 bytes Guardian Forces: Brothers
0x01B4 68 bytes Guardian Forces: Diablos
0x01F8 68 bytes Guardian Forces: Carbuncle
0x023C 68 bytes Guardian Forces: Leviathan
0x0280 68 bytes Guardian Forces: Pandemonia
0x02C4 68 bytes Guardian Forces: Cerberus
0x0308 68 bytes Guardian Forces: Alexander
0x034C 68 bytes Guardian Forces: Doomtrain
0x0390 68 bytes Guardian Forces: Bahamut
0x03D4 68 bytes Guardian Forces: Cactuar
0x0418 68 bytes Guardian Forces: Tonberry
0x045C 68 bytes Guardian Forces: Eden
0x04A0 152 bytes Characters: Squall
0x0538 152 bytes Characters: Zell
0x05D0 152 bytes Characters: Irvine
0x0668 152 bytes Characters: Quistis
0x0700 152 bytes Characters: Rinoa
0x0798 152 bytes Characters: Selphie
0x0830 152 bytes Characters: Seifer
0x08C8 152 bytes Characters: Edea
0x0960 bytes TODO


Guardian Forces

The checksum calculation starts here.

There are 16 G-F: Quetzalcoatl, Shiva, Ifrit, Siren, Brothers, Diablos, Carbuncle, Leviathan, Pandemonia, Cerberus, Alexander, Doomtrain, Bahamut, Cactuar, Tonberry, Eden.
For each G-F:

Offset Size Data
0x00 12 bytes Name (0x00 terminated)
0x0C 4 bytes Experience
0x10 1 byte Unknown
0x11 1 byte Exists
0x12 2 bytes HP
0x14 16 bytes Complete abilities (1 bit = 1 ability completed, 9 bits unused)
0x24 24 bytes APs (1 byte = 1 ability of the GF, 2 bytes unused)
0x3C 2 bytes Number of kills
0x3E 2 bytes Number of KOs
0x41 1 byte Learning ability
0x42 3 bytes Forgotten abilities (1 bit = 1 ability of the GF forgotten, 2 bits unused)

Characters

Squall, Zell, Irvine, Quistis, Rinoa, Selphie, Seifer, Edea. For each character:

Offset Size Data
0x00 2 bytes Current HPs
0x02 2 bytes Max HPs
0x04 4 bytes Experience
0x08 1 byte Model ID
0x09 1 byte Weapon ID
0x0A 1 byte STR
0x0B 1 byte VIT
0x0C 1 byte MAG
0x0D 1 byte SPR
0x0E 1 byte SPD
0x0F 1 byte LCK
0x10 2*32 bytes Magics
0x50 3 bytes Commands
0x53 1 byte Padding or unused command
0x54 4 bytes Abilities
0x58 2 bytes Junctionned GFs
0x5A 1 byte Unknown
0x5B 1 byte Alternative model (Normal, SeeD, Soldier...)
0x5C 1 byte Junction HP
0x5D 1 byte Junction STR
0x5E 1 byte Junction VIT
0x5F 1 byte Junction MAG
0x60 1 byte Junction SPR
0x61 1 byte Junction SPD
0x62 1 byte Junction EVA
0x63 1 byte Junction HIT
0x64 1 byte Junction LCK
0x65 1 byte Junction elemental attack
0x66 1 byte Junction mental attack
0x67 4 bytes Junction elemental defense
0x6B 4 bytes Junction mental defense
0x6F 1 byte Unknown (padding?)
0x70 16 * 2 bytes Compatibility with GFs
0x90 2 bytes Number of kills
0x92 2 bytes Number of KOs
0x94 1 byte Exists
0x95 1 byte Unknown
0x96 1 byte Mental Status
0x97 1 byte Unknown