Difference between revisions of "FF8/GameSaveFormat"
< FF8
Jump to navigation
Jump to search
my_wiki>Myst6re |
my_wiki>Myst6re |
||
| Line 1: | Line 1: | ||
== The save format == | == The save format == | ||
| − | |||
| − | |||
{| 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 | ||
|- | |- | ||
| − | | | + | | 0x0000 |
| 2 bytes | | 2 bytes | ||
| Checksum | | Checksum | ||
|- | |- | ||
| − | | | + | | 0x0002 |
| 2 bytes | | 2 bytes | ||
| Always 0x08FF | | Always 0x08FF | ||
|- | |- | ||
| − | | | + | | 0x0004 |
| 2 bytes | | 2 bytes | ||
| '''Preview:''' Location ID | | '''Preview:''' Location ID | ||
|- | |- | ||
| − | | | + | | 0x0006 |
| 2 bytes | | 2 bytes | ||
| '''Preview:''' Lead character's current HP | | '''Preview:''' Lead character's current HP | ||
|- | |- | ||
| − | | | + | | 0x0008 |
| 2 bytes | | 2 bytes | ||
| '''Preview:''' Lead character's max HP | | '''Preview:''' Lead character's max HP | ||
|- | |- | ||
| − | | | + | | 0x000A |
| 2 bytes | | 2 bytes | ||
| '''Preview:''' save count | | '''Preview:''' save count | ||
|- | |- | ||
| − | | | + | | 0x000C |
| 4 bytes | | 4 bytes | ||
| '''Preview:''' Amount of Gil | | '''Preview:''' Amount of Gil | ||
|- | |- | ||
| − | | | + | | 0x0020 |
| 4 bytes | | 4 bytes | ||
| '''Preview:''' Total number of seconds played | | '''Preview:''' Total number of seconds played | ||
|- | |- | ||
| − | | | + | | 0x0024 |
| 1 byte | | 1 byte | ||
| '''Preview:''' Lead character's level | | '''Preview:''' Lead character's level | ||
|- | |- | ||
| − | | | + | | 0x0025 |
| 1 byte | | 1 byte | ||
| '''Preview:''' 1st character's portrait | | '''Preview:''' 1st character's portrait | ||
|- | |- | ||
| − | | | + | | 0x0026 |
| 1 byte | | 1 byte | ||
| '''Preview:''' 2nd character's portrait | | '''Preview:''' 2nd character's portrait | ||
|- | |- | ||
| − | | | + | | 0x0027 |
| 1 byte | | 1 byte | ||
| '''Preview:''' 3rd character's portrait | | '''Preview:''' 3rd character's portrait | ||
|- | |- | ||
| − | | | + | | 0x0028 |
| 12 bytes | | 12 bytes | ||
| '''Preview:''' Squall's name (0x00 terminated) | | '''Preview:''' Squall's name (0x00 terminated) | ||
|- | |- | ||
| − | | | + | | 0x0034 |
| 12 bytes | | 12 bytes | ||
| '''Preview:''' Rinoa's name (0x00 terminated) | | '''Preview:''' Rinoa's name (0x00 terminated) | ||
|- | |- | ||
| − | | | + | | 0x0040 |
| 12 bytes | | 12 bytes | ||
| '''Preview:''' Angelo's name (0x00 terminated) | | '''Preview:''' Angelo's name (0x00 terminated) | ||
|- | |- | ||
| − | | | + | | 0x004C |
| 12 bytes | | 12 bytes | ||
| '''Preview:''' Boko's name (0x00 terminated) | | '''Preview:''' Boko's name (0x00 terminated) | ||
|- | |- | ||
| − | | | + | | 0x0058 |
| 4 bytes | | 4 bytes | ||
| '''Preview:''' Current Disk (0 based) | | '''Preview:''' Current Disk (0 based) | ||
|- | |- | ||
| − | | | + | | 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 |