Each saved game has a MAZE.PTY file which contains all information about the party, such as party members, location, gold, and gems, as well as certain party achievements.
The MAZE.PTY file is found in every saved game CC file and can be found starting at the offsets of 0x3305 for Clouds/World of Xeen (both SAV and WOX files), 0x377D for Darkside, and 0x32FD for Swords. It can also be found in Might and Magic III ".MM3" saves starting at offset 0x2B23.
Unlike MAZE.CHR, which starts with a default "header" reading "Default Characters," MAZE.PTY does not have any such internal identification. This is most likely because it immediately follows the last character slot within MAZE.CHR.
File Format[]
The file should be exactly 812 bytes in Clouds of Xeen save files, and 1528 bytes in Darkside of Xeen files. When combined into World of Xeen, only the Darkside save file is used; the Darkside specific file format contains all Clouds specific data as well as the Darkside and additional content.
Darkside[]
Offset | Length | Data type | Name | Description |
---|---|---|---|---|
0x00 | 1 byte | byte | Party Count | Number of party members total (including hirelings) |
0x01 | 1 byte | byte | Real Party Count | Number of non-hireling party members |
0x02 | 8 bytes | byte array | Party Members | References into the MAZE.CHR file. 0 for no member in that slot. Xeen only uses max 6 |
0x0A | 1 byte | enum | Maze Direction | Facing direction of party. 0 = North, 1 = East, 2 = South, 3 = West |
0x0B | 1 byte | byte | Maze X | Party X position on map |
0x0C | 1 byte | byte | Maze Y | Party Y position on map |
0x0D | 1 byte | byte | Maze ID | The map party is currently in |
0x0E | 1 byte | boolean | Sound Flag | Game Configuration: Sound is on or off |
0x0F | 1 byte | boolean | Music Flag | Game Configuration: Music is on or off |
0x10 | 1 byte | unk | Unknown | Currently unknown and likely unused |
0x11 | 1 byte | byte | Temp Maze | The map party most recently came from |
0x12 | 1 byte | boolean | Levitate | Set if the levitate spell is active |
0x13 | 1 byte | boolean | Automap | Set if the automap is turned on |
0x14 | 1 byte | boolean | Wizard Eye | Set if the Wizard Eye spell is active |
0x15 | 1 byte | boolean | Clairvoyance | Set if the clairvoyance spell is active |
0x16 | 1 byte | boolean | WalkOnWater | Set if the Walk on Water spell is active |
0x17 | 1 byte | byte | Blessed | Set if the Blessed spell is active to the caster's level |
0x18 | 1 byte | byte | PowerShield | Set if the Power Shield spell is active to the caster's level |
0x19 | 1 byte | byte | HolyBonus | Set if the Holy Bonus spell is active to the caster's level |
0x1A | 1 byte | byte | Heroism | Set if the Heroism spell is active to the caster's level |
0x1B | 1 byte | boolean | Difficulty | Difficulty as selected at start of a new game. 0 = Adventurer, 1 = Warrior |
0x1C | 144 bytes | XeenItem*36 | Black Smith Weapons | Probably the weapons currently available at all blacksmiths, maybe |
0xAC | 144 bytes | XeenItem*36 | Black Smith Armor | Probably the armor currently available at all blacksmiths, maybe |
0x13C | 144 bytes | XeenItem*36 | Black Smith Accessories | Probably the accessories currently available at all blacksmiths, maybe |
0x1CC | 144 bytes | XeenItem*36 | Black Smith Misc | Probably the miscelaneous items currently available at all blacksmiths, maybe |
0x25C | 2 bytes | boolean | Clouds End | Set when the party defeats Lord Xeen and sees the Clouds End cutscene. Unknown why it is a short and not a byte |
0x25E | 2 bytes | boolean | Darkside End | Set when the party defeats Alamar and sees the Darkside End cutscene. Unknown why it is a short and not a byte |
0x260 | 2 bytes | boolean | World End | Set when the party unites Xeen and sees the World End cutscene. Unknown why it is a short and not a byte |
0x262 | 2 bytes | short | Hour? | Not the current hour. Unknown, but has something to do with time. |
0x264 | 2 bytes | short | Day | The current day of the year |
0x266 | 2 bytes | short | Year | The current year |
0x268 | 2 bytes | short | Minutes | The number of minutes since midnight. 60 minutes per hour used to display regular HH:MM time |
0x26A | 2 bytes | short | Food | The amount of food the party has. Each party member requires one piece of food per day/rest |
0x26C | 2 bytes | short | Light | The number of times the Light spell has been cast. May have had additional implementation, but final game only cares if greater than 0 |
0x26E | 2 bytes | short | Torch | The number of torches the party is carrying. Discarded feature not fully implemented in final game |
0x270 | 2 bytes | short | Fire | Party's magical resistance to fire |
0x272 | 2 bytes | short | Electricity | Party's magical resistance to electricity |
0x274 | 2 bytes | short | Cold | Party's magical resistance to cold and water |
0x276 | 2 bytes | short | Poison | Party's magical resistance to poison |
0x278 | 2 bytes | short | Deathcount | Number of times the party has died and had to reload |
0x27A | 2 bytes | short | WinCount | TODO: I forget |
0x27C | 2 bytes | short | LossCount | TODO: I forget |
0x27E | 4 bytes | integer | Gold | Gold currently on hand |
0x282 | 4 bytes | integer | Gems | Gems currently on hand |
0x286 | 4 bytes | integer | BankGold | Gold currently in the bank |
0x28A | 4 bytes | integer | BankGems | Gems currently in the bank |
0x28E | 4 bytes | integer | Total time | Number of seconds played. Counter is even active while file menu is up |
0x292 | 1 byte | boolean | Rested | Party has recently rested |
0x293 | 64 bytes | bit field | Game flags | 512 bits of flags that can be set and checked by scripts: 256 for Clouds, 256 for Darkside |
0x2D3 | 16 bytes | bit field | Autonotes | 127 bits of flags to display on the auto-notes page, first bit is unused and should always be false. 73 notes for Clouds, 55 notes for Darkside |
0x2E3 | 8 bytes | bit field | Quests | 64 bits of flags set when completing certain quests: 30 for Clouds quests, 34-40(confusion) for Darkside |
0x2EB | 85 bytes | byte array | Quest Items | Boolean and in some cases counts of special Quest Items: 35 for Clouds, 50 for Darkside |
0x340 | 144 bytes | XeenItem*36 | Black Smith Weapons 2 | Probably the weapons currently available at all blacksmiths, maybe, but different from before |
0x3D0 | 144 bytes | XeenItem*36 | Black Smith Armor | Probably the armor currently available at all blacksmiths, maybe, but different from before |
0x460 | 144 bytes | XeenItem*36 | Black Smith Accessories | Probably the accessories currently available at all blacksmiths, maybe, but different from before |
0x4F0 | 144 bytes | XeenItem*36 | Black Smith Misc | Probably the miscellaneous items currently available at all blacksmiths, maybe, but different from before |
0x580 | 90 bytes | bitfields*30 | Character flags | Additional bit flags associated with each character in the MAZE.CHR file. 24 bits per character, 30 characters total |
0x5DA | 30 bytes | unk | Unknown/unused | null values, probably never used |
Clouds[]
TODO
Notes[]
There exists partial support for hirelings, possibly remnants of MM3 code, or maybe a feature that was dropped due to time constraints. Either way, future reimplementation will like support hirelings again.
There are two sets of items. One is for Clouds, the other is for Darkside. Each side has 4 blacksmiths you can buy from. The items are not ordered sequentially by shop, but are interlaced: that is, the first item in the weapon list found at offset 0x340 belongs to blacksmith 1, the second item in the weapon list (at offset 0x344) belongs to blacksmith 2, etc... The second item found at blacksmith 1 is the 5th item in the list, found at offset 0x350.
The Terra/Xeen engine is coded pretty cleverly when it comes to time:
- Valid values for the current day are between 0 and 99. Any value beyond 99 gets reduced by 100 after 12am and 1 year is added... except 32,767. If you pass midnight on that day, the game adds another day and completely breaks the counter (and the Information display) until you reach 65,536, which then rolls the counter over to 0.
- Valid values for the current year seem to be between 0 and 65,535. Once you hit 65,536, however, the counter rolls back over to 0.
- Valid values for the current minute are between 0 and 1,439. Any values over 1,499 cause the hour display to show 13 or higher (Your value / 60 - 12), but the clock instantly fixes itself the instant the player takes any action by subtracting 1,440 minutes (and adding a day) until it can show a valid time. As always, 65,536 will reset the counter.
I'm pretty sure WinCount/LossCount has something to do with Warzone. This needs confirmation.
There seems to be some confusion with the quest flags. Perhaps there is overlap?
The last 30 bytes are a complete mystery, and probably completely unused.
Do we care about the format of the Clouds specific version of MAZE.PTY? It will be very similar, other than missing the Darkside additional fields. Since the reimplementation is only likely to work with World anyway, it may not be worthwhile finding those differences.