Pokémon DP Save File Structure

From ProjectPokemon Wiki
Jump to navigation Jump to search

General Save File Structure

A Pokémon Diamond, Pearl, and Platinum save file is broken down into two pairs of blocks. Each pair consists of one small block and one big block. One big block contains current information regarding the PC storage system, including stored Pokémon, box names, box wallpapers, and the current open box. One small block contains current information on every other aspect of the game's progress, such as the trainer's name, ID number, acquired badges, party Pokémon, items, and much more. The other pair of blocks is a backup of the saved information.

The first small block in the file begins at 0x00000. The first big block begins at 0x0C100. The second small and big blocks are at the same address + 0x40000. It is important to note that the current small and current big blocks are not always stored in order in the save file (i.e. if the second small block is the more current, the first or second big block can possibly be the more current as well).

Block Footers

The last 20 bytes of each save block is a footer. The footer is used to determine:

  • Whether the block is big or small
  • Whether the block is current or a backup.
  • Which big & small blocks link together.

Block footer structure:

Offset Purpose
0x00 - 0x03 Save ID number
0x04 - 0x07 Save index number
0x08 - 0x0B Size of block
0x0C - 0x0F Run-time variable
0x10 - 0x11 Run-time variable
0x12 - 0x13 Checksum

Loading/Saving A Save File

When the game loads the save file, it first compares the save index number of each small block. If the small block with the highest save index number has a correct checksum, then the game checks to see which big block has a matching ID number. If both big blocks have the same ID number as the small block, then the big block with the highest save index number is chosen. If the big block chosen by the save file has a correct checksum, then the game loads successfully. If the checksum is incorrect in either the small or big block, the game reverts to the other block pair. If either of their checksums are incorrect, then no data is loaded, and a new game must be started.

When the game saves data, the save index number is incremented + 1 from the current save index number, and the backup small block is overwritten with the new data.

If nothing in the big block has changed, then the save ID number in both blocks is retained. However, if changes have been made to the big block, then the backup big block is overwritten with the new data, and a new save ID number is generated, which is then written to the new small block. This is the reason why the game varies on how long it takes to save.

Thus, either small block can be linked with either big block, and the current pair is identified using the footer information.

Small block offsets

Adventure Started - 0x34

  • Unsigned 32bit integer.
  • Number of seconds since 1/1/2000 00:00:00

Pokémon League Champ Date - 0x3C

  • Unsigned 32bit integer.
  • Number of seconds since 1/1/2000 00:00:00

Trainer Name - 0x64

Trainer ID - 0x74

  • Random unsigned 16bit integer
  • The visible identification number of a trainer
  • Determines ownership of Pokémon.

Secret ID - 0x76

  • Random unsigned 16bit integer
  • The hidden identification number of a trainer
  • Determines ownership of Pokémon.
  • Determines variation in the game.

Money - 0x78

  • Unsigned 32bit integer.
  • Limited to 0xF423F (99,999)

Trainer Gender - 0x7C

  • 0 if male, 1 if female.
  • Determines ownership of Pokémon.

Multiplayer Avatar - 0x7F

  • Unsigned 8bit integer.
  • Determines the sprite seen by other players in a multiplayer environment such as the Union Room.
0x00 = None
0x03 = School Kid
0x05 = Bug Catcher
0x06 = Lass
0x07 = Battle Girl
0x0B = Ace Trainer Male
0x0D = Beauty
0x0E = Ace Trainer Female
0x0F = Roughneck
0x1F = Pop Idol
0x23 = Social
0x25 = Cowgirl
0x2A = Ruin Maniac
0x32 = Black Belt
0x3E = Rich Boy
0x3F = Lady
0x46 = Psychic

Number of Current Party Pokémon - 0x94

  • Unsigned 8bit integer.

Party Pokémon - 0x98

The Pokémon in the trainer's party.

  • 6 blocks of 236byte structures
Main article: Pokemon NDS Structure

Fly Locations - 0x1112

  • 9byte bit field

Berry Trees - 0x1E84

Main article: Berry Trees

Rival's Name - 0x25A8

Safari Zone Pokémon - 0x72D0

  • Unsigned 32bit integer result from the ARNG.
  • Four daily safari zone Pokémon
  • Indexn = ( ARNG >> ( n * 0x5 ) ) & 0x1F
  • List of Safari Zone Pokémon
  • Notes: Both Safari Zone Pokémon and Swarm Pokémon have the same ARNG value.

Swarm Pokémon - 0x72D4

Daily Trophy Pokémon Today - 0x72DC

Daily Trophy Pokémon Yesterday - 0x72DE

Honey Trees - 0x72E4

Main article: Honey Trees