Each saved game has a MAZE.CHR file which contains a certain number of character slots, each of which can hold one character's details. The default MAZE.CHR file holds enough slots for 30 characters, however only 23-24 are used depending on which game is running. Each slot ties directly to the graphic that should be used as that character's face graphic, and a lookup is done on the slot index to determine the face graphic file (FACExx.CHR) to use.
The MAZE.CHR file does not contain any information about which characters are currently "in" the party. Information about which slots make up the party is stored in the MAZE.PTY file.
The MAZE.CHR file is found in every saved game CC file and can be found starting at the offsets of 0x96A for Clouds/World of Xeen (both SAV and WOX files), 0xDE2 for Darkside, and 0x962 for Swords. It can also be found in Might and Magic III ".MM3" saves starting at offset 0x782.
If, for some reason, a saved game does not have a name, the MAZE.CHR file defaults to the name "Default Characters". Every character of a save's name overwrites this value, followed by a 0X00 character which tells the game to stop reading the data. (0x20 is used for spaces in names.)
File Format[]
The file contains a header which contains the save file name and an unknown value:
Offset | Length | Data type | Name | Description |
---|---|---|---|---|
0x00 | 28 bytes (31 B, MM3) |
ASCIIZ | Save file name | Starts as "Default Characters" on a new game Every character is subsequently overwritten and the new name ends with a 0x00 character Only the first 20 bytes (24 in MM3) can be changed in-game |
0x1D | 2 bytes | uint16? | Clouds/Darkside toggle? | Defaults to 0x0000 for Clouds Defaults to 0x0100 for Darkside Doesn't seem to do anything regardless Does not exist in Might and Magic III. |
After the header rests a number of character entries, each of which is exactly 354 bytes in size for Xeen games or 303 bytes for Might and Magic III.
Each character slot consists of, in order:
Offset | Length | Data type | Name | Description |
---|---|---|---|---|
0x00 | 16 bytes | ASCIIZ | Character name | Only the first 10 bytes are used - the last 6 bytes should always be null |
0x10 | 1 byte | byte | Sex | 0x00 = Male 0x01 = Female |
0x11 | 1 byte | byte | Race | 0x00 = Human 0x01 = Elf 0x02 = Dwarf 0x03 = Gnome 0x04 = Half-Orc |
0x12 | 1 byte | byte | Save side | Byte indicating which side of the world is in use (Clouds or Darkside) Indicates Alignment in Might and Magic III: 0x00 = Good 0x01 = Neutral 0x02 = Evil |
0x13 | 1 byte | byte | Class | 0x00 = Knight 0x01 = Paladin 0x02 = Archer 0x03 = Cleric 0x04 = Sorcerer 0x05 = Robber 0x06 = Ninja 0x07 = Barbarian 0x08 = Druid 0x09 = Ranger |
0x14 | 2 bytes | attribute pair | Attribute - Might | The character's statistics, in a series of permanent and temporary (byte + byte) pairs |
0x16 | 2 bytes | attribute pair | Attribute - Intellect | |
0x18 | 2 bytes | attribute pair | Attribute - Personality | |
0x1A | 2 bytes | attribute pair | Attribute - Endurance | |
0x1C | 2 bytes | attribute pair | Attribute - Speed | |
0x1E | 2 bytes | attribute pair | Attribute - Accuracy | |
0x20 | 2 bytes | attribute pair | Attribute - Luck | |
0x22 | 1 byte | byte | AC temp | The character's temporary AC bonus - their base AC isn't stored as it is calculated based on their attributes and equipment |
0x23 | 2 bytes | attribute pair | Level | The character's level |
0x25 | 1 byte | byte | DB Day | The character's birthday (Day of the year) |
0x26 | 1 byte | byte | Temp age | The amount of unnatural aging the character is suffering from |
0x27 | 18 bytes | byte * 18 | Skills | 0x00 = Thievery 0x01 = Arms Master 0x02 = Astrologer 0x03 = Bodybuilder 0x04 = Cartographer 0x05 = Crusader 0x06 = Direction Sense 0x07 = Linguist 0x08 = Merchant 0x09 = Mountaineer 0x0A = Navigator 0x0B = Pathfinder 0x0C = Prayer Master 0x0D = Prestidigation 0x0E = Swimming 0x0F = Tracking 0x10 = Spot Secret Doors 0x11 = Danger Sense |
0x39 | 64 bytes | bitfield | Awards | A bitfield where each bit represents an award the character can receive |
0x79 | 39 bytes | bitfield | Spells | A bitfield where each bit represents a spell the character could possess |
0xA0 | 1 byte | byte | Lloyd's map | The ID of the map the character's Lloyd's Beacon spell is set to |
0xA1 | 1 byte | byte | Lloyd's X | The X-coordinate of the map the character's Lloyd's Beacon spell is set to |
0xA2 | 1 byte | byte | Lloyd's Y | The Y-coordinate of the map the character's Lloyd's Beacon spell is set to |
0xA3 | 1 byte | byte | Has spells | |
0xA4 | 1 byte | byte | Current spell | |
0xA5 | 1 byte | byte | Quick option | |
0xA6 | 36 bytes | XeenItem * 9 | Weapons | XeenItem structures representing the weapons the character possesses |
0xCA | 36 bytes | XeenItem * 9 | Armor | XeenItem structures representing the armor the character possesses |
0xEE | 36 bytes | XeenItem * 9 | Accessories | XeenItem structures representing the accessories the character possesses |
0x112 | 36 bytes | XeenItem * 9 | Misc | XeenItem structures representing the miscellaneous items the character possesses |
0x136 | 1 byte | byte | Lloyd's side | A byte indicating which side of the world the character's Lloyd's Beacon spell is set to |
0x137 | 2 bytes | attribute pair | Resistance - Fire | The character's resistances, in a series of permanent and temporary (byte + byte) pairs |
0x139 | 2 bytes | attribute pair | Resistance - Cold | |
0x13B | 2 bytes | attribute pair | Resistance - Electricity | |
0x13D | 2 bytes | attribute pair | Resistance - Poison | |
0x13F | 2 bytes | attribute pair | Resistance - Energy | |
0x141 | 2 bytes | attribute pair | Resistance - Magic | |
0x143 | 16 bytes | byte * 16 | Conditions | A byte for each condition, indicating how afflicted the character is. For example, a 'poisioned' value of 1 is relatively minor but will increase over time to a potentially fatal value - this is handled differently for each condition. 0x00 = Cursed 0x01 = Heart Broken 0x02 = Weak 0x03 = Poisoned 0x04 = Diseased 0x05 = Insane 0x06 = In Love 0x07 = Drunk 0x08 = Sleep 0x09 = Depressed 0x0A = Confused 0x0B = Paralyzed |
0x153 | 2 bytes | uint16? | Unknown #1 | Something to do with the current town? |
0x155 | 1 byte | byte? | Unknown #2 | Unknown |
0x156 | 2 bytes | uint16 | Current HP | The character's current amount of hit points |
0x158 | 2 bytes | uint16 | Current SP | The character's current amount of spell points |
0x15A | 2 bytes | uint16 | YB day | The character's birth year |
0x15C | 4 bytes | uint32 | Experience | The character's current amount of experience |
0x160 | 1 byte | byte | Current adventuring spell | Index to the last spell used while adventuring (i.e. not in combat) |
0x161 | 1 byte | byte | Current combat spell | Index to the last spell used while in combat |
The player is given a total of 24 character slots in World of Xeen games and 20 in Might and Magic III (with the last 10 being Hirelings).
While there is room in the data file for six more party members in World of Xeen, the game does not acknowledge their existence. It's possible these extra slots were reserved for a Hireling system, as carry-over data from Might and Magic III exists in the party file for two more party members.
Forcing these extra characters into your party via hacking will cause the game to crash with an error message asking for a missing character face file ("char30.fac," for example), but it's possible they're fully functional character slots otherwise.