monster.md File Format
The "monster.md" contained in the "/BALANCE" directory, contains data for every single unique entities in the game.
Explorers of Sky's monster.md has a unique entity entry format. Entries in EoS are 68 bytes long, while in EoT/D they're 76 bytes long. Additionally, there is a "monster.mnd" file in EoT/D that appears to contain extra data related to entities in the "monster.md" file.
File Structure
Overview
Offset | Length | Endianness | Type | Name | Description |
---|---|---|---|---|---|
0x00 | 8 | MonsterData Header | A very short header for the MD format. | ||
0x08 | (NbEntries * 68) | Entities Data Block | A block containing entries for every entities in the game. |
MonsterData Header
Offset | Length | Endianness | Type | Name | Description |
---|---|---|---|---|---|
0x00 | 4 | Magic Number | The string "MD\0\0", { 0x4D, 0x44, 0x0, 0x0 }, or 0x4D440000. | ||
0x04 | 4 | NbEntries | The amount of entries in the Entities Data Block. |
Entities Data Block
Simply one entity's entry after another, no padding whatsoever.
The file contains 1,155 entries. The Pokemon in the National Pokedex from 1 to 493 are represented in here. Entry #0 is a dummy entry.
There are several reasons why the file contains 1,155 entries:
- Every entities has a duplicate entry. One for each of its gender. Even genderless, or female/male-only species have 2 entries.
- Several entities are dummy placeholders, mainly copies of Arceus's data.
- Several entities are for special NPC characters in the game.
The layout of the data is :
- Entries [0 to 600[ contains data for the default gender, usually male, genderless, or female.
- Entries [600 to 1,154] contains data for the secondary gender, either female, or invalid.
The secondary entries that have their gender set to "invalid" usually are genderless or single gender specie.
Move set data, level-up data, name string, category string, and a possibly a few others, are associated to the index in the "monster.md" file of the entries [0 to 600[. The only exception to this is the way pokemon faces are assigned. The kaomado.kao file contains 1,155. Which is one for every single entity entry in the "monster.md" file. This allows separate genders to have a different set of face portraits. Its used for several Pokemon that exhibit physical gender differences.
- A little more on kaomado.kao
- Species for which both gender are physically identical have a single set of portraits corresponding to the index of their primary gender entry in "monster.md", while the entry for their secondary gender are all null. The game probably falls back to the primary gender's entry when no portrait data is found for the secondary gender.
Entity Entry (Explorers of Sky)
Entry for a single entity follow this layout. Several things in here aren't 100% certain yet however.
Offset | Length | Type | Name | Description |
---|---|---|---|---|
0x00 | 2 | uint16 | EntityID | A entity-unique ID to identify the entity in both of its 2 entries. (Independent from file index) |
0x02 | 2 | uint16 | Unk#31 | Unknown. Pokemon with the same category string have the same value in here. |
0x04 | 2 | uint16 | NationalPokedexNb | The national Pokedex number, as displayed in Chimecho's assembly. |
0x06 | 2 | uint16 | Unk#1 | Unknown, seems to be 0x1 for most pokemon ! ( smaller than 1 => Slowed down status, 1 = no status, bigger than 1 => Sped up status ) |
0x08 | 2 | uint16 | PreEvoIndex | The INDEX of the pre-evolution inside the "monster.md" file. Not the Pokedex number, or the Entity ID! Is 0 if none. |
0x0A | 2 | uint16 | EvolutionMethod | The evolution method required to evolve to this Pokemon from the pre-evo specified in PreEvoIndex. Null if unused. |
0x0C | 2 | uint16 | EvoParam#1 | The first parameter for the evolution method. Null if unused. |
0x0E | 2 | uint16 | EvoParam#2 | The second parameter for the evolution method. Null if unused. |
0x10 | 2 | uint16 | SpriteIndex | The index of the Entity's sprite. Its the index inside the three Pokemon sprite files inside the "/MONSTER/" directory! |
0x12 | 1 | uint8 | Gender | Gender of this particular entity entry. (0 = Invalid, 1 = Male, 2 = Female, 3 = Genderless) |
0x13 | 1 | uint8 | BodySize | The body size of the Pokemon. Used when determining how many Pokemon fits in the party. |
0x14 | 1 | uint8 | PrimaryType | The Pokemon's primary type. |
0x15 | 1 | uint8 | SecondaryType | The Pokemon's secondary type. |
0x16 | 1 | uint8 | MovementType | This decides what terrains the entity can move over, and whether its hovering or not. |
0x17 | 1 | uint8 | IQGroup | The IQ group the Pokemon belongs to. |
0x18 | 1 | uint8 | PrimaryAbility | The Pokemon's primary ability's ID. |
0x18 | 1 | uint8 | SecondaryAbility | The Pokemon's secondary ability's ID. |
0x1A | 2 | uint16 | BitFlag1 | Most likely used to store bitflags! |
0x1C | 2 | uint16 | ExpYield | Possibly the Exp yield. |
0x1E | 2 | int16 | RecruitRate1 | Possibly another recruit rate, this one is usually closer to 0 when RecruitRate1 and RecruitRate2 are different! |
0x20 | 2 | int16 | BaseHp | The HP the Pokemon has at lvl 1. |
0x22 | 2 | int16 | RecruitRate2 | Possibly recruit rate. |
0x24 | 1 | int8 | BaseAtk | The attack stat of the Pokemon at lvl 1. |
0x25 | 1 | int8 | BaseSpAtk | The special attack stat of the Pokemon at lvl 1. |
0x26 | 1 | int8 | BaseDef | The defense stat of the pokemon at lvl 1. |
0x27 | 1 | int8 | BaseSpDef | The base special defense of the pokemon at lvl 1. |
0x28 | 2 | int16 | Weight | Probably the weight tier for weight based damages. |
0x2A | 2 | int16 | Size | Probably the size tier for size based damages. |
0x2C | 1 | int8 | Unk#17 | Unknown. Most of the time 0xA. |
0x2D | 1 | int8 | Unk#18 | Unknown. Most of the time 0xA. |
0x2E | 1 | int8 | Unk#19 | Unknown. Value seems between. |
0x2F | 1 | int8 | Unk#20 | Unknown. Most of the 0x8. |
0x30 | 2 | int16 | Unk#21 | Always 0x64. Possibly max level for the Pokemon ? |
0x30 | 2 | int16 | Unk#21 | Always 0x64. Possibly max level for the Pokemon ? |
0x32 | 2 | int16 | BaseFormIndex | Seems to match the index in the "monster.md" file of the Pokemon's first form's first entry.. Its always the index of the entry within the 0 to 600 range! Never the one between 600 and 1155 ! |
0x34 | 2 | int16 | ExclusiveItem#1 | The first 1-star exclusive item for this Pokemon. Null if NA. |
0x36 | 2 | int16 | ExclusiveItem#2 | The second 1-star exclusive item for this Pokemon. Null if NA. |
0x38 | 2 | int16 | ExclusiveItem#3 | The 2-star exclusive item for this Pokemon. Null if NA. |
0x3A | 2 | int16 | ExclusiveItem#4 | The 3-star exclusive item for this Pokemon. Null if NA. |
0x3C | 2 | int16 | Unk#27 | Unknown. Values so far : 0x2EE, 0x320. |
0x3E | 2 | int16 | Unk#28 | Unknown. Often 0xF. |
0x40 | 2 | int16 | Unk#29 | Unknown. |
0x42 | 2 | int16 | Unk#30 | Unknown. |
Entity Entry (Explorers of Time/Darkness)
Each monster.md entry in Explorers of Time/Darkness is 76 bytes long.
Evolution Method
WARNING: The following are based on observing the data for several Pokemon, and there is a possibility the role of each fields and value is not entirely accurate.
Value | Evolution Method | Parameter#1 Use | Parameter#2 Use |
---|---|---|---|
0x00 | None | - | - |
0x01 | Level | (uint16)Level required to evolve | (uint16)Optional evolutionary item ID |
0x02 | IQ | (uint16)IQ required | (uint16)Optional evolutionary item ID |
0x03 | Item(s) | (uint16)Regular Item ID | (uint16)Optional evolutionary item ID |
0x04 | Unknown | - | - |
0x05 | Link Cable | (uint16)Null | (uint16)0x01 |
Evolutionary item ID are numbered from 1 to 7 apparently:
ID | Name |
---|---|
0x01 | Link Cable |
0x02 | Unknown |
0x03 | Unknown |
0x04 | Unknown |
0x05 | Sun Ribbon |
0x06 | Lunar Ribbon |
0x07 | Beauty Scarf |
Type List
Value | Type |
---|---|
0x00 | None |
0x01 | Normal |
0x02 | Fire |
0x03 | Water |
0x04 | Grass |
0x05 | Electric |
0x06 | Ice |
0x07 | Fighting |
0x08 | Poison |
0x09 | Ground |
0x0A | Flying |
0x0B | Psychic |
0x0C | Bug |
0x0D | Rock |
0x0E | Ghost |
0x0F | Dragon |
0x10 | Dark |
0x11 | Steel |
0x12 | Neutral |
Ability IDs List
List of all the possible Pokemon abilities.
Value | Ability |
---|---|
0x1 | Stench |
0x2 | Thick Fat |
0x3 | Rain Dish |
0x4 | Drizzle |
0x5 | Arena Trap |
0x6 | Intimidate |
0x7 | Rock Head |
0x8 | Air Lock |
0x9 | Hyper Cutter |
0xA | Shadow tag |
0xB | Speed Boost |
0xC | Battle Armor |
0xD | Sturdy |
0xE | Suction Cups |
0xF | Clear Body |
0x10 | Torrent |
0x11 | Guts |
0x12 | Rough Skin |
0x13 | Shell Armor |
0x14 | Natural Cure |
0x15 | Damp |
0x16 | Limber |
0x17 | Magnet Pull |
0x18 | White Smoke |
0x19 | Synchronize |
0x1A | Overgrow |
0x1B | Swift Swim |
0x1C | Sand Stream |
0x1D | Sand Veil |
0x1E | Keen Eye |
0x1F | Inner Focus |
0x20 | Static |
0x21 | Shed Skin |
0x22 | Huge Power |
0x23 | Volt Absorb |
0x24 | Water Absorb |
0x25 | Forecast |
0x26 | Serene Grace |
0x27 | Poison Point |
0x28 | Trace |
0x29 | Oblivious |
0x2A | Truant |
0x2B | Run Away |
0x2C | Sticky Hold |
0x2D | Cloud Nine |
0x2E | Illuminate |
0x2F | Early Bird |
0x30 | Hustle |
0x31 | Drought |
0x32 | LightningRod |
0x33 | CompoundEyes |
0x34 | Marvel Scale |
0x35 | Wonder Guard |
0x36 | Insomnia |
0x37 | Levitate |
0x38 | Plus |
0x39 | Pressure |
0x3A | Liquid Ooze |
0x3B | Color Change |
0x3C | Soundproof |
0x3D | Effect Spore |
0x3E | Flame Body |
0x3F | Minus |
0x40 | Own Tempo |
0x41 | Magma Armor |
0x42 | Water Veil |
0x43 | Swarm |
0x44 | Cute Charm |
0x45 | Immunity |
0x46 | Blaze |
0x47 | Pickup |
0x48 | Flash Fire |
0x49 | Vital Spirit |
0x4A | Chlorophyll |
0x4B | Pure Power |
0x4C | Shield Dust |
0x4D | Ice Body |
0x4E | Stall |
0x4F | Anger Point |
0x50 | Tinted Lens |
0x51 | Hydration |
0x52 | Frisk |
0x53 | Mold Breaker |
0x54 | Unburden |
0x55 | Dry Skin |
0x56 | Anticipation |
0x57 | Scrappy |
0x58 | Super Luck |
0x59 | Gluttony |
0x5A | Solar Power |
0x5B | Skill Link |
0x5C | Reckless |
0x5D | Sniper |
0x5E | Slow Start |
0x5F | Heatproof |
0x60 | Download |
0x61 | Simple |
0x62 | Tangled Feet |
0x63 | Adaptability |
0x64 | Technician |
0x65 | Iron Fist |
0x66 | Motor Drive |
0x67 | Unaware |
0x68 | Rivalry |
0x69 | Bad Dreams |
0x6A | No Guard |
0x6B | Normalize |
0x6C | Solid Rock |
0x6D | Quick Feet |
0x6E | Filter |
0x6F | Klutz |
0x70 | Stedfast |
0x71 | Flower Gift |
0x72 | Poision Heal |
0x73 | Magic Guard |
0x74 | $$$ |
0x75 | Honey Gather |
0x76 | Aftermath |
0x77 | Snow Cloak |
0x78 | Snow Warning |
0x79 | Forewarn |
0x7A | Storm Drain |
0x7B | Leaf Guard |
IQ Groups List
Here are the possible values for a Pokemon's IQ group:
Value | IQ Group |
---|---|
0x0 | A |
0x1 | B |
0x2 | C |
0x3 | D |
0x4 | E |
0x5 | F |
0x6 | G |
0x7 | H |
0x8 | Unused |
0x9 | Unused |
0xA | I |
0xB | J |
0xC | Unused |
0xD | Unused |
0xE | Unused |
0xF | Invalid |
Movement Types List
Defines on what types of terrain the Pokemon can move on. All types above "Standard" also include the terrain Standard refers to.
Value | Movement Type |
---|---|
0x0 | Standard |
0x1 | Unknown |
0x2 | Hovering |
0x3 | Unknown |
0x4 | Lava |
0x5 | Water |
More Details
Credits
- Jellynater for the list of Pokemon abilities.
- TruePikachu for some of the details on the monster.md format! [1]
- The WMS project, for their notes. [2]
- OgreGunner and nhahtdh for that huge thread on GameFaqs filled with tidbits of information! [3]
- Kelvin Chung for the .grammar file containing much useful information on the PMD:RRT format, which share similarities with PMD2! [4]