Dragon Warrior/ROM map

From Data Crystal
< Dragon Warrior
Revision as of 20:48, 3 October 2020 by Dwedit (talk | contribs) (Sprite tile definitions)
Jump to navigation Jump to search

Chip tiny.png The following article is a ROM map for Dragon Warrior.

Miscellaneous

0x00000 to 0x0000F = iNES header
0x0002A to 0x000C0 = Map metadata (See Metadata Format)

Maps

Castles

0x000C1 to 0x00188 = Charlock Castle
0x00189 to 0x00250 = Hauksness Ruins
0x00251 to 0x00412 = Tantegel Castle
0x00413 to 0x00444 = Tantegel Throne Room
0x00445 to 0x00606 = Dragonlord's Throne Room

Towns

0x00607 to 0x00726 = Kol
0x00727 to 0x008E8 = Brecconary
0x008E9 to 0x00AAA = Cantlin
0x00AAB to 0x00B72 = Garinham
0x00B73 to 0x00D34 = Rimuldar

Shrines

0x00D35 to 0x00D66 = Sunlight Shrine
0x00D67 to 0x00D98 = Rain Shrine
0x00D99 to 0x00DCA = Rainbow Shrine

Dragonlord Cavern

0x00DCB to 0x00E92 = Dragonlord Cavern B1
0x00E93 to 0x00EC4 = Dragonlord Cavern B2
0x00EC5 to 0x00EF6 = Dragonlord Cavern B3
0x00EF7 to 0x00F28 = Dragonlord Cavern B4
0x00F29 to 0x00F5A = Dragonlord Cavern B5
0x00F5B to 0x00F8C = Dragonlord Cavern B6

Other Caves

0x00F8D to 0x00FE6 = Rimuldar Passage
0x00FE7 to 0x01048 = Cave west of Tantegel B1
0x01049 to 0x010AA = Cave west of Tantegel B2
0x010AB to 0x01172 = Garin's Grave B1
0x01173 to 0x0123A = Garin's Grave B3
0x0123B to 0x0136C = Garin's Grave B4
0x0126D to 0x012C0 = Garin's Grave B2
0x012C1 to 0x012F2 = Erdrick's Cave B1
0x012F3 to 0x01324 = Erdrick's Cave B2

Music Data

0x44DB to 0x44DD = Silence, Pulse-1 & Pulse-2 
0x44DE to 0x44E2 = Silence, Triangle 
0x44E3 to 0x454D = Throne Room, Pulse-1 
0x454E to 0x45B9 = Throne Room, Triangle 
0x45BA to 0x45C3 = Courtyard, Pulse-1 
0x45C4 to 0x4639 = Courtyard, Triangle 
0x463A to 0x464F = Level-Up, Pulse-1 
0x4650 to 0x4662 = Level-Up, Pulse-2 
0x4663 to 0x468A = Gwaelin's Love, Pulse-1 
0x468B to 0x46BB = Gwaelin's Love, Pulse-2
0x46BD to 0x46DB = Gwaelin's Love, Triangle 
0x46DC to 0x46FA = Inn, Pulse-1
0x46FB to 0x4716 = Inn, Pulse-2
0x4717 to 0x471D = Battle Over, Pulse-2 
0x471E to 0x473E = Battle Over, Pulse-1 
0x473F to 0x47B1 = Town, Pulse-1 
0x47B2 to 0x4826 = Town, Triangle
0x4827 to 0x4853 = Overworld, Triangle
0x4854 to 0x489A = Overworld, Pulse-1
0x489B to 0x492C = Caverns #1-8, Pulse-1
0x492D to 0x49B8 = Cavern #1, Triangle
0x4934 to 0x49B8 = Cavern #2, Triangle
0x493B to 0x49B8 = Cavern #3, Triangle
0x4942 to 0x49B8 = Cavern #4, Triangle
0x4947 to 0x49B8 = Cavern #5, Triangle
0x494E to 0x49B8 = Cavern #6, Triangle
0x4955 to 0x49B8 = Cavern #7, Triangle
0x495C to 0x49B8 = Cavern #8, Triangle
0x49B9 to 0x4ADE = Battle Theme, Pulse-1 
0x49CF to 0x4ADE = Battle Theme (sans intro), Pulse-1
0x4ADF to 0x4B71 = Battle Theme, Triangle
0x4AF1 to 0x4B71 = Battle Theme (sans intro), Triangle 
0x4B72 to 0x4BF5 = Final Battle, Pulse-1 
0x4BF6 to 0x4C29 = Final Battle, Pulse-2
0x4C2A to 0x4C4D = Final Battle, Triangle 
0x4C4E to 0x4CA9 = Silver Harp, Pulse-2
0x4C4F to 0x4CA9 = Silver Harp, Pulse-2
0x4CAA to 0x4CF0 = Fairy Flute, Triangle 
0x4CF1 to 0x4D32 = Rainbow Drop, Pulse-2
0x4CF2 to 0x4D32 = Rainbow Drop, Pulse-1
0x4D33 to 0x4D59 = "Thou Art Dead", Pulse-2
0x4D34 to 0x4D59 = "Thou Art Dead", Pulse-1
0x4D5A to 0x4D7C = Cursed!, Pulse-2
0x4D5B to 0x4D7C = Cursed!, Pulse-1
0x4D7D to 0x4E4C = Title Theme, Pulse-1
0x4E4D to 0x4F15 = Title Theme, Pulse-2
0x4F16 to 0x4F71 = Title Theme, Triangle
0x4F72 to 0x50C1 = Ending Theme, Pulse-1
0x50C2 to 0x523D = Ending Theme, Pulse-2
0x523E to 0x5363 = Ending Theme, Triangle

