yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_rom_addresses.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROM_ADDRESSES_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROM_ADDRESSES_H
3
4#include <array> // Added for std::array
5#include <cstddef>
6#include <cstdint>
7
8namespace yaze {
9namespace zelda3 {
10
11// ============================================================================
12// Dungeon ROM Address Constants
13// ============================================================================
14// This file contains all ROM addresses for dungeon-related data in ALTTP.
15// Organized by category for readability and maintainability.
16
17// === Room Data Pointers ===
18constexpr int kRoomObjectLayoutPointer = 0x882D; // Layout pointer table
19constexpr int kRoomObjectPointer = 0x874C; // Object data pointer (Long)
20constexpr int kRoomHeaderPointer = 0xB5DD; // Room header pointer (LONG)
21constexpr int kRoomHeaderPointerBank = 0xB5E7; // Room header bank byte
22
23// === Palette Data ===
24constexpr int kDungeonsMainBgPalettePointers = 0xDEC4B; // JP Same
25constexpr int kDungeonsPalettes = 0xDD734; // Dungeon palette data
26
27// === Item & Sprite Data ===
28constexpr int kRoomItemsPointers = 0xDB69; // JP 0xDB67
29constexpr int kRoomsSpritePointer = 0x4C298; // JP Same (2-byte bank 09D62E)
30constexpr int kSpriteBlocksetPointer = 0x5B57; // Sprite graphics pointer
31
32// === Graphics Data ===
33constexpr int kGfxGroupsPointer = 0x6237; // Graphics group table
34constexpr int kTileAddress = 0x001B52; // Main tile graphics
35constexpr int kTileAddressFloor = 0x001B5A; // Floor tile graphics
36
37// === Block Data ===
38constexpr int kBlocksLength = 0x8896; // Word value
39constexpr int kBlocksPointer1 = 0x15AFA; // Block data pointer 1
40constexpr int kBlocksPointer2 = 0x15B01; // Block data pointer 2
41constexpr int kBlocksPointer3 = 0x15B08; // Block data pointer 3
42constexpr int kBlocksPointer4 = 0x15B0F; // Block data pointer 4
43
44// === Chests ===
45constexpr int kChestsLengthPointer = 0xEBF6; // Chest count pointer
46constexpr int kChestsDataPointer1 = 0xEBFB; // Chest data start
47
48// === Torches ===
49constexpr int kTorchData = 0x2736A; // JP 0x2704A
50constexpr int kTorchesLengthPointer = 0x88C1; // Torch count pointer
51
52// === Pits & Warps ===
53constexpr int kPitPointer = 0x394AB; // Pit/hole data
54constexpr int kPitCount = 0x394A6; // Number of pits
55
56// === Doors ===
57constexpr int kDoorPointers = 0xF83C0; // Door data table
58constexpr int kDoorGfxUp = 0x4D9E; // Door graphics (up)
59constexpr int kDoorGfxDown = 0x4E06; // Door graphics (down)
60constexpr int kDoorGfxCaveExitDown = 0x4E06; // Cave exit door
61constexpr int kDoorGfxLeft = 0x4E66; // Door graphics (left)
62constexpr int kDoorGfxRight = 0x4EC6; // Door graphics (right)
63constexpr int kDoorPosUp = 0x197E; // Door position (up)
64constexpr int kDoorPosDown = 0x1996; // Door position (down)
65constexpr int kDoorPosLeft = 0x19AE; // Door position (left)
66constexpr int kDoorPosRight = 0x19C6; // Door position (right)
67
68// === Sprites ===
69constexpr int kSpritesData = 0x4D8B0; // Sprite data start
70constexpr int kSpritesDataEmptyRoom = 0x4D8AE; // Empty room sprite marker
71constexpr int kSpritesEndData = 0x4EC9E; // Sprite data end
73 0x090000; // Dungeon sprite pointer table
74
75// === Messages ===
76constexpr int kMessagesIdDungeon = 0x3F61D; // Dungeon message IDs
77
78// === Custom Collision (ZScream expanded region) ===
79constexpr int kCustomCollisionRoomPointers = 0x128090; // 296 rooms × 3 bytes
80constexpr int kCustomCollisionDataPosition = 0x128450;
81constexpr int kCustomCollisionDataEnd = 0x130000;
82
83// === Water Fill Zones (Oracle of Secrets) ===
84// Reserve a tail region inside the custom collision bank for editor-authored
85// water fill zone data. This prevents collision writers from ever overwriting
86// the water table.
87//
88// NOTE: This region is intentionally small; the format is compact (room list +
89// offset lists) and should comfortably fit in a few KiB.
90constexpr int kWaterFillTableReservedSize = 0x2000; // 8 KiB
93
94// Soft end of collision data to avoid clobbering the reserved WaterFill table.
96
97// === Room Metadata ===
98constexpr int kNumberOfRooms = 296; // Total dungeon rooms (0x00-0x127)
99
100// Stair objects (special handling)
101constexpr uint16_t kStairsObjects[] = {0x139, 0x138, 0x13B, 0x12E, 0x12D};
102
103// === ROM Region Guardrail Helpers ===
104// These helpers centralize "does this ROM support feature X?" checks so the
105// UI and save pipeline enforce the same boundaries.
106
107constexpr bool HasCustomCollisionPointerTable(std::size_t rom_size) {
108 return static_cast<std::size_t>(kCustomCollisionRoomPointers) +
109 static_cast<std::size_t>(kNumberOfRooms * 3) <=
110 rom_size;
111}
112
113constexpr bool HasCustomCollisionDataRegion(std::size_t rom_size) {
114 return static_cast<std::size_t>(kCustomCollisionDataPosition) < rom_size &&
115 static_cast<std::size_t>(kCustomCollisionDataSoftEnd) <= rom_size;
116}
117
118constexpr bool HasCustomCollisionWriteSupport(std::size_t rom_size) {
119 return HasCustomCollisionPointerTable(rom_size) &&
121}
122
123constexpr bool HasWaterFillReservedRegion(std::size_t rom_size) {
124 return static_cast<std::size_t>(kWaterFillTableEnd) <= rom_size;
125}
126
127// === Layout Pointers (referenced in comments) ===
128// Layout00 ptr: 0x47EF04
129// Layout01 ptr: 0xAFEF04
130// Layout02 ptr: 0xF0EF04
131// Layout03 ptr: 0x4CF004
132// Layout04 ptr: 0xA8F004
133// Layout05 ptr: 0xECF004
134// Layout06 ptr: 0x48F104
135// Layout07 ptr: 0xA4F104
136
137// === Notes ===
138// - Layout arrays are NOT exactly the same as rooms
139// - Object array is terminated by 0xFFFF (no layers)
140// - In normal room, 0xFFFF goes to next layer (layers 0, 1, 2)
141
142// Static pointers for the 8 predefined room layouts
143static const std::array<int, 8> kRoomLayoutPointers = {
144 0x04EF47, 0x04EFAF, 0x04EFF0, 0x04F04C,
145 0x04F0A8, 0x04F0EC, 0x04F148, 0x04F1A4,
146};
147
148} // namespace zelda3
149} // namespace yaze
150
151#endif // YAZE_APP_ZELDA3_DUNGEON_ROM_ADDRESSES_H
constexpr int kBlocksPointer4
constexpr int kRoomObjectLayoutPointer
constexpr int kDoorPosUp
constexpr int kDoorPointers
constexpr int kWaterFillTableEnd
constexpr int kDoorGfxDown
constexpr int kSpritesEndData
constexpr int kTorchesLengthPointer
constexpr int kCustomCollisionDataSoftEnd
constexpr int kChestsLengthPointer
constexpr int kWaterFillTableStart
constexpr int kMessagesIdDungeon
constexpr int kDungeonsMainBgPalettePointers
constexpr int kSpriteBlocksetPointer
constexpr int kPitPointer
constexpr int kSpritesData
constexpr int kDoorPosLeft
constexpr int kTileAddress
constexpr int kWaterFillTableReservedSize
constexpr int kPitCount
constexpr int kRoomsSpritePointer
constexpr int kTileAddressFloor
constexpr int kDoorPosDown
constexpr int kChestsDataPointer1
constexpr int kBlocksLength
constexpr int kBlocksPointer1
constexpr int kCustomCollisionDataEnd
constexpr int kRoomItemsPointers
constexpr bool HasCustomCollisionPointerTable(std::size_t rom_size)
constexpr int kDoorGfxLeft
constexpr int kDoorGfxCaveExitDown
constexpr int kCustomCollisionDataPosition
constexpr uint16_t kStairsObjects[]
constexpr int kDungeonSpritePointers
constexpr bool HasWaterFillReservedRegion(std::size_t rom_size)
constexpr int kNumberOfRooms
constexpr int kDoorPosRight
constexpr int kRoomHeaderPointer
constexpr bool HasCustomCollisionDataRegion(std::size_t rom_size)
constexpr int kBlocksPointer3
constexpr int kRoomHeaderPointerBank
constexpr int kCustomCollisionRoomPointers
constexpr int kGfxGroupsPointer
constexpr int kDungeonsPalettes
constexpr int kDoorGfxUp
constexpr int kTorchData
constexpr bool HasCustomCollisionWriteSupport(std::size_t rom_size)
constexpr int kDoorGfxRight
constexpr int kSpritesDataEmptyRoom
constexpr int kBlocksPointer2
constexpr int kRoomObjectPointer