Ultima I Map Format
Format type | Map/level |
---|---|
Map type | 2D cell-based |
Layer count | 1 |
Tile size (pixels) | 16×16 |
Viewport (pixels) | 304×144 |
Cell dimensions | 168×168 |
Viewport (cells) | 19×9 |
Games |
Ultima I has a single overworld map file for all four of the game's lands. The map is 168×168 cells, which yields 2,688×2,688 pixels. The tiles are drawn using the game's tile graphics, however, they don't tie up 1-to-1 because the tile graphics file includes animations.
File Format
The map data is a string of bytes. The file uses a nibble for each cell, storing 2 cells in each byte. One row of cells requires 84 bytes, and there are 168 rows.
Data type | Name | Description |
---|---|---|
BYTE | Cells | Binary representation of 2 cells. |
Tile Data
The tile types are as follows:
Value | Tile Id | Tile Description |
---|---|---|
0 | 0 | Water |
1 | 1 | Grass |
2 | 2 | Forest |
3 | 3 | Mountain |
4 | 4 | Castle |
5 | 6 | Signpost |
6 | 7 | Town |
7 | 9 | Dungeon Entrance |
The map file does not store which specific castle, town, dungeon, or signpost is at which location.
Source Code
Map Viewer
This FreeBASIC program displays the over world map with pixels made up of appropriately colored pixels.
' Draws the over world map of Ultima I.
Dim As UByte X
Dim As UByte Y
Dim As UByte Tiles
Screen 7
Open "H:\DOS\Ultima\Map.bin" For Binary As #1
Dim As UByte Colors(0 To 7)
Colors(0) = 1 ' Water
Colors(1) = 10 ' Grass
Colors(2) = 2 ' Forest
Colors(3) = 8 ' Mountain
Colors(4) = 15 ' Castle
Colors(5) = 6 ' Signpost
Colors(6) = 13 ' Town
Colors(7) = 0 ' Dungeon Entrance
Dim As UByte HiNibble
Dim As UByte LoNibble
For Y = 0 To 167
For X = 0 To 83
Get #1, , Tiles
' The EGA file stores 4 pixels per byte. The hi nibble is the first
' color, the lo nibble is the second.
HiNibble = Tiles SHR 4
HiNibble = HiNibble And &h0F
LoNibble = Tiles AND &h0F
PSet(X * 2, Y), Colors(HiNibble)
PSet(X * 2 + 1, Y), Colors(LoNibble)
Next X
Next Y
Close #1
Sleep
Credits
This map format was reverse engineered by TheAlmightyGuru. If you find this information helpful in a project you're working on, please give credit where credit is due. (A link back to this wiki would be nice too!)