Monster Rancher DS/Notes

From Data Crystal
Jump to navigation Jump to search

Save file

Save files for the game consist of 3 main sections:

  • Header - The text `MonsterRancherDS` in ASCII repeated twice.
  • Save entry 1 - First instance of the save data.
  • Save entry 2 - Second instance of the save data.

Each save entry contains the player information, monster data, etc. of the playthrough. The file having two copies of the data is likely to have a backup copy in case the game is turned off in the middle of writing the save file. Each save entry includes two checksums, and if the checksum is incorrect for one of the save entries then the game will load from the other save entry.

Checksums

Each save entry has two checksums:

  • Header checksum
  • Body checksum

The checksums are calculated using the following algorithm:

# Checksum the header data
checksum = 0xFFFFFFFF
for byte in data[:56]:
    lookup = SAVE_FILE_CHECKSUM_MAPPING[(checksum ^ byte) & 0xFF]
    checksum = lookup ^ checksum >> 8

header_checksum = checksum ^ 0xFFFFFFFF

# Update the header checksum in the data, since it is processed as a part of the body
# checksum
data[56:60] = header_checksum.to_bytes(4, "little")

# Checksum the header + body
checksum = 0xFFFFFFFF
for byte in data[:0x3CDC]:
    lookup = SAVE_FILE_CHECKSUM_MAPPING[(checksum ^ byte) & 0xFF]
    checksum = lookup ^ checksum >> 8

body_checksum = checksum ^ 0xFFFFFFFF

The algorithm uses the following byte to 32-bit unsigned int mapping:

# Index is the byte value. Ex. \x01 maps to 0x77073096
SAVE_FILE_CHECKSUM_MAPPING = [
    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
]

Format

struct Monster {
    u8 name[12];
    u8 unknown_a[6];
    u16 species_id;
    u8 unknown_b[20];
    u16 power;
    u16 intelligence;
    u16 skill;
    u16 speed;
    u16 defense;
    u16 life;
    u8 unknown_c[368];
};

struct SaveEntry {
    u8 save_counter;
    u8 unknown_a[4];
    bool did_not_quit;
    u8 unknown_b[4];
    u8 ranch_name[13];
    u8 unknown_c[4];
    u8 player_name[13];
    u8 unknown_d[16];
    u32 header_checksum;
    u8 unknown_e[292];
    u32 gold;
    u16 items[50];
    Monster monsters[31];
    u8 unknown_f[2104];
    u32 checksum;
};

struct SaveFile {
    u8 header[34];
    SaveEntry entries[2];
};

SaveFile save @ 0x0;

IDs

Items

ID   Item
--   -------
00   Banana Ring
01   Medicinal Herb
02   Honey Shroom
03   Monster Candy
04   Elixir
05   Sea Angel
06   Soda Lozenge
07   Worm Fungus
08   Roll Cake
09   Shock Rock
0A   Fatty Meat
0B   Blade Weed
0C   Rosemoon
0D   Silver Peach
0E   Gold Peach
0F   Hot Lozenge
10   Soybean Flour
11   Dragon Scale
12   Spook Bug
13   Red Mango
14   Bell Flower
15   Lif. Fruit
16   Pow. Fruit
17   Int. Fruit
18   Skil. Fruit
19   Spd. Fruit
1A   Def. Fruit
1B   Slate Fragment (Abyss)
1C   Slate Fragment (Ogyo)
1D   Slate Fragment (Golem)
1E   Slate Fragment (Color Pandora)
1F   Slate Fragment (Suezo)
20   Slate Fragment (Ducken)
22   Slate Fragment (Baku)
23   Slate Fragment (Mew)
24   Slate Fragment (Hare)
25   Slate Fragment (Pancho)
26   Slate Fragment (Pixie)
27   Slate Fragment (Piroro)
28   Slate Fragment (Falco)
29   Slate Fragment (Plant)
2A   Slate Fragment (Mocchi)
2B   Slate Fragment (Tiger)
2C   Slate Fragment (Lesione)
2D   Slate Fragment (Zan)
2E   Slate Fragment (Joker)
2D   Slate Fragment (Xenon)
2F   Slate Fragment (Durahan)
30   Slate Fragment (Dragon)
31   Slate Fragment (Beaclon)
32   Slate Fragment (Pheonix)
33   Slate Fragment (Hengar)
34   Slate Fragment (Gali)
35   Slate Fragment (Centaur)
36   Slate Fragment (Naga)
37   Slate Fragment (Monol)
38   King's Proof
39   None (Pot)
3A   None (Duck)
3B   Dragon Fang
3C   Twin Edge
3D   Fire Feather
3E   Cursed Mask
3F   None (Mew doll)
40   None (Sword in sheath)
41   Ancient Weapon
42   Gali Mask
43   Knight's Lance
44   Naga Scale
45   Black Slate
46   Pupa
47   Silver Nugget
48   Gold Nugget
49   Platinum
4A   Sculpture
4B   Gemini's Pot
4C   Weather Doll
4D   Ice Cube
4E   Cricket Chime
4F   Fire Stone
50   Music Box
51   Ancient Relief 1 (Abyss)
52   Ancient Relief 2 (Falco)
53   Old Sheath
54   Old Sword
55   None (Hengar part 1)
56   None (Hengar part 2)
57   None (Hengar part 3)
58   None (Hengar part 4)
59   None
5A   None (Crystal 1)
5B   None (Crystal 2)
5C   None (Crystal 3)
5D   None (Crystal 4)
5E   None (Crystal 5)
5F   None (Crystal 6)
60   None (Crystal 7)
61   None (Crystal 8)
62   None (Crystal 9)
63   None (Crystal 10)
64   None (Crystal 11)
65   None (Crystal 12)
66   No Food
67   Potato
68   Pasta
69   Turnip
6A   Fish
6B   Milk
6C   Cup Jelly
6D   Meat
6E   Tofu
6F   Tablet