Ultima 5 File Formats (C64 version)
===================================
Last updated on 29-February-2004.
Please send additions, corrections and feedback to this e-Mail address:
Remove space + vowels from "marc winterrowd" and append "at yahoo dot com"
Tools for reverse-engineering C64 programs
-------------------------------------------
If you want to play Ultima 5 in a C64 emulator, I suggest you use VICE:
http://www.viceteam.org/
VICE comes with c1541, a utility for manipulating C64 disk images. You can
use it to extract the Ultima 5 savegame files.
General Information
-------------------
Ultima 5 saves the game on the Britannia disk.
More specifically, the game is saved in these files:
- prty.data
- roster
- and probably others
Numbers are usually stored as BCD's.
The high nibble contains the 10's, the low nibble contains the 1's.
In 2-byte BCD's, the low byte contains the 1000's and 100's, the high byte
contains the 10's and 1's.
The game doesn't store all numbers as BCD's. If a number isn't meant to be
displayed, the game stores it as a binary number.
ROSTER
------
offset length purpose
0x0 2 ?
0x2 8 character 1 name (Avatar)
0xA 8 character 2 name
0x12 8 character 3 name
0x1A 8 character 4 name
0x22 8 character 5 name
0x2A 8 character 6 name
0x32 8 character 7 name
0x3A 8 character 8 name
0x42 8 character 9 name
0x4A 8 character 10 name
0x52 8 character 11 name
0x5A 8 character 12 name
0x62 8 character 13 name
0x6A 8 character 14 name
0x72 8 character 15 name
0x7A 8 character 16 name
0x82 0x10 character 1 stats (Avatar)
0x92 0x10 character 2 stats
0xA2 0x10 character 3 stats
0xB2 0x10 character 4 stats
0xC2 0x10 character 5 stats
0xD2 0x10 character 6 stats
0xE2 0x10 character 7 stats
0xF2 0x10 character 8 stats
0x102 0x10 character 9 stats
0x112 0x10 character 10 stats
0x122 0x10 character 11 stats
0x132 0x10 character 12 stats
0x142 0x10 character 13 stats
0x152 0x10 character 14 stats
0x162 0x10 character 15 stats
0x172 0x10 character 16 stats
0x182 2 food
0x184 2 gold
0x186 1 keys
0x187 1 gems
0x188 1 torches
0x189 1 grapple
0x18A 1 magic carpets
0x18B 1 Shadowlord of Falsehood (location)
0 = none
1 = Moonglow
2 = Britain
3 = Jhelom
4 = Yew
5 = Minoc
6 = Trinsic
7 = Skara Brae
8 = New Magincia
0xFF = destroyed
0x18C 1 Shadowlord of Hatred (location)
0x18D 1 Shadowlord of Cowardice (location)
0x18E 1 ordained shrine quests
bit 0 = honesty
bit 1 = compassion
bit 2 = valor
bit 3 = justice
bit 4 = sacrifice
bit 5 = honor
bit 6 = spirituality
bit 7 = humility
0x18F 1 ?
0x190 1 completed shrine quests
bits have the same meaning as in 0x18E
0x191 1 ?
0x192 6 character 1 slots (Avatar)
0x198 6 character 2 slots
0x19E 6 character 3 slots
0x1A4 6 character 4 slots
0x1AA 6 character 5 slots
0x1B0 6 character 6 slots
0x1B6 6 character 7 slots
0x1BC 6 character 8 slots
0x1C2 6 character 9 slots
0x1C8 6 character 10 slots
0x1CE 6 character 11 slots
0x1D4 6 character 12 slots
0x1DA 6 character 13 slots
0x1E0 6 character 14 slots
0x1E6 6 character 15 slots
0x1EC 6 character 16 slots
0x1F2 1 Shard of Falsehood
0x1F3 1 Shard of Hatred
0x1F4 1 Shard of Cowardice
0x1F5 1 spy glasses
0x1F6 1 HMS Cape Plans
0x1F7 1 sextants
0x1F8 1 pocket watch (0xFF = present)
0x1F9 1 skull keys
0x1FA 1 Amulet of Lord British
0x1FB 1 Crown of Lord British
0x1FC 1 Sceptre of Lord British
0x1FD 1 Black Badge
0x1FE 1 Sandalwood Box
0x1FF 1 ?
0x200 1 ?
0x201 1 ?
0x202 0x10 Armor
0x212 0x1A Weapons
0x22C 3 Rings
0x22F 3 Amulets
0x232 8 open/sealed flag for each dungeon
0 = sealed
0x80 = open
0x23A 8 destroyed/ok flag for each shrine
One byte per shrine, only bit 0x80 is used.
bit 0x80 = 0 --> ok
bit 0x80 = 1 --> destroyed
0x242 0x30 Spells
0x272 8 Scrolls
0x27A 8 Potions
--- Moonstones ---
0x282 8 x coordinate of each moonstone, only valid if it's
buried (range = 0-0xFF)
0x28A 8 y coordinate of each moonstone, only valid if it's
buried (range = 0-0xFF)
0x292 8 flag for each moonstone:
0 = buried
0xFF = in the party's inventory
0x29A 8 z coordinate of each moonstone, only valid if it's
buried (range = 0,0xFF)
0 = buried in Britannia
0xFF = buried in the Underworld
--- Reagents ---
0x2A2 8 Reagents
0x2AA ?
0x3C2 0xE dungeon room cleared flags (7 dungeons, 2 bytes
per dungeon)
0x3D0 ?
--- Character Names ---
Character names have a maximum length of 8 chars.
The chars are stored in ASCII format.
All chars also have bit 0x80 set, except for the last one.
If the name is shorter than 8 chars, it is padded with zeroes to make it
8 bytes long.
--- Character Stats ---
0x0 1 inn/party
0x1 1 gender (0x3E = male, 0x3D = female)
0x2 1 class (upper-case ASCII char, bit 0x80 set)
0x3 1 status (upper-case ASCII char, bit 0x80 set)
0x4 1 strength
0x5 1 dexterity
0x6 1 intelligence
0x7 1 current mp
0x8 2 current hp
0xA 2 maximum hp
0xC 2 exp points
0xE 1 level
0xF 1 ?
--- Character Slots ---
Unlike the DOS version, the C64 version doesn't assign a fixed slot to each
body part.
If you ready a piece of equipment, the C64 version simply puts it in the
next free slot. Non-empty slots don't have to be contiguous.
PRTY.DATA
---------
0x0 ?
0x2 1 x coord of party (relative to upper left corner of the
upper left cached-in chunk)
0x3 1 y coord of party (relative to upper left corner of the
upper left cached-in chunk)
0x4 ?
0x9 1 z coordinate of the party (level)
0xA 1 party location
0xB 1 ?
0xC 1 mode of transportation
0xD ?
0xF 1 dungeon orientation
0 = north
3 = west
2 = south
1 = east
0x10 1 remaining torch duration (turns, not a BCD)
0x11 1 remaining light spell duration (turns, not a BCD)
0x12 ?
0x17 1 type of ship bought from a shipwright
0x18 1 x coordinate of purchsed ship
0x19 1 y coordinate of purchsed ship
0x1A 2 year
0x1C 1 month
0x1D 1 day
0x1E 1 hour
0x1F 1 minute
0x20 1 protective spell type (icon shown between stats and
food/gold window)
0x21 1 protective spell duration (turns, not a BCD)
0x22 1 number of hours until the party can get healed by
camping
Set to 0xE when the party gets healed by camping.
Must be 0 when the party starts camping, or the party
won't get healed.
0x23 1 wind direction
0x24 ?
0x28 1 copy of 0x1E?
0x29 1 ?
0x2A 1 karma (BCD)
0x2B 1 number of drunken moves until you can move normally
again
Set to 0x19 when you get drunk.
0x2C 1 active char (0-5,0xFF)
0x2D 1 x coordinate of the party
0x2E 1 y coordinate of the party
0x2F 1 number of turns since the beginning of the game
(stops counting at 0xFF)
0x30 1 ?
0x31 1 copy of 0x1E?
0x32 1 ?
Cheats
------
If you hold the Commodore key and press 1, the game will display a 10-digit
number (doesn't work in combat/dungeons).
The digits have the following meaning:
aaBBccDDee
aa karma (BCD)
BB party location (hex)
cc z coordinate/level (hex)
DD x coordinate (hex)
ee y coordinate (hex)
Sources
-------
Nytegard
http://martin.brenner.de/ultima/u5save.html
http://www.cosy.sbg.ac.at/~lendl/ultima/ultima5/
http://www.wi.leidenuniv.nl/~psimoons/ultima5t.htm
               (
geocities.com/nodling/ultima/text)                   (
geocities.com/nodling/ultima)                   (
geocities.com/nodling)