yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
room.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_H
3
4#include <yaze.h>
5
6#include <cstdint>
7#include <memory>
8#include <string_view>
9#include <tuple>
10#include <utility>
11#include <vector>
12
13#include "absl/types/span.h"
14
16#include "rom/rom.h"
24#include "zelda3/game_data.h"
26
27namespace yaze {
28namespace zelda3 {
29
30class DungeonState;
31class RoomLayerManager;
32
33// ROM addresses defined in dungeon_rom_addresses.h (use kPrefixed names)
34
36 uint8_t ID;
37 std::string Name;
41 LayerMergeType() = default;
42 LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans) {
43 ID = id;
44 Name = name;
45 Layer2OnTop = top;
46 Layer2Translucent = trans;
47 Layer2Visible = see;
48 }
49};
50
51// LayerMergeType(id, name, Layer2Visible, Layer2OnTop, Layer2Translucent)
52//
53// SNES Mode 1 Layer Priority: BG1 is ALWAYS rendered on top of BG2 by default.
54// The flags control COLOR MATH effects, not Z-order:
55// - Layer2Visible: Whether BG2 is enabled on main screen
56// - Layer2OnTop: Whether BG2 participates in sub-screen color math effects
57// (transparency, additive blending) - does NOT change draw order
58// - Layer2Translucent: Whether color math creates transparency effect
59const static LayerMergeType LayerMerge00{0x00, "Off", true, false, false};
60const static LayerMergeType LayerMerge01{0x01, "Parallax", true, false, false};
61const static LayerMergeType LayerMerge02{0x02, "Dark", true, true, true};
62const static LayerMergeType LayerMerge03{0x03, "On top", false, true, false};
63const static LayerMergeType LayerMerge04{0x04, "Translucent", true, true, true};
64const static LayerMergeType LayerMerge05{0x05, "Addition", true, true, true};
65const static LayerMergeType LayerMerge06{0x06, "Normal", true, false, false};
66const static LayerMergeType LayerMerge07{0x07, "Transparent", true, true, true};
67const static LayerMergeType LayerMerge08{0x08, "Dark room", true, true, true};
68
69const static LayerMergeType kLayerMergeTypeList[] = {
70 LayerMerge00, LayerMerge01, LayerMerge02, LayerMerge03, LayerMerge04,
71 LayerMerge05, LayerMerge06, LayerMerge07, LayerMerge08};
72
80
91
92// Pot item - items hidden under pots, rocks, skulls etc.
93// Each item has its own position from ROM data
94struct PotItem {
95 uint16_t position = 0; // Raw position word from ROM
96 uint8_t item = 0; // Item type (0 = nothing)
97
98 // Decode pixel coordinates from position word
99 // Format: high byte * 16 = Y, low byte * 4 = X
100 int GetPixelX() const { return (position & 0xFF) * 4; }
101 int GetPixelY() const { return ((position >> 8) & 0xFF) * 16; }
102
103 // Get tile coordinates (8-pixel tiles)
104 int GetTileX() const { return GetPixelX() / 8; }
105 int GetTileY() const { return GetPixelY() / 8; }
106};
107
108enum TagKey {
174
175// Editor-authored water fill zones (Oracle of Secrets).
176// Stored as a 64x64 boolean map (0/1 per 8x8 tile). At runtime, the hack
177// consumes a compact offset list derived from these tiles.
179 std::array<uint8_t, 64 * 64> tiles{};
180 bool has_data = false;
181 uint8_t sram_bit_mask = 0; // Bit in $7EF411 (e.g. 0x01)
182};
183
184class Room {
185 public:
187 Room(int room_id, Rom* rom, GameData* game_data = nullptr);
189
190 // Move-only type due to unique_ptr
193 Room(const Room&) = delete;
194 Room& operator=(const Room&) = delete;
195
196 void LoadRoomGraphics(uint8_t entrance_blockset = 0xFF);
198 // LoadGraphicsSheetsIntoArena() removed - per-room graphics instead
199 void RenderRoomGraphics();
202 void LoadObjects();
203 void LoadSprites();
204 void LoadChests();
205 void LoadPotItems();
206 void LoadDoors();
207 void LoadTorches();
208 void LoadBlocks();
209 void LoadPits();
211 void ReloadGraphics(uint8_t entrance_blockset = 0xFF);
212
213 // Public getters and manipulators for sprites
214 const std::vector<zelda3::Sprite>& GetSprites() const { return sprites_; }
215 std::vector<zelda3::Sprite>& GetSprites() { return sprites_; }
216
217 // Public getters and manipulators for chests
218 const std::vector<chest_data>& GetChests() const { return chests_in_room_; }
219 std::vector<chest_data>& GetChests() { return chests_in_room_; }
220
221 // Public getters and manipulators for stairs
222 const std::vector<staircase>& GetStairs() const { return z3_staircases_; }
223 std::vector<staircase>& GetStairs() { return z3_staircases_; }
224
231 struct Door {
232 uint8_t position;
235
236 uint8_t byte1;
237 uint8_t byte2;
238
240 std::pair<int, int> GetTileCoords() const {
242 }
243
245 std::pair<int, int> GetPixelCoords() const {
247 }
248
253
255 std::tuple<int, int, int, int> GetBounds() const {
257 }
258
260 std::string_view GetTypeName() const {
262 }
263
265 std::string_view GetDirectionName() const {
267 }
268
270 std::pair<uint8_t, uint8_t> EncodeBytes() const {
272 }
273
278 static Door FromRomBytes(uint8_t b1, uint8_t b2) {
279 Door door;
280 door.byte1 = b1;
281 door.byte2 = b2;
282 // Position index is in bits 4-7 of b1
283 // ASM does: (b1 & 0xF0) >> 3 which gives index * 2 for table lookup
284 // We store the raw index (0-15, typically 0-5)
285 door.position = (b1 >> 4) & 0x0F;
286 // Direction is in bits 0-1 of b1
287 door.direction = DoorDirectionFromRaw(b1 & 0x03);
288 // Door type is the full second byte
289 door.type = DoorTypeFromRaw(b2);
290 return door;
291 }
292 };
293
294 const std::vector<Door>& GetDoors() const { return doors_; }
295 std::vector<Door>& GetDoors() { return doors_; }
296 void AddDoor(const Door& door) {
297 doors_.push_back(door);
299 }
300 void RemoveDoor(size_t index) {
301 if (index < doors_.size()) {
302 doors_.erase(doors_.begin() + index);
304 }
305 }
306
307 // Public getters for pot items (items hidden under pots/bushes)
308 const std::vector<PotItem>& GetPotItems() const { return pot_items_; }
309 std::vector<PotItem>& GetPotItems() { return pot_items_; }
310
311 const RoomLayout& GetLayout() const { return layout_; }
312
313 // Public getters and manipulators for tile objects
314 const std::vector<RoomObject>& GetTileObjects() const {
315 return tile_objects_;
316 }
317 std::vector<RoomObject>& GetTileObjects() { return tile_objects_; }
318
319 // Methods for modifying tile objects
320 void ClearTileObjects() { tile_objects_.clear(); }
321 void AddTileObject(const RoomObject& object) {
322 tile_objects_.push_back(object);
324 }
325
326 // Enhanced object manipulation (Phase 3)
327 absl::Status AddObject(const RoomObject& object);
328 absl::Status RemoveObject(size_t index);
329 absl::Status UpdateObject(size_t index, const RoomObject& object);
330 absl::StatusOr<size_t> FindObjectAt(int x, int y, int layer) const;
331 bool ValidateObject(const RoomObject& object) const;
332
333 // Performance optimization: Mark objects as dirty when modified
335 dirty_state_.objects = true;
336 dirty_state_.textures = true;
337 dirty_state_.composite = true;
338 }
340 dirty_state_.graphics = true;
341 dirty_state_.textures = true;
342 dirty_state_.composite = true;
343 }
345 dirty_state_.layout = true;
346 dirty_state_.textures = true;
347 dirty_state_.composite = true;
348 }
349 void RemoveTileObject(size_t index) {
350 if (index < tile_objects_.size()) {
351 tile_objects_.erase(tile_objects_.begin() + index);
353 }
354 }
355 size_t GetTileObjectCount() const { return tile_objects_.size(); }
356 RoomObject& GetTileObject(size_t index) { return tile_objects_[index]; }
357 const RoomObject& GetTileObject(size_t index) const {
358 return tile_objects_[index];
359 }
360
361 // =========================================================================
362 // Object Limit Tracking (ZScream Feature Parity)
363 // =========================================================================
364
371 std::map<DungeonLimit, int> GetLimitedObjectCounts() const;
372
376 bool HasExceededLimits() const;
377
381 std::vector<DungeonLimitInfo> GetExceededLimitDetails() const;
382
383 // Custom Collision access
388 if (custom_collision_.has_data != has) {
391 }
392 }
393
394 uint8_t GetCollisionTile(int x, int y) const {
395 if (x < 0 || x >= 64 || y < 0 || y >= 64) return 0;
396 return custom_collision_.tiles[y * 64 + x];
397 }
398
399 void SetCollisionTile(int x, int y, uint8_t tile) {
400 if (x < 0 || x >= 64 || y < 0 || y >= 64) return;
401 custom_collision_.tiles[y * 64 + x] = tile;
404 }
405
409
410 // Water fill zones (Oracle of Secrets)
414
415 bool GetWaterFillTile(int x, int y) const {
416 if (x < 0 || x >= 64 || y < 0 || y >= 64) return false;
417 return water_fill_zone_.tiles[y * 64 + x] != 0;
418 }
419
420 void SetWaterFillTile(int x, int y, bool filled) {
421 if (x < 0 || x >= 64 || y < 0 || y >= 64) return;
422 const uint8_t val = filled ? 1 : 0;
423 const size_t idx = static_cast<size_t>(y * 64 + x);
424 const uint8_t prev = water_fill_zone_.tiles[idx];
425 if (prev == val) return;
426 water_fill_zone_.tiles[idx] = val;
427 if (val) {
430 } else {
431 if (water_fill_tile_count_ > 0) {
433 }
434 if (water_fill_tile_count_ == 0) {
436 }
437 }
438 water_fill_dirty_ = true;
439 }
440
448
449 int WaterFillTileCount() const {
451 }
452
454 void set_water_fill_sram_bit_mask(uint8_t mask) {
455 if (water_fill_zone_.sram_bit_mask != mask) {
457 water_fill_dirty_ = true;
458 }
459 }
460
461 bool water_fill_dirty() const { return water_fill_dirty_; }
464
465 // For undo/redo functionality
466 void SetTileObjects(const std::vector<RoomObject>& objects) {
467 tile_objects_ = objects;
469 }
470
471 // Public setters for LoadRoomFromRom function
474 void SetIsLight(bool is_light) { is_light_ = is_light; }
475 void SetPalette(uint8_t pal) {
476 if (palette_ != pal) {
477 palette_ = pal;
479 }
480 }
481 void SetBlockset(uint8_t bs) {
482 if (blockset_ != bs) {
483 blockset_ = bs;
485 }
486 }
487 void SetSpriteset(uint8_t ss) {
488 if (spriteset_ != ss) {
489 spriteset_ = ss;
491 }
492 }
494 if (effect_ != effect) {
495 effect_ = effect;
497 }
498 }
500 if (tag1_ != tag1) {
501 tag1_ = tag1;
503 }
504 }
506 if (tag2_ != tag2) {
507 tag2_ = tag2;
509 }
510 }
511 void SetStaircasePlane(int index, uint8_t plane) {
512 if (index >= 0 && index < 4)
513 staircase_plane_[index] = plane;
514 }
515 void SetHolewarp(uint8_t hw) { holewarp_ = hw; }
516 void SetStaircaseRoom(int index, uint8_t room) {
517 if (index >= 0 && index < 4)
518 staircase_rooms_[index] = room;
519 }
520 // SetFloor1/SetFloor2 removed - use set_floor1()/set_floor2() instead
521 // (defined above)
522 void SetMessageId(uint16_t mid) { message_id_ = mid; }
523
524 // Getters for LoadRoomFromRom function
525 bool IsLight() const { return is_light_; }
526
527 // Additional setters for LoadRoomFromRom function
528 void SetMessageIdDirect(uint16_t mid) { message_id_ = mid; }
529 void SetLayer2Mode(uint8_t mode) { layer2_mode_ = mode; }
530 void SetLayerMerging(LayerMergeType merging) { layer_merging_ = merging; }
531 void SetIsDark(bool is_dark) { is_dark_ = is_dark; }
532 void SetBackgroundTileset(uint8_t tileset) { background_tileset_ = tileset; }
533 void SetSpriteTileset(uint8_t tileset) { sprite_tileset_ = tileset; }
534 void SetLayer2Behavior(uint8_t behavior) { layer2_behavior_ = behavior; }
537 void SetPitsTargetLayer(uint8_t layer) { pits_.target_layer = layer; }
538 void SetStair1TargetLayer(uint8_t layer) { stair1_.target_layer = layer; }
539 void SetStair2TargetLayer(uint8_t layer) { stair2_.target_layer = layer; }
540 void SetStair3TargetLayer(uint8_t layer) { stair3_.target_layer = layer; }
541 void SetStair4TargetLayer(uint8_t layer) { stair4_.target_layer = layer; }
542 void SetPitsTarget(uint8_t target) { pits_.target = target; }
543 void SetStair1Target(uint8_t target) { stair1_.target = target; }
544 void SetStair2Target(uint8_t target) { stair2_.target = target; }
545 void SetStair3Target(uint8_t target) { stair3_.target = target; }
546 void SetStair4Target(uint8_t target) { stair4_.target = target; }
547
548 // Loaded state
549 bool IsLoaded() const { return is_loaded_; }
550 void SetLoaded(bool loaded) { is_loaded_ = loaded; }
551
552 // Read-only accessors for metadata
553 background2 bg2() const { return bg2_; }
554 EffectKey effect() const { return effect_; }
555 TagKey tag1() const { return tag1_; }
556 TagKey tag2() const { return tag2_; }
558 const LayerMergeType& layer_merging() const { return layer_merging_; }
559 uint8_t staircase_plane(int index) const {
560 return (index >= 0 && index < 4) ? staircase_plane_[index] : 0;
561 }
562 uint8_t staircase_room(int index) const {
563 return (index >= 0 && index < 4) ? staircase_rooms_[index] : 0;
564 }
565
566 int id() const { return room_id_; }
567
568 // Room header property accessors
569 uint8_t blockset() const { return blockset_; }
570 uint8_t spriteset() const { return spriteset_; }
571 uint8_t palette() const { return palette_; }
572 uint8_t layout_id() const { return layout_id_; }
573 uint8_t holewarp() const { return holewarp_; }
574 uint16_t message_id() const { return message_id_; }
575
576 // Layout ID setter (marks dirty)
577 void SetLayoutId(uint8_t id) {
578 if (layout_id_ != id) {
579 layout_id_ = id;
581 }
582 }
583
584 // Floor graphics accessors
585 uint8_t floor1() const { return floor1_graphics_; }
586 uint8_t floor2() const { return floor2_graphics_; }
587 void set_floor1(uint8_t value) {
588 if (floor1_graphics_ != value) {
589 floor1_graphics_ = value;
591 }
592 }
593 void set_floor2(uint8_t value) {
594 if (floor2_graphics_ != value) {
595 floor2_graphics_ = value;
597 }
598 }
599 // Enhanced object parsing methods
600 void ParseObjectsFromLocation(int objects_location);
601 void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY,
602 int& nbr_of_staircase);
603
604 // Object saving (Phase 1, Task 1.3)
605 absl::Status SaveObjects();
606 std::vector<uint8_t> EncodeObjects() const;
607 absl::Status SaveSprites();
608 std::vector<uint8_t> EncodeSprites() const;
609 absl::Status SaveRoomHeader();
610
611 auto blocks() const { return blocks_; }
612 auto& mutable_blocks() { return blocks_; }
613 auto rom() const { return rom_; }
614 auto rom() { return rom_; }
615 auto mutable_rom() { return rom_; }
616 void SetRom(Rom* rom) { rom_ = rom; }
617 auto game_data() { return game_data_; }
618 void SetGameData(GameData* data) { game_data_ = data; }
619
620 // Helper to get version constants from game_data or default to US
622 return kVersionConstantsMap.at(game_data_ ? game_data_->version
623 : zelda3_version::US);
624 }
625 const std::array<uint8_t, 0x10000>& get_gfx_buffer() const {
626 return current_gfx16_;
627 }
628
629 // Per-room background buffers (not shared via arena!)
630 auto& bg1_buffer() { return bg1_buffer_; }
631 auto& bg2_buffer() { return bg2_buffer_; }
632 const auto& bg1_buffer() const { return bg1_buffer_; }
633 const auto& bg2_buffer() const { return bg2_buffer_; }
635 const auto& object_bg1_buffer() const { return object_bg1_buffer_; }
637 const auto& object_bg2_buffer() const { return object_bg2_buffer_; }
638
642
645 bool IsCompositeDirty() const { return dirty_state_.composite; }
646
648
649 private:
652
653 std::array<uint8_t, 0x10000> current_gfx16_;
654
655 // Each room has its OWN background buffers and bitmaps
656 // Each room has its OWN background buffers and bitmaps
661
662 struct DirtyState {
663 bool graphics = true;
664 bool objects = true;
665 bool layout = true;
666 bool textures = true;
667 bool composite = true;
668 };
669
670 // Composite bitmap for merged layer output
673
675 bool is_loaded_ = false;
677 bool is_floor_ = true;
678
679 // Performance optimization: Cache room properties to avoid unnecessary
680 // re-renders
681 uint8_t cached_blockset_ = 0xFF;
682 uint8_t cached_spriteset_ = 0xFF;
683 uint8_t cached_palette_ = 0xFF;
684 uint8_t cached_layout_ = 0xFF;
687 uint8_t cached_effect_ = 0xFF;
690
691 int room_id_ = 0;
693
696
697 // Room header properties (formerly public)
698 uint8_t blockset_ = 0;
699 uint8_t spriteset_ = 0;
700 uint8_t palette_ = 0;
701 uint8_t layout_id_ = 0;
702 uint8_t holewarp_ = 0;
703 uint16_t message_id_ = 0;
704
711
712 std::array<uint8_t, 16> blocks_;
713 std::array<chest, 16> chest_list_;
714
715 std::vector<RoomObject> tile_objects_;
716 // TODO: add separate door objects list when door section (F0 FF) is parsed
717 std::vector<zelda3::Sprite> sprites_;
718 std::vector<staircase> z3_staircases_;
719 std::vector<chest_data> chests_in_room_;
720 std::vector<Door> doors_;
721 std::vector<PotItem> pot_items_;
723
729
736
739
741 bool water_fill_dirty_ = false;
743 std::unique_ptr<DungeonState> dungeon_state_;
744};
745
746// Loads a room from the ROM.
747Room LoadRoomFromRom(Rom* rom, int room_id);
748
749// Loads only the room header (metadata) from the ROM.
750Room LoadRoomHeaderFromRom(Rom* rom, int room_id);
751
752struct RoomSize {
754 int64_t room_size;
755};
756
757// Calculates the size of a room in the ROM.
758RoomSize CalculateRoomSize(Rom* rom, int room_id);
759
760// Dungeon-level save: aggregate torches from all rooms and write to ROM.
761absl::Status SaveAllTorches(Rom* rom, absl::Span<const Room> rooms);
762
763// Preserve pit count, pointer, and data (read from ROM, write back). No edit support yet.
764absl::Status SaveAllPits(Rom* rom);
765
766// Preserve blocks length and the four block regions (read from ROM, write back). No edit support yet.
767absl::Status SaveAllBlocks(Rom* rom);
768
769// Save custom collision maps for any rooms marked dirty.
770//
771// This writes into the ZScream expanded collision region and updates the room
772// pointer table. Rooms not loaded (or not dirty) are preserved.
773absl::Status SaveAllCollision(Rom* rom, absl::Span<Room> rooms);
774
775// Scan all room sprite pointers and return the highest used PC address end.
777
778// Relocate a room's sprite payload into free tail space and update its pointer.
779absl::Status RelocateSpriteData(Rom* rom, int room_id,
780 const std::vector<uint8_t>& encoded_bytes);
781
782// Aggregate chests from all rooms and write to ROM. Preserves ROM data for rooms not loaded.
783absl::Status SaveAllChests(Rom* rom, absl::Span<const Room> rooms);
784
785// Save pot items for all rooms. Preserves ROM data for rooms not loaded.
786absl::Status SaveAllPotItems(Rom* rom, absl::Span<const Room> rooms);
787
788// RoomEffect names defined in room.cc to avoid static initialization order issues
789extern const std::string RoomEffect[8];
790
791constexpr std::array<std::string_view, 297> kRoomNames = {
792 "Ganon",
793 "Hyrule Castle (North Corridor)",
794 "Behind Sanctuary (Switch)",
795 "Houlihan",
796 "Turtle Rock (Crysta-Roller)",
797 "Empty",
798 "Swamp Palace (Arrghus[Boss])",
799 "Tower of Hera (Moldorm[Boss])",
800 "Cave (Healing Fairy)",
801 "Palace of Darkness",
802 "Palace of Darkness (Stalfos Trap)",
803 "Palace of Darkness (Turtle)",
804 "Ganon's Tower (Entrance)",
805 "Ganon's Tower (Agahnim2[Boss])",
806 "Ice Palace (Entrance )",
807 "Empty Clone ",
808 "Ganon Evacuation Route",
809 "Hyrule Castle (Bombable Stock )",
810 "Sanctuary",
811 "Turtle Rock (Hokku-Bokku Key 2)",
812 "Turtle Rock (Big Key )",
813 "Turtle Rock",
814 "Swamp Palace (Swimming Treadmill)",
815 "Tower of Hera (Moldorm Fall )",
816 "Cave",
817 "Palace of Darkness (Dark Maze)",
818 "Palace of Darkness (Big Chest )",
819 "Palace of Darkness (Mimics / Moving Wall )",
820 "Ganon's Tower (Ice Armos)",
821 "Ganon's Tower (Final Hallway)",
822 "Ice Palace (Bomb Floor / Bari )",
823 "Ice Palace (Pengator / Big Key )",
824 "Agahnim's Tower (Agahnim[Boss])",
825 "Hyrule Castle (Key-rat )",
826 "Hyrule Castle (Sewer Text Trigger )",
827 "Turtle Rock (West Exit to Balcony)",
828 "Turtle Rock (Double Hokku-Bokku / Big chest )",
829 "Empty Clone ",
830 "Swamp Palace (Statue )",
831 "Tower of Hera (Big Chest)",
832 "Swamp Palace (Entrance )",
833 "Skull Woods (Mothula[Boss])",
834 "Palace of Darkness (Big Hub )",
835 "Palace of Darkness (Map Chest / Fairy )",
836 "Cave",
837 "Empty Clone ",
838 "Ice Palace (Compass )",
839 "Cave (Kakariko Well HP)",
840 "Agahnim's Tower (Maiden Sacrifice Chamber)",
841 "Tower of Hera (Hardhat Beetles )",
842 "Hyrule Castle (Sewer Key Chest )",
843 "Desert Palace (Lanmolas[Boss])",
844 "Swamp Palace (Push Block Puzzle / Pre-Big Key )",
845 "Swamp Palace (Big Key / BS )",
846 "Swamp Palace (Big Chest )",
847 "Swamp Palace (Map Chest / Water Fill )",
848 "Swamp Palace (Key Pot )",
849 "Skull Woods (Gibdo Key / Mothula Hole )",
850 "Palace of Darkness (Bombable Floor )",
851 "Palace of Darkness (Spike Block / Conveyor )",
852 "Cave",
853 "Ganon's Tower (Torch 2)",
854 "Ice Palace (Stalfos Knights / Conveyor Hellway)",
855 "Ice Palace (Map Chest )",
856 "Agahnim's Tower (Final Bridge )",
857 "Hyrule Castle (First Dark )",
858 "Hyrule Castle (6 Ropes )",
859 "Desert Palace (Torch Puzzle / Moving Wall )",
860 "Thieves Town (Big Chest )",
861 "Thieves Town (Jail Cells )",
862 "Swamp Palace (Compass Chest )",
863 "Empty Clone ",
864 "Empty Clone ",
865 "Skull Woods (Gibdo Torch Puzzle )",
866 "Palace of Darkness (Entrance )",
867 "Palace of Darkness (Warps / South Mimics )",
868 "Ganon's Tower (Mini-Helmasaur Conveyor )",
869 "Ganon's Tower (Moldorm )",
870 "Ice Palace (Bomb-Jump )",
871 "Ice Palace Clone (Fairy )",
872 "Hyrule Castle (West Corridor)",
873 "Hyrule Castle (Throne )",
874 "Hyrule Castle (East Corridor)",
875 "Desert Palace (Popos 2 / Beamos Hellway )",
876 "Swamp Palace (Upstairs Pits )",
877 "Castle Secret Entrance / Uncle Death ",
878 "Skull Woods (Key Pot / Trap )",
879 "Skull Woods (Big Key )",
880 "Skull Woods (Big Chest )",
881 "Skull Woods (Final Section Entrance )",
882 "Palace of Darkness (Helmasaur King[Boss])",
883 "Ganon's Tower (Spike Pit )",
884 "Ganon's Tower (Ganon-Ball Z)",
885 "Ganon's Tower (Gauntlet 1/2/3)",
886 "Ice Palace (Lonely Firebar)",
887 "Ice Palace (Hidden Chest / Spike Floor )",
888 "Hyrule Castle (West Entrance )",
889 "Hyrule Castle (Main Entrance )",
890 "Hyrule Castle (East Entrance )",
891 "Desert Palace (Final Section Entrance )",
892 "Thieves Town (West Attic )",
893 "Thieves Town (East Attic )",
894 "Swamp Palace (Hidden Chest / Hidden Door )",
895 "Skull Woods (Compass Chest )",
896 "Skull Woods (Key Chest / Trap )",
897 "Empty Clone ",
898 "Palace of Darkness (Rupee )",
899 "Ganon's Tower (Mimics s)",
900 "Ganon's Tower (Lanmolas )",
901 "Ganon's Tower (Gauntlet 4/5)",
902 "Ice Palace (Pengators )",
903 "Empty Clone ",
904 "Hyrule Castle (Small Corridor to Jail Cells)",
905 "Hyrule Castle (Boomerang Chest )",
906 "Hyrule Castle (Map Chest )",
907 "Desert Palace (Big Chest )",
908 "Desert Palace (Map Chest )",
909 "Desert Palace (Big Key Chest )",
910 "Swamp Palace (Water Drain )",
911 "Tower of Hera (Entrance )",
912 "Empty Clone ",
913 "Empty Clone ",
914 "Empty Clone ",
915 "Ganon's Tower",
916 "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall )",
917 "Ganon's Tower (Winder / Warp Maze )",
918 "Ice Palace (Hidden Chest / Bombable Floor )",
919 "Ice Palace ( Big Spike Traps )",
920 "Hyrule Castle (Jail Cell )",
921 "Hyrule Castle",
922 "Hyrule Castle (Basement Chasm )",
923 "Desert Palace (West Entrance )",
924 "Desert Palace (Main Entrance )",
925 "Desert Palace (East Entrance )",
926 "Empty Clone ",
927 "Tower of Hera (Tile )",
928 "Empty Clone ",
929 "Eastern Palace (Fairy )",
930 "Empty Clone ",
931 "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest )",
932 "Ganon's Tower (East and West Downstairs / Big Chest )",
933 "Ganon's Tower (Tile / Torch Puzzle )",
934 "Ice Palace",
935 "Empty Clone ",
936 "Misery Mire (Vitreous[Boss])",
937 "Misery Mire (Final Switch )",
938 "Misery Mire (Dark Bomb Wall / Switches )",
939 "Misery Mire (Dark Cane Floor Switch Puzzle )",
940 "Empty Clone ",
941 "Ganon's Tower (Final Collapsing Bridge )",
942 "Ganon's Tower (Torches 1 )",
943 "Misery Mire (Torch Puzzle / Moving Wall )",
944 "Misery Mire (Entrance )",
945 "Eastern Palace (Eyegore Key )",
946 "Empty Clone ",
947 "Ganon's Tower (Many Spikes / Warp Maze )",
948 "Ganon's Tower (Invisible Floor Maze )",
949 "Ganon's Tower (Compass Chest / Invisible Floor )",
950 "Ice Palace (Big Chest )",
951 "Ice Palace",
952 "Misery Mire (Pre-Vitreous )",
953 "Misery Mire (Fish )",
954 "Misery Mire (Bridge Key Chest )",
955 "Misery Mire",
956 "Turtle Rock (Trinexx[Boss])",
957 "Ganon's Tower (Wizzrobes s)",
958 "Ganon's Tower (Moldorm Fall )",
959 "Tower of Hera (Fairy )",
960 "Eastern Palace (Stalfos Spawn )",
961 "Eastern Palace (Big Chest )",
962 "Eastern Palace (Map Chest )",
963 "Thieves Town (Moving Spikes / Key Pot )",
964 "Thieves Town (Blind The Thief[Boss])",
965 "Empty Clone ",
966 "Ice Palace",
967 "Ice Palace (Ice Bridge )",
968 "Agahnim's Tower (Circle of Pots)",
969 "Misery Mire (Hourglass )",
970 "Misery Mire (Slug )",
971 "Misery Mire (Spike Key Chest )",
972 "Turtle Rock (Pre-Trinexx )",
973 "Turtle Rock (Dark Maze)",
974 "Turtle Rock (Chain Chomps )",
975 "Turtle Rock (Map Chest / Key Chest / Roller )",
976 "Eastern Palace (Big Key )",
977 "Eastern Palace (Lobby Cannonballs )",
978 "Eastern Palace (Dark Antifairy / Key Pot )",
979 "Thieves Town (Hellway)",
980 "Thieves Town (Conveyor Toilet)",
981 "Empty Clone ",
982 "Ice Palace (Block Puzzle )",
983 "Ice Palace Clone (Switch )",
984 "Agahnim's Tower (Dark Bridge )",
985 "Misery Mire (Compass Chest / Tile )",
986 "Misery Mire (Big Hub )",
987 "Misery Mire (Big Chest )",
988 "Turtle Rock (Final Crystal Switch Puzzle )",
989 "Turtle Rock (Laser Bridge)",
990 "Turtle Rock",
991 "Turtle Rock (Torch Puzzle)",
992 "Eastern Palace (Armos Knights[Boss])",
993 "Eastern Palace (Entrance )",
994 "??",
995 "Thieves Town (North West Entrance )",
996 "Thieves Town (North East Entrance )",
997 "Empty Clone ",
998 "Ice Palace (Hole to Kholdstare )",
999 "Empty Clone ",
1000 "Agahnim's Tower (Dark Maze)",
1001 "Misery Mire (Conveyor Slug / Big Key )",
1002 "Misery Mire (Mire02 / Wizzrobes )",
1003 "Empty Clone ",
1004 "Empty Clone ",
1005 "Turtle Rock (Laser Key )",
1006 "Turtle Rock (Entrance )",
1007 "Empty Clone ",
1008 "Eastern Palace (Zeldagamer / Pre-Armos Knights )",
1009 "Eastern Palace (Canonball ",
1010 "Eastern Palace",
1011 "Thieves Town (Main (South West) Entrance )",
1012 "Thieves Town (South East Entrance )",
1013 "Empty Clone ",
1014 "Ice Palace (Kholdstare[Boss])",
1015 "Cave",
1016 "Agahnim's Tower (Entrance )",
1017 "Cave (Lost Woods HP)",
1018 "Cave (Lumberjack's Tree HP)",
1019 "Cave (1/2 Magic)",
1020 "Cave (Lost Old Man Final Cave)",
1021 "Cave (Lost Old Man Final Cave)",
1022 "Cave",
1023 "Cave",
1024 "Cave",
1025 "Empty Clone ",
1026 "Cave (Spectacle Rock HP)",
1027 "Cave",
1028 "Empty Clone ",
1029 "Cave",
1030 "Cave (Spiral Cave)",
1031 "Cave (Crystal Switch / 5 Chests )",
1032 "Cave (Lost Old Man Starting Cave)",
1033 "Cave (Lost Old Man Starting Cave)",
1034 "House",
1035 "House (Old Woman (Sahasrahla's Wife?))",
1036 "House (Angry Brothers)",
1037 "House (Angry Brothers)",
1038 "Empty Clone ",
1039 "Empty Clone ",
1040 "Cave",
1041 "Cave",
1042 "Cave",
1043 "Cave",
1044 "Empty Clone ",
1045 "Cave",
1046 "Cave",
1047 "Cave",
1048
1049 "Chest Minigame",
1050 "Houses",
1051 "Sick Boy house",
1052 "Tavern",
1053 "Link's House",
1054 "Sarashrala Hut",
1055 "Chest Minigame",
1056 "Library",
1057 "Chicken House",
1058 "Witch Shop",
1059 "A Aginah's Cave",
1060 "Dam",
1061 "Mimic Cave",
1062 "Mire Shed",
1063 "Cave",
1064 "Shop",
1065 "Shop",
1066 "Archery Minigame",
1067 "DW Church/Shop",
1068 "Grave Cave",
1069 "Fairy Fountain",
1070 "Fairy Upgrade",
1071 "Pyramid Fairy",
1072 "Spike Cave",
1073 "Chest Minigame",
1074 "Blind Hut",
1075 "Bonzai Cave",
1076 "Circle of bush Cave",
1077 "Big Bomb Shop, C-House",
1078 "Blind Hut 2",
1079 "Hype Cave",
1080 "Shop",
1081 "Ice Cave",
1082 "Smith",
1083 "Fortune Teller",
1084 "MiniMoldorm Cave",
1085 "Under Rock Caves",
1086 "Smith",
1087 "Cave",
1088 "Mazeblock Cave",
1089 "Smith Peg Cave"};
1090
1091// RoomTag names defined in room.cc to avoid static initialization order issues
1092extern const std::string RoomTag[65];
1093
1094} // namespace zelda3
1095} // namespace yaze
1096
1097#endif
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
static std::pair< uint8_t, uint8_t > EncodeDoorBytes(uint8_t position, DoorType type, DoorDirection direction)
Encode door data for ROM storage.
static std::pair< int, int > PositionToPixelCoords(uint8_t position, DoorDirection direction)
Convert encoded position to pixel coordinates.
static std::tuple< int, int, int, int > GetDoorBounds(uint8_t position, DoorDirection direction)
Get the bounding rectangle for a door.
static std::pair< int, int > PositionToTileCoords(uint8_t position, DoorDirection direction)
Convert encoded position to tile coordinates.
Interface for accessing dungeon game state.
RoomLayerManager - Manages layer visibility and compositing.
uint8_t holewarp() const
Definition room.h:573
bool ValidateObject(const RoomObject &object) const
Definition room.cc:1921
const std::array< uint8_t, 0x10000 > & get_gfx_buffer() const
Definition room.h:625
destination pits_
Definition room.h:731
std::vector< RoomObject > tile_objects_
Definition room.h:715
uint8_t cached_blockset_
Definition room.h:681
EffectKey effect_
Definition room.h:726
gfx::BackgroundBuffer object_bg1_buffer_
Definition room.h:659
uint8_t palette_
Definition room.h:700
void SetTag2Direct(TagKey tag2)
Definition room.h:536
bool HasExceededLimits() const
Check if any object limits are exceeded.
Definition room.cc:2885
uint8_t cached_layout_
Definition room.h:684
const CustomCollisionMap & custom_collision() const
Definition room.h:384
uint8_t staircase_plane_[4]
Definition room.h:694
absl::Status UpdateObject(size_t index, const RoomObject &object)
Definition room.cc:1896
TagKey cached_tag2_
Definition room.h:689
WaterFillZoneMap & water_fill_zone()
Definition room.h:412
void AddTileObject(const RoomObject &object)
Definition room.h:321
void MarkLayoutDirty()
Definition room.h:344
void SetStair4Target(uint8_t target)
Definition room.h:546
void SetPitsTarget(uint8_t target)
Definition room.h:542
void SetIsLight(bool is_light)
Definition room.h:474
void LoadChests()
Definition room.cc:2036
void MarkObjectsDirty()
Definition room.h:334
gfx::BackgroundBuffer bg2_buffer_
Definition room.h:658
void ClearTileObjects()
Definition room.h:320
const std::vector< chest_data > & GetChests() const
Definition room.h:218
uint8_t cached_floor2_graphics_
Definition room.h:686
std::vector< zelda3::Sprite > sprites_
Definition room.h:717
auto mutable_rom()
Definition room.h:615
CustomCollisionMap custom_collision_
Definition room.h:737
GameData * game_data_
Definition room.h:651
void SetLoaded(bool loaded)
Definition room.h:550
uint8_t GetCollisionTile(int x, int y) const
Definition room.h:394
void ClearCustomCollisionDirty()
Definition room.h:407
void CopyRoomGraphicsToBuffer()
Definition room.cc:498
destination stair2_
Definition room.h:733
void set_water_fill_sram_bit_mask(uint8_t mask)
Definition room.h:454
uint16_t message_id() const
Definition room.h:574
bool custom_collision_dirty() const
Definition room.h:406
uint8_t cached_palette_
Definition room.h:683
uint8_t blockset() const
Definition room.h:569
std::vector< staircase > & GetStairs()
Definition room.h:223
zelda3_version_pointers version_constants() const
Definition room.h:621
void LoadRoomGraphics(uint8_t entrance_blockset=0xFF)
Definition room.cc:453
void set_floor2(uint8_t value)
Definition room.h:593
const WaterFillZoneMap & water_fill_zone() const
Definition room.h:411
uint8_t cached_effect_
Definition room.h:687
std::vector< Door > doors_
Definition room.h:720
auto game_data()
Definition room.h:617
void SetStaircaseRoom(int index, uint8_t room)
Definition room.h:516
uint8_t layer2_behavior_
Definition room.h:707
const gfx::Bitmap & composite_bitmap() const
Definition room.h:641
int WaterFillTileCount() const
Definition room.h:449
absl::Status RemoveObject(size_t index)
Definition room.cc:1885
void SetStair1TargetLayer(uint8_t layer)
Definition room.h:538
void set_floor1(uint8_t value)
Definition room.h:587
void MarkGraphicsDirty()
Definition room.h:339
void LoadBlocks()
Definition room.cc:2632
void SetLayer2Mode(uint8_t mode)
Definition room.h:529
RoomLayout layout_
Definition room.h:722
uint8_t layer2_mode_
Definition room.h:710
void LoadLayoutTilesToBuffer()
Definition room.cc:903
uint8_t staircase_room(int index) const
Definition room.h:562
auto & mutable_blocks()
Definition room.h:612
void SetTag2(TagKey tag2)
Definition room.h:505
const std::vector< Door > & GetDoors() const
Definition room.h:294
std::vector< DungeonLimitInfo > GetExceededLimitDetails() const
Get list of exceeded limits with details.
Definition room.cc:2890
bool IsLoaded() const
Definition room.h:549
auto & object_bg2_buffer()
Definition room.h:636
void ParseObjectsFromLocation(int objects_location)
Definition room.cc:1353
uint8_t cached_floor1_graphics_
Definition room.h:685
bool custom_collision_dirty_
Definition room.h:738
void set_has_custom_collision(bool has)
Definition room.h:387
void ClearWaterFillZone()
Definition room.h:441
const auto & object_bg1_buffer() const
Definition room.h:635
void ReloadGraphics(uint8_t entrance_blockset=0xFF)
std::vector< zelda3::Sprite > & GetSprites()
Definition room.h:215
void SetTag1Direct(TagKey tag1)
Definition room.h:535
void LoadTorches()
Definition room.cc:2076
bool IsCompositeDirty() const
Definition room.h:645
void SetLayoutId(uint8_t id)
Definition room.h:577
void SetHolewarp(uint8_t hw)
Definition room.h:515
std::vector< Door > & GetDoors()
Definition room.h:295
TagKey tag2() const
Definition room.h:556
destination stair4_
Definition room.h:735
void SetStair2Target(uint8_t target)
Definition room.h:544
size_t GetTileObjectCount() const
Definition room.h:355
const auto & object_bg2_buffer() const
Definition room.h:637
uint8_t floor2() const
Definition room.h:586
CustomCollisionMap & custom_collision()
Definition room.h:385
int animated_frame_
Definition room.h:692
void SetCollision(CollisionKey collision)
Definition room.h:473
const std::vector< staircase > & GetStairs() const
Definition room.h:222
gfx::BackgroundBuffer bg1_buffer_
Definition room.h:657
absl::Status SaveObjects()
Definition room.cc:1681
bool has_water_fill_zone() const
Definition room.h:413
uint8_t palette() const
Definition room.h:571
RoomObject & GetTileObject(size_t index)
Definition room.h:356
void SetStaircasePlane(int index, uint8_t plane)
Definition room.h:511
void SetIsDark(bool is_dark)
Definition room.h:531
WaterFillZoneMap water_fill_zone_
Definition room.h:740
auto rom() const
Definition room.h:613
std::map< DungeonLimit, int > GetLimitedObjectCounts() const
Count limited objects in this room.
Definition room.cc:2788
void RenderRoomGraphics()
Definition room.cc:598
absl::Status SaveRoomHeader()
Definition room.cc:1797
gfx::Bitmap composite_bitmap_
Definition room.h:671
Room & operator=(Room &&)
uint8_t sprite_tileset_
Definition room.h:706
std::vector< RoomObject > & GetTileObjects()
Definition room.h:317
uint16_t message_id_
Definition room.h:703
TagKey tag1() const
Definition room.h:555
std::vector< PotItem > & GetPotItems()
Definition room.h:309
CollisionKey collision() const
Definition room.h:557
const RoomLayout & GetLayout() const
Definition room.h:311
void SetMessageIdDirect(uint16_t mid)
Definition room.h:528
void AddDoor(const Door &door)
Definition room.h:296
uint8_t staircase_rooms_[4]
Definition room.h:695
const auto & bg1_buffer() const
Definition room.h:632
bool water_fill_dirty_
Definition room.h:741
gfx::Bitmap & GetCompositeBitmap(RoomLayerManager &layer_mgr)
Get a composite bitmap of all layers merged.
Definition room.cc:590
std::vector< uint8_t > EncodeObjects() const
Definition room.cc:1457
void SetEffect(EffectKey effect)
Definition room.h:493
gfx::BackgroundBuffer object_bg2_buffer_
Definition room.h:660
uint8_t spriteset() const
Definition room.h:570
void ClearWaterFillDirty()
Definition room.h:462
Room & operator=(const Room &)=delete
uint8_t holewarp_
Definition room.h:702
uint8_t layout_id_
Definition room.h:701
std::array< uint8_t, 16 > blocks_
Definition room.h:712
void SetTag1(TagKey tag1)
Definition room.h:499
void SetBackgroundTileset(uint8_t tileset)
Definition room.h:532
void SetStair3TargetLayer(uint8_t layer)
Definition room.h:540
const std::vector< zelda3::Sprite > & GetSprites() const
Definition room.h:214
uint8_t floor2_graphics_
Definition room.h:709
background2 bg2_
Definition room.h:730
std::array< chest, 16 > chest_list_
Definition room.h:713
auto & bg1_buffer()
Definition room.h:630
const std::vector< RoomObject > & GetTileObjects() const
Definition room.h:314
bool IsLight() const
Definition room.h:525
uint8_t floor1_graphics_
Definition room.h:708
DungeonState * GetDungeonState()
Definition room.h:647
const LayerMergeType & layer_merging() const
Definition room.h:558
absl::Status SaveSprites()
Definition room.cc:1745
auto blocks() const
Definition room.h:611
void MarkWaterFillDirty()
Definition room.h:463
void SetLayerMerging(LayerMergeType merging)
Definition room.h:530
void SetPitsTargetLayer(uint8_t layer)
Definition room.h:537
void LoadObjects()
Definition room.cc:1292
void LoadPotItems()
Definition room.cc:2710
bool GetWaterFillTile(int x, int y) const
Definition room.h:415
uint8_t blockset_
Definition room.h:698
EffectKey effect() const
Definition room.h:554
void SetSpriteTileset(uint8_t tileset)
Definition room.h:533
void SetStair1Target(uint8_t target)
Definition room.h:543
destination stair3_
Definition room.h:734
void SetBg2(background2 bg2)
Definition room.h:472
std::vector< chest_data > & GetChests()
Definition room.h:219
void SetSpriteset(uint8_t ss)
Definition room.h:487
uint8_t floor1() const
Definition room.h:585
void SetTileObjects(const std::vector< RoomObject > &objects)
Definition room.h:466
void MarkCompositeDirty()
Mark composite bitmap as needing regeneration.
Definition room.h:644
std::unique_ptr< DungeonState > dungeon_state_
Definition room.h:743
void LoadAnimatedGraphics()
Definition room.cc:1222
std::vector< uint8_t > EncodeSprites() const
Definition room.cc:1544
void SetCollisionTile(int x, int y, uint8_t tile)
Definition room.h:399
std::vector< chest_data > chests_in_room_
Definition room.h:719
void SetBlockset(uint8_t bs)
Definition room.h:481
uint8_t spriteset_
Definition room.h:699
LayerMergeType layer_merging_
Definition room.h:724
background2 bg2() const
Definition room.h:553
bool water_fill_dirty() const
Definition room.h:461
uint8_t staircase_plane(int index) const
Definition room.h:559
void MarkCustomCollisionDirty()
Definition room.h:408
const RoomObject & GetTileObject(size_t index) const
Definition room.h:357
uint8_t cached_spriteset_
Definition room.h:682
std::array< uint8_t, 0x10000 > current_gfx16_
Definition room.h:653
std::vector< staircase > z3_staircases_
Definition room.h:718
std::vector< PotItem > pot_items_
Definition room.h:721
void LoadSprites()
Definition room.cc:1980
TagKey cached_tag1_
Definition room.h:688
destination stair1_
Definition room.h:732
int water_fill_tile_count_
Definition room.h:742
uint8_t background_tileset_
Definition room.h:705
void SetStair3Target(uint8_t target)
Definition room.h:545
DirtyState dirty_state_
Definition room.h:672
void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY, int &nbr_of_staircase)
Definition room.cc:1943
void SetStair4TargetLayer(uint8_t layer)
Definition room.h:541
absl::Status AddObject(const RoomObject &object)
Definition room.cc:1872
absl::StatusOr< size_t > FindObjectAt(int x, int y, int layer) const
Definition room.cc:1911
void RemoveTileObject(size_t index)
Definition room.h:349
void SetPalette(uint8_t pal)
Definition room.h:475
uint8_t layout_id() const
Definition room.h:572
bool has_custom_collision() const
Definition room.h:386
const std::vector< PotItem > & GetPotItems() const
Definition room.h:308
void SetRom(Rom *rom)
Definition room.h:616
uint8_t water_fill_sram_bit_mask() const
Definition room.h:453
void RemoveDoor(size_t index)
Definition room.h:300
void SetStair2TargetLayer(uint8_t layer)
Definition room.h:539
Room(const Room &)=delete
const auto & bg2_buffer() const
Definition room.h:633
void RenderObjectsToBackground()
Definition room.cc:977
CollisionKey collision_
Definition room.h:725
void SetGameData(GameData *data)
Definition room.h:618
auto & object_bg1_buffer()
Definition room.h:634
auto & bg2_buffer()
Definition room.h:631
void SetLayer2Behavior(uint8_t behavior)
Definition room.h:534
void SetWaterFillTile(int x, int y, bool filled)
Definition room.h:420
void SetMessageId(uint16_t mid)
Definition room.h:522
int id() const
Definition room.h:566
zelda3_bg2_effect
Background layer 2 effects.
Definition zelda.h:369
absl::Status SaveAllChests(Rom *rom, absl::Span< const Room > rooms)
Definition room.cc:2530
constexpr DoorDirection DoorDirectionFromRaw(uint8_t raw_dir)
Convert raw direction byte to DoorDirection enum.
Definition door_types.h:216
const std::string RoomTag[65]
Definition room.cc:41
constexpr DoorDimensions GetDoorDimensions(DoorDirection dir)
Get door dimensions based on direction.
Definition door_types.h:192
DoorType
Door types from ALTTP.
Definition door_types.h:33
Room LoadRoomHeaderFromRom(Rom *rom, int room_id)
Definition room.cc:274
int FindMaxUsedSpriteAddress(Rom *rom)
Definition room.cc:1574
@ Ganon_Room
Definition room.h:89
@ Moving_Floor
Definition room.h:84
@ Effect_Nothing
Definition room.h:82
@ Red_Flashes
Definition room.h:87
@ Moving_Water
Definition room.h:85
@ Torch_Show_Floor
Definition room.h:88
absl::Status RelocateSpriteData(Rom *rom, int room_id, const std::vector< uint8_t > &encoded_bytes)
Definition room.cc:1611
absl::Status SaveAllPotItems(Rom *rom, absl::Span< const Room > rooms)
Definition room.cc:2577
RoomSize CalculateRoomSize(Rom *rom, int room_id)
Definition room.cc:181
@ Kill_boss_Again
Definition room.h:172
@ Secret_Wall_Right
Definition room.h:137
@ Kill_Enemy_to_clear_level
Definition room.h:146
@ NE_Kill_Enemy_to_Open
Definition room.h:111
@ S_Kill_Enemy_for_Chest
Definition room.h:157
@ N_Push_Block_to_Open
Definition room.h:126
@ E_Kill_Enemy_to_Open
Definition room.h:115
@ Light_Torches_to_Open
Definition room.h:160
@ N_Kill_Enemy_to_Open
Definition room.h:116
@ W_Kill_Enemy_for_Chest
Definition room.h:154
@ Water_Twin
Definition room.h:136
@ N_Kill_Enemy_for_Chest
Definition room.h:156
@ Clear_Level_to_Open
Definition room.h:130
@ Push_Block_to_Open
Definition room.h:128
@ E_Kill_Enemy_for_Chest
Definition room.h:155
@ Secret_Wall_Left
Definition room.h:138
@ NE_Push_Block_to_Open
Definition room.h:121
@ Open_Chest_for_Holes_8
Definition room.h:168
@ S_Kill_Enemy_to_Open
Definition room.h:117
@ S_Push_Block_to_Open
Definition room.h:127
@ Trigger_activated_Chest
Definition room.h:148
@ SW_Kill_Enemy_for_Chest
Definition room.h:152
@ SE_Kill_Enemy_for_Chest
Definition room.h:153
@ Pull_lever_to_Bomb_Wall
Definition room.h:149
@ Pull_Switch_to_bomb_Wall
Definition room.h:141
@ Agahnim_Room
Definition room.h:165
@ Water_Gate
Definition room.h:135
@ SE_Kill_Enemy_to_Move_Block
Definition room.h:147
@ NE_Kill_Enemy_for_Chest
Definition room.h:151
@ SE_Push_Block_to_Open
Definition room.h:123
@ Pull_Lever_to_Open
Definition room.h:129
@ W_Push_Block_to_Open
Definition room.h:124
@ E_Push_Block_to_Open
Definition room.h:125
@ Kill_to_open_Ganon_Door
Definition room.h:170
@ SW_Push_Block_to_Open
Definition room.h:122
@ Turn_on_Water
Definition room.h:134
@ W_Kill_Enemy_to_Open
Definition room.h:114
@ Open_Chest_Activate_Holes_0
Definition room.h:143
@ Clear_Room_for_Chest
Definition room.h:159
@ Clear_Room_to_Open
Definition room.h:119
@ NW_Push_Block_to_Open
Definition room.h:120
@ Switch_Open_Door_Toggle
Definition room.h:132
@ SW_Kill_Enemy_to_Open
Definition room.h:112
@ Clear_Quadrant_for_Chest
Definition room.h:158
@ NW_Kill_Enemy_to_Open
Definition room.h:110
@ Switch_Open_Door_Hold
Definition room.h:131
@ SE_Kill_Enemy_to_Open
Definition room.h:113
@ Turn_off_Water
Definition room.h:133
@ Clear_Quadrant_to_Open
Definition room.h:118
@ Push_Block_for_Chest
Definition room.h:169
@ NW_Kill_Enemy_for_Chest
Definition room.h:150
@ Light_Torches_to_get_Chest
Definition room.h:171
absl::Status SaveAllTorches(Rom *rom, absl::Span< const Room > rooms)
Definition room.cc:2210
constexpr std::string_view GetDoorDirectionName(DoorDirection dir)
Get human-readable name for door direction.
Definition door_types.h:161
absl::Status SaveAllPits(Rom *rom)
Definition room.cc:2300
absl::Status SaveAllBlocks(Rom *rom)
Definition room.cc:2331
Room LoadRoomFromRom(Rom *rom, int room_id)
Definition room.cc:253
constexpr DoorType DoorTypeFromRaw(uint8_t raw_type)
Convert raw type byte to DoorType enum.
Definition door_types.h:208
constexpr std::array< std::string_view, 297 > kRoomNames
Definition room.h:791
constexpr std::string_view GetDoorTypeName(DoorType type)
Get human-readable name for door type.
Definition door_types.h:106
const std::string RoomEffect[8]
Definition room.cc:31
DoorDirection
Door direction on room walls.
Definition door_types.h:18
absl::Status SaveAllCollision(Rom *rom, absl::Span< Room > rooms)
Definition room.cc:2370
@ Moving_Water_Collision
Definition room.h:78
@ One_Collision
Definition room.h:74
@ Moving_Floor_Collision
Definition room.h:77
@ Both_With_Scroll
Definition room.h:76
Room transition destination.
Definition zelda.h:448
uint8_t target_layer
Definition zelda.h:451
uint8_t target
Definition zelda.h:450
std::array< uint8_t, 64 *64 > tiles
Door dimensions in tiles (8x8 pixel tiles)
Definition door_types.h:178
zelda3_version version
Definition game_data.h:78
LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans)
Definition room.h:42
int GetPixelX() const
Definition room.h:100
int GetPixelY() const
Definition room.h:101
int GetTileY() const
Definition room.h:105
int GetTileX() const
Definition room.h:104
uint16_t position
Definition room.h:95
int64_t room_size_pointer
Definition room.h:753
Represents a door in a dungeon room.
Definition room.h:231
std::tuple< int, int, int, int > GetBounds() const
Get bounding rectangle (x, y, width, height in pixels)
Definition room.h:255
std::string_view GetTypeName() const
Get human-readable type name.
Definition room.h:260
uint8_t byte1
Original ROM byte 1 (position data)
Definition room.h:236
DoorDimensions GetDimensions() const
Get door dimensions in tiles.
Definition room.h:250
DoorType type
Door type (determines appearance/behavior)
Definition room.h:233
static Door FromRomBytes(uint8_t b1, uint8_t b2)
Definition room.h:278
std::pair< uint8_t, uint8_t > EncodeBytes() const
Encode door data for ROM storage.
Definition room.h:270
DoorDirection direction
Which wall the door is on.
Definition room.h:234
uint8_t position
Encoded position (5-bit, 0-31)
Definition room.h:232
std::string_view GetDirectionName() const
Get human-readable direction name.
Definition room.h:265
std::pair< int, int > GetPixelCoords() const
Get pixel coordinates for this door.
Definition room.h:245
uint8_t byte2
Original ROM byte 2 (type + direction)
Definition room.h:237
std::pair< int, int > GetTileCoords() const
Get tile coordinates for this door.
Definition room.h:240
std::array< uint8_t, 64 *64 > tiles
Definition room.h:179
ROM data pointers for different game versions.
Definition zelda.h:71
Public YAZE API umbrella header.