Text

0x03DDC to 0x03FD9 = Title Screen data (See Title Screen / End Credits Data Format)
0x0549D to 0x0595E = End Credits
0x05DDD to 0x05E58 = Chest data (See Chest Data Format)
0x06842 = Spell list pointer
0x06844 = Item list part 1, line 1 pointer
0x06846 = Item list part 1, line 2 pointer
0x06848 = Item list part 2, line 1 pointer
0x0684A = Item list part 2, line 2 pointer
0x0684C = Price list pointer
0x0684E = Monster list, line 1 pointer
0x06850 = Monster list, line 2 pointer
0x06F7C to 0x06FBF = Menu pointers
0x06FC0 to 0x0752C = Menu text (See Menu Format)
0x07AC7 to 0x07B9E = Item list part 1, line 1 text
0x07B9F to 0x07BC6 = Item list part 2, line 1 text
0x07BC7 to 0x07C5E = Item list part 1, line 2 text
0x07C5F to 0x07C7F = Item list part 2, line 2 text
0x07C80 to 0x07DB1 = Monster list, line 1 text
0x07DB2 to 0x07E1D = Monster list, line 2 text
0x07E1E to 0x07E65 = Price list values (2 byte little endian)
0x07E66 to 0x07EAE = Spell list text
0x08012 to 0x08037 = Dialogue pointers
0x08038 to 0x0BCBF = Dialogue text

Other

0x01C9F to 0x01D62 = Graphic layout data for the overworld fight background
0x01D63 to 0x01D6C = MP Requirements for the ten Magic Spells
0x01D6D to 0x02662 = Overworld map (RLE encoded by nibbles, 1st nibble is tile, 2nd how many - 1)
Note for template.png
Note:
The overworld map uses a strange system of pointers/auto-adjusts for offsetting the land from the start of the row. It can't be viewed simply by working out the RLE runs.
0x031BE to 0x031DB = Music Pointers (See Song Bytes)
0x0F3D8 to 0x0F471 = Warp data (Stairs Down)
0x0F472 to 0x0F50B = Warp data (Stairs Up)
0x10010 to 0x1400F = Game graphics
Note for template.png
Note:
Much of the first CHR bank (0x10010 to 0x1056F, used for the title screen, final battle, and end credits) stores 2 different overlapping 1bpp graphics; palette changes make either one set of graphics or the other visible at a time.


Graphics

Tile definitions for Townspeople/Hero Sprites: 0x1344

