Difference between revisions of "Pikmin 2 save file"

From Pikmin Technical Knowledge Base
Jump to: navigation, search
m (Espyo moved page Pikmin 2 save file format to Pikmin 2 save file without leaving a redirect: Consistency.)
(Addresses)
(15 intermediate revisions by 5 users not shown)
Line 1: Line 1:
Data about the ''Pikmin 2'' save file format. The following info was taken from the PAL version of ''Pikmin 2'' based on a .gci save taken from Dolphin.
+
Data about the ''Pikmin 2'' save file format. The following info was taken from the US version of ''Pikmin 2'' based on a <code>.gci</code> save taken from Dolphin. This data applies to all GameCube versions of the game, the only difference being the region code on the 4th byte of the file
  
 
{{todo|Figure out how to decrypt save files for the NPC version}}
 
{{todo|Figure out how to decrypt save files for the NPC version}}
{{todo|Check if this info applies to the US/J version of Pikmin 2 on GC}}
 
  
The save file contains save data for each of the 3 save slot used in-game. The data of such a save slot starts with the 8 byte string <code>PlVa0003<code> and is 0xC000 bytes (49152 bytes in decimal) long. Directly after the string follows a byte which has the slot number of the save (<code>0x00</code> for first slot, <code>0x01</code> for second, <code>0x02</code> for third). The last 4 bytes of the slot data contain the checksum calculated for the preceding slot data. The checksum is calculated according to this method: http://hitmen.c02.at/files/yagcd/yagcd/chap12.html#sec12.5
+
The save file contains save data for each of the 3 save slot used in-game. The data of such a save slot starts with the 8 byte magic word string <code>PlVa0003</code> and is <code>0xC000</code> bytes (49152 bytes in decimal) long. Directly after the string follows a byte which has the slot number of the save (<code>0x00</code> for first slot, <code>0x01</code> for second, <code>0x02</code> for third). The last 4 bytes of the slot data contain the checksum calculated for the preceding slot data. The checksum is detailed in [[#Checksum|this section]].
  
Addresses of interest relative to the start of the string:
+
== Addresses ==
 +
Addresses of interest relative to the start of the save slot (i.e. the start of the magic word string):
  
 
{| class="wikitable sortable"
 
{| class="wikitable sortable"
Line 12: Line 12:
 
|-
 
|-
 
| <code>0x14</code> || 4 bytes
 
| <code>0x14</code> || 4 bytes
| Integer representing the day count shown on the file select screen (might not be permanent, i.e. overwritten when you end a day normally.)
+
| Integer representing the day count as shown on the file select screen (might not be permanent, i.e. overwritten when you end a day normally.)
 +
|-
 +
| <code>0x2C</code> || 4 bytes
 +
| Integer representing the Poko count as shown on the file select screen.
 +
|-
 +
| <code>0x30</code> || 4 bytes
 +
| Integer representing the treasure count as shown on the file select screen. Usually the same as the amount of treasures as accessed on the Area Select Screen.
 +
|-
 +
| <code>0x3C</code> || 4 bytes
 +
| Integer representing the time (in minutes) played on the save file as shown on the file select screen.
 +
|-
 +
| <code>0x53</code> || array of 2, 4 byte integers followed by a 1 byte bitmask
 +
| 4 byte integer of Pikmin lost to the said enemy, followed by a 4 byte integer representing the amount of enemies killed, followed by a 1 byte bitmask <code>0b1</code> represents that the enemy has been unlocked in the Piklopedia and <code>0b10</code> represents that the enemy has been viewed in the Piklopedia.
 +
|-
 +
| <code>0x3ED</code> || 2 bytes
 +
| Bitmask for Exploration Kit items and their activity. The least significant bit represents the EK item with an internal ID of <code>0</code> When the bit is set to 1, the item is active. This activity does not reflect the treasure being collected.
 +
|-
 +
| <code>0x3F1</code> || 21 length 4 byte array
 +
| Pikmin types that fall from the sky during entering and exiting a cave. Editing this value on a save file that is on the area select screen will result in the Pikmin falling from the sky upon entering an area. The Pikmin types are organized into groups of three, with the first integer representing a leaf Pikmin, the second a bud Pikmin, and the third a flower Pikmin. The Pikmin types in the array are ordered Blue, Red, Yellow, Purple, White, Bulbmin, and an unused PikPik carrot.
 +
|-
 +
| <code>0x479</code> || 21 length 4 byte array
 +
| Same as above but for Pikmin in the Onions and Ship. {{todo|Find out what happens when Bulbmin and PikPik carrots are added}}
 +
|-
 +
| <code>0x4CF</code> || 188 length 1 byte array
 +
| 1 byte each represents the treasure as accessed on the area select screen. Treasures appear to follow their [[Pikmin 2 identifiers|internal IDs]] for order. These are all the treasures not part of the Exploration Kit (nor The Key). Non-zero values mean collected. {{todo|find if there is a difference between the value being <code>0x2</code> or the more common <code>0x6</code>}}
 +
|-
 +
| <code>0x58D</code> || 13 length 1 byte array
 +
| Same as above, only for Exploration Kit treasures including The Key.
 +
|-
 +
| <code>0x834</code> || 4 bytes
 +
| Actual Poko count the game registers, differing from what is displayed on the file select screen if only one of the two addresses is edited.
 
|}
 
|}
  
The following Python script (requires Python >3.4) assists with calculating the checksum for the data in a save slot: https://gist.github.com/RenolY2/e0d93dde832b63f9197ef60861f22d89 Not recalculating and fixing the checksum results in the game detecting the modified save slot as being corrupted (but if you have any unmodified save slots, those will still work fine).
+
== Checksum ==
 +
The checksum of a save slot is calculated according to [http://hitmen.c02.at/files/yagcd/yagcd/chap12.html#sec12.5 this method].
 +
 
 +
[https://gist.github.com/RenolY2/e0d93dde832b63f9197ef60861f22d89 This Python script] (requires Python >3.4) assists with calculating the checksum for the data in a save slot. Not recalculating and fixing the checksum results in the game detecting the modified save slot as being corrupted (but if you have any unmodified save slots, those will still work fine).
  
 
Very careful editing might allow you to fool the corruption detection without having to recalculate the value: Due to the checksum being an additive one, {{unsure|if you increase one value by 1 and decrease a different value by 1, the checksum should still remain valid.}}
 
Very careful editing might allow you to fool the corruption detection without having to recalculate the value: Due to the checksum being an additive one, {{unsure|if you increase one value by 1 and decrease a different value by 1, the checksum should still remain valid.}}

Revision as of 02:34, 23 November 2018

Data about the Pikmin 2 save file format. The following info was taken from the US version of Pikmin 2 based on a .gci save taken from Dolphin. This data applies to all GameCube versions of the game, the only difference being the region code on the 4th byte of the file


To do: Figure out how to decrypt save files for the NPC version

The save file contains save data for each of the 3 save slot used in-game. The data of such a save slot starts with the 8 byte magic word string PlVa0003 and is 0xC000 bytes (49152 bytes in decimal) long. Directly after the string follows a byte which has the slot number of the save (0x00 for first slot, 0x01 for second, 0x02 for third). The last 4 bytes of the slot data contain the checksum calculated for the preceding slot data. The checksum is detailed in this section.

Addresses

Addresses of interest relative to the start of the save slot (i.e. the start of the magic word string):

Address Size Description
0x14 4 bytes Integer representing the day count as shown on the file select screen (might not be permanent, i.e. overwritten when you end a day normally.)
0x2C 4 bytes Integer representing the Poko count as shown on the file select screen.
0x30 4 bytes Integer representing the treasure count as shown on the file select screen. Usually the same as the amount of treasures as accessed on the Area Select Screen.
0x3C 4 bytes Integer representing the time (in minutes) played on the save file as shown on the file select screen.
0x53 array of 2, 4 byte integers followed by a 1 byte bitmask 4 byte integer of Pikmin lost to the said enemy, followed by a 4 byte integer representing the amount of enemies killed, followed by a 1 byte bitmask 0b1 represents that the enemy has been unlocked in the Piklopedia and 0b10 represents that the enemy has been viewed in the Piklopedia.
0x3ED 2 bytes Bitmask for Exploration Kit items and their activity. The least significant bit represents the EK item with an internal ID of 0 When the bit is set to 1, the item is active. This activity does not reflect the treasure being collected.
0x3F1 21 length 4 byte array Pikmin types that fall from the sky during entering and exiting a cave. Editing this value on a save file that is on the area select screen will result in the Pikmin falling from the sky upon entering an area. The Pikmin types are organized into groups of three, with the first integer representing a leaf Pikmin, the second a bud Pikmin, and the third a flower Pikmin. The Pikmin types in the array are ordered Blue, Red, Yellow, Purple, White, Bulbmin, and an unused PikPik carrot.
0x479 21 length 4 byte array Same as above but for Pikmin in the Onions and Ship.

To do: Find out what happens when Bulbmin and PikPik carrots are added

0x4CF 188 length 1 byte array 1 byte each represents the treasure as accessed on the area select screen. Treasures appear to follow their internal IDs for order. These are all the treasures not part of the Exploration Kit (nor The Key). Non-zero values mean collected.

To do: find if there is a difference between the value being 0x2 or the more common 0x6

0x58D 13 length 1 byte array Same as above, only for Exploration Kit treasures including The Key.
0x834 4 bytes Actual Poko count the game registers, differing from what is displayed on the file select screen if only one of the two addresses is edited.

Checksum

The checksum of a save slot is calculated according to this method.

This Python script (requires Python >3.4) assists with calculating the checksum for the data in a save slot. Not recalculating and fixing the checksum results in the game detecting the modified save slot as being corrupted (but if you have any unmodified save slots, those will still work fine).

Very careful editing might allow you to fool the corruption detection without having to recalculate the value: Due to the checksum being an additive one, if you increase one value by 1 and decrease a different value by 1, the checksum should still remain valid.[unsure]