For the four tiles that make up the sprite (Top-left, Top-right, Bottom-left, Bottom-right), contains tile number byte, tile attributes byte (palette number 0x00-0x03, horizontal flip +0x40) for 8 bytes total.

To calculate the sprite number, add these bits:

  • Direction: 0x00 Facing Up, 0x20 Facing Right, 0x40 Facing Down, 0x60 Facing Left
  • Animation Frame: 0x00 or 0x01
  • Character:
    • 0x00 = Man
    • 0x02 = Adventurer
    • 0x04 = Guard
    • 0x06 = Merchant
    • 0x08 = King Lorik (always facing Down)
    • 0x0A = Old Man
    • 0x0C = Woman
    • 0x0D = Ending Guard with Trumpet (always facing Right)
    • 0x10 = Hero (No equipment)
    • 0x12 = Hero (Sword only)
    • 0x14 = Hero (Shield only)
    • 0x16 = Hero (Sword + Shield)
    • 0x18 = Hero (Carrying Gwaelin)
    • 0x1A = Princess Gwaelin
    • 0x1C = Dragonlord
    • 0x1E = Ending Guard with Trumpet (always facing Left)

Multiply sprite number by 8 and add to base address 0x1344.

For example, Tile Definitions for "Hero (Sword + Shield) facing Down" = 0x1344 + 8 * (0x16 + 0x40) = 0x15F4

Gwaelin and Dragonlord normally do not face left, so they have glitched data in there.

Data Formats

Metadata Format

Metadata entries are 5 bytes long:

01 = Pointer to map data
02 = Pointer to map data
03 = X size
04 = Y size
05 = Border tile

Song Bytes

Song bytes are in the same order as maps. (Byte 1 plays for map 1, byte 2 plays for map 2, etc.)

00 = Nothing
01 = Title Fanfare
02 = Throne Room
03 = Castle
04 = Town
05 = Overworld
06 = Cave 1
07 = Cave 2
08 = Cave 3
09 = Cave 4
0A = Cave 5
0B = Cave 6
0C = Cave 7
0D = Cave 8
0E = Battle
0F = Dragonlord
10 = End Theme
11 = Silver Harp
12 = Fairy Flute
13 = Rainbow Drop
14 = Death
15 = Inn Rest
16 = Princess Gwaelin
17 = Curse
18 = Battle (without intro)
19 = Victory
1A = Level Up

Title Screen / End Credits Data Format

String format is 2 byte PPU address followed by the bytes to write to that address, terminated by $FC. Both the title screen and the end credits use a slightly different table from the rest of the game with:

60=!
61=.
62=©
63=-
FC=[end of string]
/FD=[end of screen]

Control code F7 takes 2 byte parameters (let's call them A and B) and means "repeat byte B A times" so e.g. F7 08 05 results in writing 05 05 05 05 05 05 05 05 to the PPU.


Chest Data Format

Chest data entries are 5 bytes long:

01 = Map number
02 = X coordinate
03 = Y coordinate
04 = Chest contents

Menu Format

Menu string format is menu setup parameters + menu text, where the menu setup parameters are:

  • 1 byte menu type: bit 7 controls whether the menu has a cursor (1) or not (0), bit 5 controls line spacing (1 = single spacing, 0 = double spacing); the game code also checks bit 6 which then requires 1 extra setup parameter when set, but no menu ever sets bit 6
  • 1 byte menu height: total height is this number of tiles x 2
  • 1 byte menu width: number of tiles x 1
  • 1 byte menu screen position: high nybble sets vertical position x 2, low nybble sets horizontal position x 2

If the menu has a cursor, then an additional two parameters are present:

  • 1 byte horizontal offset of second column cursor position relative to left edge of menu
  • 1 byte initial cursor position relative to top left menu corner; high nybble sets vertical position x 1, low nybble sets horizontal position x 1

The menu text uses a slightly different table from the rest of the game with (highlight to see trailing spaces):

80=[newline]
81= 
82=  
83=   
84=    
85=     
86=      
87=       

and lots of other control codes for each of the different data to display.

Note for template.png
Note:
There is no dedicated end token for menu text; the game keeps printing data until the menu space (width x height as modified by line spacing) has been completely filled!