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
14#include "rom/rom.h"
18#include "zelda3/game_data.h"
22
23namespace yaze {
24namespace zelda3 {
25
26class DungeonState;
27class RoomLayerManager;
28
29// ROM addresses moved to dungeon_rom_addresses.h for better organization
30// Use kPrefixedNames for new code (clean naming convention)
31
32// Legacy aliases for backward compatibility (gradual migration)
49constexpr int torch_data = kTorchData;
52constexpr int sprites_data = kSpritesData;
55constexpr int pit_pointer = kPitPointer;
56constexpr int pit_count = kPitCount;
58constexpr int door_gfx_up = kDoorGfxUp;
63constexpr int door_pos_up = kDoorPosUp;
68constexpr int tile_address = kTileAddress;
71constexpr uint16_t stairsObjects[] = {0x139, 0x138, 0x13B, 0x12E, 0x12D};
72
73// TODO: Gradually migrate all code to use kPrefixedNames directly
74// Then remove these legacy aliases
75
77 uint8_t ID;
78 std::string Name;
82 LayerMergeType() = default;
83 LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans) {
84 ID = id;
85 Name = name;
86 Layer2OnTop = top;
87 Layer2Translucent = trans;
88 Layer2Visible = see;
89 }
90};
91
92// LayerMergeType(id, name, Layer2Visible, Layer2OnTop, Layer2Translucent)
93//
94// SNES Mode 1 Layer Priority: BG1 is ALWAYS rendered on top of BG2 by default.
95// The flags control COLOR MATH effects, not Z-order:
96// - Layer2Visible: Whether BG2 is enabled on main screen
97// - Layer2OnTop: Whether BG2 participates in sub-screen color math effects
98// (transparency, additive blending) - does NOT change draw order
99// - Layer2Translucent: Whether color math creates transparency effect
100const static LayerMergeType LayerMerge00{0x00, "Off", true, false, false};
101const static LayerMergeType LayerMerge01{0x01, "Parallax", true, false, false};
102const static LayerMergeType LayerMerge02{0x02, "Dark", true, true, true};
103const static LayerMergeType LayerMerge03{0x03, "On top", false, true, false};
104const static LayerMergeType LayerMerge04{0x04, "Translucent", true, true, true};
105const static LayerMergeType LayerMerge05{0x05, "Addition", true, true, true};
106const static LayerMergeType LayerMerge06{0x06, "Normal", true, false, false};
107const static LayerMergeType LayerMerge07{0x07, "Transparent", true, true, true};
108const static LayerMergeType LayerMerge08{0x08, "Dark room", true, true, true};
109
110const static LayerMergeType kLayerMergeTypeList[] = {
111 LayerMerge00, LayerMerge01, LayerMerge02, LayerMerge03, LayerMerge04,
112 LayerMerge05, LayerMerge06, LayerMerge07, LayerMerge08};
113
121
132
133// Pot item - items hidden under pots, rocks, skulls etc.
134// Each item has its own position from ROM data
135struct PotItem {
136 uint16_t position = 0; // Raw position word from ROM
137 uint8_t item = 0; // Item type (0 = nothing)
138
139 // Decode pixel coordinates from position word
140 // Format: high byte * 16 = Y, low byte * 4 = X
141 int GetPixelX() const { return (position & 0xFF) * 4; }
142 int GetPixelY() const { return ((position >> 8) & 0xFF) * 16; }
143
144 // Get tile coordinates (8-pixel tiles)
145 int GetTileX() const { return GetPixelX() / 8; }
146 int GetTileY() const { return GetPixelY() / 8; }
147};
148
149enum TagKey {
215
216class Room {
217 public:
219 Room(int room_id, Rom* rom, GameData* game_data = nullptr);
221
222 // Move-only type due to unique_ptr
225 Room(const Room&) = delete;
226 Room& operator=(const Room&) = delete;
227
228 void LoadRoomGraphics(uint8_t entrance_blockset = 0xFF);
230 // LoadGraphicsSheetsIntoArena() removed - per-room graphics instead
231 void RenderRoomGraphics();
234 void LoadObjects();
235 void LoadSprites();
236 void LoadChests();
237 void LoadPotItems();
238 void LoadDoors();
239 void LoadTorches();
240 void LoadBlocks();
241 void LoadPits();
243 void ReloadGraphics(uint8_t entrance_blockset = 0xFF);
244
245 // Public getters and manipulators for sprites
246 const std::vector<zelda3::Sprite>& GetSprites() const { return sprites_; }
247 std::vector<zelda3::Sprite>& GetSprites() { return sprites_; }
248
249 // Public getters and manipulators for chests
250 const std::vector<chest_data>& GetChests() const { return chests_in_room_; }
251 std::vector<chest_data>& GetChests() { return chests_in_room_; }
252
253 // Public getters and manipulators for stairs
254 const std::vector<staircase>& GetStairs() const { return z3_staircases_; }
255 std::vector<staircase>& GetStairs() { return z3_staircases_; }
256
263 struct Door {
264 uint8_t position;
267
268 uint8_t byte1;
269 uint8_t byte2;
270
272 std::pair<int, int> GetTileCoords() const {
274 }
275
277 std::pair<int, int> GetPixelCoords() const {
279 }
280
285
287 std::tuple<int, int, int, int> GetBounds() const {
289 }
290
292 std::string_view GetTypeName() const {
294 }
295
297 std::string_view GetDirectionName() const {
299 }
300
302 std::pair<uint8_t, uint8_t> EncodeBytes() const {
304 }
305
310 static Door FromRomBytes(uint8_t b1, uint8_t b2) {
311 Door door;
312 door.byte1 = b1;
313 door.byte2 = b2;
314 // Position index is in bits 4-7 of b1
315 // ASM does: (b1 & 0xF0) >> 3 which gives index * 2 for table lookup
316 // We store the raw index (0-15, typically 0-5)
317 door.position = (b1 >> 4) & 0x0F;
318 // Direction is in bits 0-1 of b1
319 door.direction = DoorDirectionFromRaw(b1 & 0x03);
320 // Door type is the full second byte
321 door.type = DoorTypeFromRaw(b2);
322 return door;
323 }
324 };
325
326 const std::vector<Door>& GetDoors() const { return doors_; }
327 std::vector<Door>& GetDoors() { return doors_; }
328 void AddDoor(const Door& door) {
329 doors_.push_back(door);
331 }
332 void RemoveDoor(size_t index) {
333 if (index < doors_.size()) {
334 doors_.erase(doors_.begin() + index);
336 }
337 }
338
339 // Public getters for pot items (items hidden under pots/bushes)
340 const std::vector<PotItem>& GetPotItems() const { return pot_items_; }
341 std::vector<PotItem>& GetPotItems() { return pot_items_; }
342
343 const RoomLayout& GetLayout() const { return layout_; }
344
345 // Public getters and manipulators for tile objects
346 const std::vector<RoomObject>& GetTileObjects() const {
347 return tile_objects_;
348 }
349 std::vector<RoomObject>& GetTileObjects() { return tile_objects_; }
350
351 // Methods for modifying tile objects
352 void ClearTileObjects() { tile_objects_.clear(); }
353 void AddTileObject(const RoomObject& object) {
354 tile_objects_.push_back(object);
356 }
357
358 // Enhanced object manipulation (Phase 3)
359 absl::Status AddObject(const RoomObject& object);
360 absl::Status RemoveObject(size_t index);
361 absl::Status UpdateObject(size_t index, const RoomObject& object);
362 absl::StatusOr<size_t> FindObjectAt(int x, int y, int layer) const;
363 bool ValidateObject(const RoomObject& object) const;
364
365 // Performance optimization: Mark objects as dirty when modified
367 objects_dirty_ = true;
368 textures_dirty_ = true;
369 composite_dirty_ = true;
370 }
372 graphics_dirty_ = true;
373 textures_dirty_ = true;
374 composite_dirty_ = true;
375 }
377 layout_dirty_ = true;
378 textures_dirty_ = true;
379 composite_dirty_ = true;
380 }
381 void RemoveTileObject(size_t index) {
382 if (index < tile_objects_.size()) {
383 tile_objects_.erase(tile_objects_.begin() + index);
385 }
386 }
387 size_t GetTileObjectCount() const { return tile_objects_.size(); }
388 RoomObject& GetTileObject(size_t index) { return tile_objects_[index]; }
389 const RoomObject& GetTileObject(size_t index) const {
390 return tile_objects_[index];
391 }
392
393 // For undo/redo functionality
394 void SetTileObjects(const std::vector<RoomObject>& objects) {
395 tile_objects_ = objects;
397 }
398
399 // Public setters for LoadRoomFromRom function
400 void SetBg2(background2 bg2) { bg2_ = bg2; }
402 void SetIsLight(bool is_light) { is_light_ = is_light; }
403 void SetPalette(uint8_t palette) {
404 if (this->palette != palette) {
405 this->palette = palette;
407 }
408 }
409 void SetBlockset(uint8_t blockset) {
410 if (this->blockset != blockset) {
411 this->blockset = blockset;
413 }
414 }
415 void SetSpriteset(uint8_t spriteset) {
416 if (this->spriteset != spriteset) {
417 this->spriteset = spriteset;
419 }
420 }
422 if (effect_ != effect) {
423 effect_ = effect;
425 }
426 }
428 if (tag1_ != tag1) {
429 tag1_ = tag1;
431 }
432 }
434 if (tag2_ != tag2) {
435 tag2_ = tag2;
437 }
438 }
439 void SetStaircasePlane(int index, uint8_t plane) {
440 if (index >= 0 && index < 4)
441 staircase_plane_[index] = plane;
442 }
443 void SetHolewarp(uint8_t holewarp) { this->holewarp = holewarp; }
444 void SetStaircaseRoom(int index, uint8_t room) {
445 if (index >= 0 && index < 4)
446 staircase_rooms_[index] = room;
447 }
448 // SetFloor1/SetFloor2 removed - use set_floor1()/set_floor2() instead
449 // (defined above)
450 void SetMessageId(uint16_t message_id) { message_id_ = message_id; }
451
452 // Getters for LoadRoomFromRom function
453 bool IsLight() const { return is_light_; }
454
455 // Additional setters for LoadRoomFromRom function
456 void SetMessageIdDirect(uint16_t message_id) { message_id_ = message_id; }
457 void SetLayer2Mode(uint8_t mode) { layer2_mode_ = mode; }
458 void SetLayerMerging(LayerMergeType merging) { layer_merging_ = merging; }
459 void SetIsDark(bool is_dark) { is_dark_ = is_dark; }
461 void SetBackgroundTileset(uint8_t tileset) { background_tileset_ = tileset; }
462 void SetSpriteTileset(uint8_t tileset) { sprite_tileset_ = tileset; }
463 void SetLayer2Behavior(uint8_t behavior) { layer2_behavior_ = behavior; }
466 void SetPitsTargetLayer(uint8_t layer) { pits_.target_layer = layer; }
467 void SetStair1TargetLayer(uint8_t layer) { stair1_.target_layer = layer; }
468 void SetStair2TargetLayer(uint8_t layer) { stair2_.target_layer = layer; }
469 void SetStair3TargetLayer(uint8_t layer) { stair3_.target_layer = layer; }
470 void SetStair4TargetLayer(uint8_t layer) { stair4_.target_layer = layer; }
471 void SetPitsTarget(uint8_t target) { pits_.target = target; }
472 void SetStair1Target(uint8_t target) { stair1_.target = target; }
473 void SetStair2Target(uint8_t target) { stair2_.target = target; }
474 void SetStair3Target(uint8_t target) { stair3_.target = target; }
475 void SetStair4Target(uint8_t target) { stair4_.target = target; }
476
477 // Loaded state
478 bool IsLoaded() const { return is_loaded_; }
479 void SetLoaded(bool loaded) { is_loaded_ = loaded; }
480
481 // Read-only accessors for metadata
482 EffectKey effect() const { return effect_; }
483 TagKey tag1() const { return tag1_; }
484 TagKey tag2() const { return tag2_; }
486 const LayerMergeType& layer_merging() const { return layer_merging_; }
487
488 int id() const { return room_id_; }
489
490 uint8_t blockset = 0;
491 uint8_t spriteset = 0;
492 uint8_t palette = 0;
493 uint8_t layout = 0;
494 uint8_t holewarp = 0;
495 // NOTE: floor1/floor2 removed - use floor1() and floor2() accessors instead
496 // Floor graphics are now private (floor1_graphics_, floor2_graphics_)
497 uint16_t message_id_ = 0;
498
499 // Floor graphics accessors (use these instead of direct members!)
500 uint8_t floor1() const { return floor1_graphics_; }
501 uint8_t floor2() const { return floor2_graphics_; }
502 void set_floor1(uint8_t value) {
503 if (floor1_graphics_ != value) {
504 floor1_graphics_ = value;
506 }
507 }
508 void set_floor2(uint8_t value) {
509 if (floor2_graphics_ != value) {
510 floor2_graphics_ = value;
512 }
513 }
514 // Enhanced object parsing methods
515 void ParseObjectsFromLocation(int objects_location);
516 void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY,
517 int& nbr_of_staircase);
518
519 // Object saving (Phase 1, Task 1.3)
520 absl::Status SaveObjects();
521 std::vector<uint8_t> EncodeObjects() const;
522 absl::Status SaveSprites();
523 std::vector<uint8_t> EncodeSprites() const;
524
525 auto blocks() const { return blocks_; }
526 auto& mutable_blocks() { return blocks_; }
527 auto rom() { return rom_; }
528 auto mutable_rom() { return rom_; }
529 void SetRom(Rom* rom) { rom_ = rom; }
530 auto game_data() { return game_data_; }
531 void SetGameData(GameData* data) { game_data_ = data; }
532
533 // Helper to get version constants from game_data or default to US
535 return kVersionConstantsMap.at(game_data_ ? game_data_->version : zelda3_version::US);
536 }
537 const std::array<uint8_t, 0x10000>& get_gfx_buffer() const {
538 return current_gfx16_;
539 }
540
541 // Per-room background buffers (not shared via arena!)
542 auto& bg1_buffer() { return bg1_buffer_; }
543 auto& bg2_buffer() { return bg2_buffer_; }
544 const auto& bg1_buffer() const { return bg1_buffer_; }
545 const auto& bg2_buffer() const { return bg2_buffer_; }
547 const auto& object_bg1_buffer() const { return object_bg1_buffer_; }
549 const auto& object_bg2_buffer() const { return object_bg2_buffer_; }
550
554
557 bool IsCompositeDirty() const { return composite_dirty_; }
558
560
561 private:
564
565 std::array<uint8_t, 0x10000> current_gfx16_;
566
567 // Each room has its OWN background buffers and bitmaps
568 // Each room has its OWN background buffers and bitmaps
573
574 // Composite bitmap for merged layer output
576 mutable bool composite_dirty_ = true;
577
579 bool is_loaded_ = false;
581 bool is_floor_ = true;
582
583 // Performance optimization: Cache room properties to avoid unnecessary
584 // re-renders
585 uint8_t cached_blockset_ = 0xFF;
586 uint8_t cached_spriteset_ = 0xFF;
587 uint8_t cached_palette_ = 0xFF;
588 uint8_t cached_layout_ = 0xFF;
591 uint8_t cached_effect_ = 0xFF;
594
595 // Dirty flags for selective rendering
596 bool graphics_dirty_ = true;
597 bool objects_dirty_ = true;
598 bool layout_dirty_ = true;
599 bool textures_dirty_ = true;
600
603
606
610 uint8_t palette_;
614
615 std::array<uint8_t, 16> blocks_;
616 std::array<chest, 16> chest_list_;
617
618 std::vector<RoomObject> tile_objects_;
619 // TODO: add separate door objects list when door section (F0 FF) is parsed
620 std::vector<zelda3::Sprite> sprites_;
621 std::vector<staircase> z3_staircases_;
622 std::vector<chest_data> chests_in_room_;
623 std::vector<Door> doors_;
624 std::vector<PotItem> pot_items_;
626
632
639
640 std::unique_ptr<DungeonState> dungeon_state_;
641};
642
643// Loads a room from the ROM.
644Room LoadRoomFromRom(Rom* rom, int room_id);
645
646// Loads only the room header (metadata) from the ROM.
647Room LoadRoomHeaderFromRom(Rom* rom, int room_id);
648
649struct RoomSize {
651 int64_t room_size;
652};
653
654// Calculates the size of a room in the ROM.
655RoomSize CalculateRoomSize(Rom* rom, int room_id);
656
657// RoomEffect names defined in room.cc to avoid static initialization order issues
658extern const std::string RoomEffect[8];
659
660constexpr std::array<std::string_view, 297> kRoomNames = {
661 "Ganon",
662 "Hyrule Castle (North Corridor)",
663 "Behind Sanctuary (Switch)",
664 "Houlihan",
665 "Turtle Rock (Crysta-Roller)",
666 "Empty",
667 "Swamp Palace (Arrghus[Boss])",
668 "Tower of Hera (Moldorm[Boss])",
669 "Cave (Healing Fairy)",
670 "Palace of Darkness",
671 "Palace of Darkness (Stalfos Trap)",
672 "Palace of Darkness (Turtle)",
673 "Ganon's Tower (Entrance)",
674 "Ganon's Tower (Agahnim2[Boss])",
675 "Ice Palace (Entrance )",
676 "Empty Clone ",
677 "Ganon Evacuation Route",
678 "Hyrule Castle (Bombable Stock )",
679 "Sanctuary",
680 "Turtle Rock (Hokku-Bokku Key 2)",
681 "Turtle Rock (Big Key )",
682 "Turtle Rock",
683 "Swamp Palace (Swimming Treadmill)",
684 "Tower of Hera (Moldorm Fall )",
685 "Cave",
686 "Palace of Darkness (Dark Maze)",
687 "Palace of Darkness (Big Chest )",
688 "Palace of Darkness (Mimics / Moving Wall )",
689 "Ganon's Tower (Ice Armos)",
690 "Ganon's Tower (Final Hallway)",
691 "Ice Palace (Bomb Floor / Bari )",
692 "Ice Palace (Pengator / Big Key )",
693 "Agahnim's Tower (Agahnim[Boss])",
694 "Hyrule Castle (Key-rat )",
695 "Hyrule Castle (Sewer Text Trigger )",
696 "Turtle Rock (West Exit to Balcony)",
697 "Turtle Rock (Double Hokku-Bokku / Big chest )",
698 "Empty Clone ",
699 "Swamp Palace (Statue )",
700 "Tower of Hera (Big Chest)",
701 "Swamp Palace (Entrance )",
702 "Skull Woods (Mothula[Boss])",
703 "Palace of Darkness (Big Hub )",
704 "Palace of Darkness (Map Chest / Fairy )",
705 "Cave",
706 "Empty Clone ",
707 "Ice Palace (Compass )",
708 "Cave (Kakariko Well HP)",
709 "Agahnim's Tower (Maiden Sacrifice Chamber)",
710 "Tower of Hera (Hardhat Beetles )",
711 "Hyrule Castle (Sewer Key Chest )",
712 "Desert Palace (Lanmolas[Boss])",
713 "Swamp Palace (Push Block Puzzle / Pre-Big Key )",
714 "Swamp Palace (Big Key / BS )",
715 "Swamp Palace (Big Chest )",
716 "Swamp Palace (Map Chest / Water Fill )",
717 "Swamp Palace (Key Pot )",
718 "Skull Woods (Gibdo Key / Mothula Hole )",
719 "Palace of Darkness (Bombable Floor )",
720 "Palace of Darkness (Spike Block / Conveyor )",
721 "Cave",
722 "Ganon's Tower (Torch 2)",
723 "Ice Palace (Stalfos Knights / Conveyor Hellway)",
724 "Ice Palace (Map Chest )",
725 "Agahnim's Tower (Final Bridge )",
726 "Hyrule Castle (First Dark )",
727 "Hyrule Castle (6 Ropes )",
728 "Desert Palace (Torch Puzzle / Moving Wall )",
729 "Thieves Town (Big Chest )",
730 "Thieves Town (Jail Cells )",
731 "Swamp Palace (Compass Chest )",
732 "Empty Clone ",
733 "Empty Clone ",
734 "Skull Woods (Gibdo Torch Puzzle )",
735 "Palace of Darkness (Entrance )",
736 "Palace of Darkness (Warps / South Mimics )",
737 "Ganon's Tower (Mini-Helmasaur Conveyor )",
738 "Ganon's Tower (Moldorm )",
739 "Ice Palace (Bomb-Jump )",
740 "Ice Palace Clone (Fairy )",
741 "Hyrule Castle (West Corridor)",
742 "Hyrule Castle (Throne )",
743 "Hyrule Castle (East Corridor)",
744 "Desert Palace (Popos 2 / Beamos Hellway )",
745 "Swamp Palace (Upstairs Pits )",
746 "Castle Secret Entrance / Uncle Death ",
747 "Skull Woods (Key Pot / Trap )",
748 "Skull Woods (Big Key )",
749 "Skull Woods (Big Chest )",
750 "Skull Woods (Final Section Entrance )",
751 "Palace of Darkness (Helmasaur King[Boss])",
752 "Ganon's Tower (Spike Pit )",
753 "Ganon's Tower (Ganon-Ball Z)",
754 "Ganon's Tower (Gauntlet 1/2/3)",
755 "Ice Palace (Lonely Firebar)",
756 "Ice Palace (Hidden Chest / Spike Floor )",
757 "Hyrule Castle (West Entrance )",
758 "Hyrule Castle (Main Entrance )",
759 "Hyrule Castle (East Entrance )",
760 "Desert Palace (Final Section Entrance )",
761 "Thieves Town (West Attic )",
762 "Thieves Town (East Attic )",
763 "Swamp Palace (Hidden Chest / Hidden Door )",
764 "Skull Woods (Compass Chest )",
765 "Skull Woods (Key Chest / Trap )",
766 "Empty Clone ",
767 "Palace of Darkness (Rupee )",
768 "Ganon's Tower (Mimics s)",
769 "Ganon's Tower (Lanmolas )",
770 "Ganon's Tower (Gauntlet 4/5)",
771 "Ice Palace (Pengators )",
772 "Empty Clone ",
773 "Hyrule Castle (Small Corridor to Jail Cells)",
774 "Hyrule Castle (Boomerang Chest )",
775 "Hyrule Castle (Map Chest )",
776 "Desert Palace (Big Chest )",
777 "Desert Palace (Map Chest )",
778 "Desert Palace (Big Key Chest )",
779 "Swamp Palace (Water Drain )",
780 "Tower of Hera (Entrance )",
781 "Empty Clone ",
782 "Empty Clone ",
783 "Empty Clone ",
784 "Ganon's Tower",
785 "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall )",
786 "Ganon's Tower (Winder / Warp Maze )",
787 "Ice Palace (Hidden Chest / Bombable Floor )",
788 "Ice Palace ( Big Spike Traps )",
789 "Hyrule Castle (Jail Cell )",
790 "Hyrule Castle",
791 "Hyrule Castle (Basement Chasm )",
792 "Desert Palace (West Entrance )",
793 "Desert Palace (Main Entrance )",
794 "Desert Palace (East Entrance )",
795 "Empty Clone ",
796 "Tower of Hera (Tile )",
797 "Empty Clone ",
798 "Eastern Palace (Fairy )",
799 "Empty Clone ",
800 "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest )",
801 "Ganon's Tower (East and West Downstairs / Big Chest )",
802 "Ganon's Tower (Tile / Torch Puzzle )",
803 "Ice Palace",
804 "Empty Clone ",
805 "Misery Mire (Vitreous[Boss])",
806 "Misery Mire (Final Switch )",
807 "Misery Mire (Dark Bomb Wall / Switches )",
808 "Misery Mire (Dark Cane Floor Switch Puzzle )",
809 "Empty Clone ",
810 "Ganon's Tower (Final Collapsing Bridge )",
811 "Ganon's Tower (Torches 1 )",
812 "Misery Mire (Torch Puzzle / Moving Wall )",
813 "Misery Mire (Entrance )",
814 "Eastern Palace (Eyegore Key )",
815 "Empty Clone ",
816 "Ganon's Tower (Many Spikes / Warp Maze )",
817 "Ganon's Tower (Invisible Floor Maze )",
818 "Ganon's Tower (Compass Chest / Invisible Floor )",
819 "Ice Palace (Big Chest )",
820 "Ice Palace",
821 "Misery Mire (Pre-Vitreous )",
822 "Misery Mire (Fish )",
823 "Misery Mire (Bridge Key Chest )",
824 "Misery Mire",
825 "Turtle Rock (Trinexx[Boss])",
826 "Ganon's Tower (Wizzrobes s)",
827 "Ganon's Tower (Moldorm Fall )",
828 "Tower of Hera (Fairy )",
829 "Eastern Palace (Stalfos Spawn )",
830 "Eastern Palace (Big Chest )",
831 "Eastern Palace (Map Chest )",
832 "Thieves Town (Moving Spikes / Key Pot )",
833 "Thieves Town (Blind The Thief[Boss])",
834 "Empty Clone ",
835 "Ice Palace",
836 "Ice Palace (Ice Bridge )",
837 "Agahnim's Tower (Circle of Pots)",
838 "Misery Mire (Hourglass )",
839 "Misery Mire (Slug )",
840 "Misery Mire (Spike Key Chest )",
841 "Turtle Rock (Pre-Trinexx )",
842 "Turtle Rock (Dark Maze)",
843 "Turtle Rock (Chain Chomps )",
844 "Turtle Rock (Map Chest / Key Chest / Roller )",
845 "Eastern Palace (Big Key )",
846 "Eastern Palace (Lobby Cannonballs )",
847 "Eastern Palace (Dark Antifairy / Key Pot )",
848 "Thieves Town (Hellway)",
849 "Thieves Town (Conveyor Toilet)",
850 "Empty Clone ",
851 "Ice Palace (Block Puzzle )",
852 "Ice Palace Clone (Switch )",
853 "Agahnim's Tower (Dark Bridge )",
854 "Misery Mire (Compass Chest / Tile )",
855 "Misery Mire (Big Hub )",
856 "Misery Mire (Big Chest )",
857 "Turtle Rock (Final Crystal Switch Puzzle )",
858 "Turtle Rock (Laser Bridge)",
859 "Turtle Rock",
860 "Turtle Rock (Torch Puzzle)",
861 "Eastern Palace (Armos Knights[Boss])",
862 "Eastern Palace (Entrance )",
863 "??",
864 "Thieves Town (North West Entrance )",
865 "Thieves Town (North East Entrance )",
866 "Empty Clone ",
867 "Ice Palace (Hole to Kholdstare )",
868 "Empty Clone ",
869 "Agahnim's Tower (Dark Maze)",
870 "Misery Mire (Conveyor Slug / Big Key )",
871 "Misery Mire (Mire02 / Wizzrobes )",
872 "Empty Clone ",
873 "Empty Clone ",
874 "Turtle Rock (Laser Key )",
875 "Turtle Rock (Entrance )",
876 "Empty Clone ",
877 "Eastern Palace (Zeldagamer / Pre-Armos Knights )",
878 "Eastern Palace (Canonball ",
879 "Eastern Palace",
880 "Thieves Town (Main (South West) Entrance )",
881 "Thieves Town (South East Entrance )",
882 "Empty Clone ",
883 "Ice Palace (Kholdstare[Boss])",
884 "Cave",
885 "Agahnim's Tower (Entrance )",
886 "Cave (Lost Woods HP)",
887 "Cave (Lumberjack's Tree HP)",
888 "Cave (1/2 Magic)",
889 "Cave (Lost Old Man Final Cave)",
890 "Cave (Lost Old Man Final Cave)",
891 "Cave",
892 "Cave",
893 "Cave",
894 "Empty Clone ",
895 "Cave (Spectacle Rock HP)",
896 "Cave",
897 "Empty Clone ",
898 "Cave",
899 "Cave (Spiral Cave)",
900 "Cave (Crystal Switch / 5 Chests )",
901 "Cave (Lost Old Man Starting Cave)",
902 "Cave (Lost Old Man Starting Cave)",
903 "House",
904 "House (Old Woman (Sahasrahla's Wife?))",
905 "House (Angry Brothers)",
906 "House (Angry Brothers)",
907 "Empty Clone ",
908 "Empty Clone ",
909 "Cave",
910 "Cave",
911 "Cave",
912 "Cave",
913 "Empty Clone ",
914 "Cave",
915 "Cave",
916 "Cave",
917
918 "Chest Minigame",
919 "Houses",
920 "Sick Boy house",
921 "Tavern",
922 "Link's House",
923 "Sarashrala Hut",
924 "Chest Minigame",
925 "Library",
926 "Chicken House",
927 "Witch Shop",
928 "A Aginah's Cave",
929 "Dam",
930 "Mimic Cave",
931 "Mire Shed",
932 "Cave",
933 "Shop",
934 "Shop",
935 "Archery Minigame",
936 "DW Church/Shop",
937 "Grave Cave",
938 "Fairy Fountain",
939 "Fairy Upgrade",
940 "Pyramid Fairy",
941 "Spike Cave",
942 "Chest Minigame",
943 "Blind Hut",
944 "Bonzai Cave",
945 "Circle of bush Cave",
946 "Big Bomb Shop, C-House",
947 "Blind Hut 2",
948 "Hype Cave",
949 "Shop",
950 "Ice Cave",
951 "Smith",
952 "Fortune Teller",
953 "MiniMoldorm Cave",
954 "Under Rock Caves",
955 "Smith",
956 "Cave",
957 "Mazeblock Cave",
958 "Smith Peg Cave"};
959
960// RoomTag names defined in room.cc to avoid static initialization order issues
961extern const std::string RoomTag[65];
962
963} // namespace zelda3
964} // namespace yaze
965
966#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:24
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.
void SetBlockset(uint8_t blockset)
Definition room.h:409
bool composite_dirty_
Definition room.h:576
bool ValidateObject(const RoomObject &object) const
Definition room.cc:1558
const std::array< uint8_t, 0x10000 > & get_gfx_buffer() const
Definition room.h:537
destination pits_
Definition room.h:634
std::vector< RoomObject > tile_objects_
Definition room.h:618
uint8_t cached_blockset_
Definition room.h:585
void SetSpriteset(uint8_t spriteset)
Definition room.h:415
EffectKey effect_
Definition room.h:629
gfx::BackgroundBuffer object_bg1_buffer_
Definition room.h:571
uint8_t palette_
Definition room.h:610
void SetTag2Direct(TagKey tag2)
Definition room.h:465
uint8_t cached_layout_
Definition room.h:588
uint8_t staircase_plane_[4]
Definition room.h:604
absl::Status UpdateObject(size_t index, const RoomObject &object)
Definition room.cc:1533
TagKey cached_tag2_
Definition room.h:593
void AddTileObject(const RoomObject &object)
Definition room.h:353
void MarkLayoutDirty()
Definition room.h:376
void SetStair4Target(uint8_t target)
Definition room.h:475
void SetPitsTarget(uint8_t target)
Definition room.h:471
void SetIsLight(bool is_light)
Definition room.h:402
void LoadChests()
Definition room.cc:1666
void SetMessageId(uint16_t message_id)
Definition room.h:450
void MarkObjectsDirty()
Definition room.h:366
gfx::BackgroundBuffer bg2_buffer_
Definition room.h:570
void ClearTileObjects()
Definition room.h:352
const std::vector< chest_data > & GetChests() const
Definition room.h:250
uint8_t cached_floor2_graphics_
Definition room.h:590
std::vector< zelda3::Sprite > sprites_
Definition room.h:620
auto mutable_rom()
Definition room.h:528
GameData * game_data_
Definition room.h:563
void SetLoaded(bool loaded)
Definition room.h:479
void CopyRoomGraphicsToBuffer()
Definition room.cc:421
destination stair2_
Definition room.h:636
uint8_t cached_palette_
Definition room.h:587
std::vector< staircase > & GetStairs()
Definition room.h:255
zelda3_version_pointers version_constants() const
Definition room.h:534
void LoadRoomGraphics(uint8_t entrance_blockset=0xFF)
Definition room.cc:370
void set_floor2(uint8_t value)
Definition room.h:508
uint8_t cached_effect_
Definition room.h:591
std::vector< Door > doors_
Definition room.h:623
auto game_data()
Definition room.h:530
bool graphics_dirty_
Definition room.h:596
void SetStaircaseRoom(int index, uint8_t room)
Definition room.h:444
uint8_t layer2_behavior_
Definition room.h:609
const gfx::Bitmap & composite_bitmap() const
Definition room.h:553
absl::Status RemoveObject(size_t index)
Definition room.cc:1522
void SetStair1TargetLayer(uint8_t layer)
Definition room.h:467
void set_floor1(uint8_t value)
Definition room.h:502
void MarkGraphicsDirty()
Definition room.h:371
void LoadBlocks()
Definition room.cc:1784
bool layout_dirty_
Definition room.h:598
void SetLayer2Mode(uint8_t mode)
Definition room.h:457
RoomLayout layout_
Definition room.h:625
uint8_t layer2_mode_
Definition room.h:613
void LoadLayoutTilesToBuffer()
Definition room.cc:810
auto & mutable_blocks()
Definition room.h:526
void SetTag2(TagKey tag2)
Definition room.h:433
const std::vector< Door > & GetDoors() const
Definition room.h:326
uint8_t holewarp
Definition room.h:494
bool IsLoaded() const
Definition room.h:478
auto & object_bg2_buffer()
Definition room.h:548
void ParseObjectsFromLocation(int objects_location)
Definition room.cc:1193
uint8_t cached_floor1_graphics_
Definition room.h:589
const auto & object_bg1_buffer() const
Definition room.h:547
void ReloadGraphics(uint8_t entrance_blockset=0xFF)
std::vector< zelda3::Sprite > & GetSprites()
Definition room.h:247
void SetTag1Direct(TagKey tag1)
Definition room.h:464
void LoadTorches()
Definition room.cc:1706
bool IsCompositeDirty() const
Definition room.h:557
std::vector< Door > & GetDoors()
Definition room.h:327
void SetPaletteDirect(uint8_t palette)
Definition room.h:460
TagKey tag2() const
Definition room.h:484
destination stair4_
Definition room.h:638
void SetStair2Target(uint8_t target)
Definition room.h:473
size_t GetTileObjectCount() const
Definition room.h:387
const auto & object_bg2_buffer() const
Definition room.h:549
uint8_t floor2() const
Definition room.h:501
int animated_frame_
Definition room.h:602
void SetCollision(CollisionKey collision)
Definition room.h:401
uint8_t blockset
Definition room.h:490
const std::vector< staircase > & GetStairs() const
Definition room.h:254
gfx::BackgroundBuffer bg1_buffer_
Definition room.h:569
absl::Status SaveObjects()
Definition room.cc:1376
RoomObject & GetTileObject(size_t index)
Definition room.h:388
void SetStaircasePlane(int index, uint8_t plane)
Definition room.h:439
void SetIsDark(bool is_dark)
Definition room.h:459
bool objects_dirty_
Definition room.h:597
uint8_t layout
Definition room.h:493
void RenderRoomGraphics()
Definition room.cc:518
bool textures_dirty_
Definition room.h:599
gfx::Bitmap composite_bitmap_
Definition room.h:575
Room & operator=(Room &&)
uint8_t sprite_tileset_
Definition room.h:608
std::vector< RoomObject > & GetTileObjects()
Definition room.h:349
uint16_t message_id_
Definition room.h:497
TagKey tag1() const
Definition room.h:483
std::vector< PotItem > & GetPotItems()
Definition room.h:341
CollisionKey collision() const
Definition room.h:485
const RoomLayout & GetLayout() const
Definition room.h:343
void AddDoor(const Door &door)
Definition room.h:328
uint8_t staircase_rooms_[4]
Definition room.h:605
const auto & bg1_buffer() const
Definition room.h:544
gfx::Bitmap & GetCompositeBitmap(RoomLayerManager &layer_mgr)
Get a composite bitmap of all layers merged.
Definition room.cc:510
std::vector< uint8_t > EncodeObjects() const
Definition room.cc:1289
void SetEffect(EffectKey effect)
Definition room.h:421
gfx::BackgroundBuffer object_bg2_buffer_
Definition room.h:572
Room & operator=(const Room &)=delete
std::array< uint8_t, 16 > blocks_
Definition room.h:615
void SetTag1(TagKey tag1)
Definition room.h:427
void SetBackgroundTileset(uint8_t tileset)
Definition room.h:461
void SetStair3TargetLayer(uint8_t layer)
Definition room.h:469
const std::vector< zelda3::Sprite > & GetSprites() const
Definition room.h:246
uint8_t floor2_graphics_
Definition room.h:612
background2 bg2_
Definition room.h:633
std::array< chest, 16 > chest_list_
Definition room.h:616
auto & bg1_buffer()
Definition room.h:542
const std::vector< RoomObject > & GetTileObjects() const
Definition room.h:346
bool IsLight() const
Definition room.h:453
uint8_t floor1_graphics_
Definition room.h:611
DungeonState * GetDungeonState()
Definition room.h:559
void SetMessageIdDirect(uint16_t message_id)
Definition room.h:456
const LayerMergeType & layer_merging() const
Definition room.h:486
absl::Status SaveSprites()
Definition room.cc:1430
auto blocks() const
Definition room.h:525
void SetLayerMerging(LayerMergeType merging)
Definition room.h:458
void SetPitsTargetLayer(uint8_t layer)
Definition room.h:466
void LoadObjects()
Definition room.cc:1140
uint8_t spriteset
Definition room.h:491
void LoadPotItems()
Definition room.cc:1853
EffectKey effect() const
Definition room.h:482
void SetSpriteTileset(uint8_t tileset)
Definition room.h:462
void SetStair1Target(uint8_t target)
Definition room.h:472
destination stair3_
Definition room.h:637
void SetBg2(background2 bg2)
Definition room.h:400
std::vector< chest_data > & GetChests()
Definition room.h:251
uint8_t floor1() const
Definition room.h:500
uint8_t palette
Definition room.h:492
void SetTileObjects(const std::vector< RoomObject > &objects)
Definition room.h:394
void MarkCompositeDirty()
Mark composite bitmap as needing regeneration.
Definition room.h:556
std::unique_ptr< DungeonState > dungeon_state_
Definition room.h:640
void LoadAnimatedGraphics()
Definition room.cc:1071
std::vector< uint8_t > EncodeSprites() const
Definition room.cc:1346
std::vector< chest_data > chests_in_room_
Definition room.h:622
LayerMergeType layer_merging_
Definition room.h:627
const RoomObject & GetTileObject(size_t index) const
Definition room.h:389
uint8_t cached_spriteset_
Definition room.h:586
std::array< uint8_t, 0x10000 > current_gfx16_
Definition room.h:565
std::vector< staircase > z3_staircases_
Definition room.h:621
void SetPalette(uint8_t palette)
Definition room.h:403
std::vector< PotItem > pot_items_
Definition room.h:624
void LoadSprites()
Definition room.cc:1617
TagKey cached_tag1_
Definition room.h:592
void SetHolewarp(uint8_t holewarp)
Definition room.h:443
destination stair1_
Definition room.h:635
uint8_t background_tileset_
Definition room.h:607
void SetStair3Target(uint8_t target)
Definition room.h:474
void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY, int &nbr_of_staircase)
Definition room.cc:1580
void SetStair4TargetLayer(uint8_t layer)
Definition room.h:470
absl::Status AddObject(const RoomObject &object)
Definition room.cc:1509
absl::StatusOr< size_t > FindObjectAt(int x, int y, int layer) const
Definition room.cc:1548
void RemoveTileObject(size_t index)
Definition room.h:381
const std::vector< PotItem > & GetPotItems() const
Definition room.h:340
void SetRom(Rom *rom)
Definition room.h:529
void RemoveDoor(size_t index)
Definition room.h:332
void SetStair2TargetLayer(uint8_t layer)
Definition room.h:468
Room(const Room &)=delete
const auto & bg2_buffer() const
Definition room.h:545
void RenderObjectsToBackground()
Definition room.cc:893
CollisionKey collision_
Definition room.h:628
void SetGameData(GameData *data)
Definition room.h:531
auto & object_bg1_buffer()
Definition room.h:546
auto & bg2_buffer()
Definition room.h:543
void SetLayer2Behavior(uint8_t behavior)
Definition room.h:463
int id() const
Definition room.h:488
zelda3_bg2_effect
Background layer 2 effects.
Definition zelda.h:369
constexpr int kBlocksPointer4
constexpr int kRoomObjectLayoutPointer
constexpr int kDoorPosUp
constexpr int kDoorPointers
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:40
constexpr DoorDimensions GetDoorDimensions(DoorDirection dir)
Get door dimensions based on direction.
Definition door_types.h:192
constexpr int room_object_layout_pointer
Definition room.h:33
DoorType
Door types from ALTTP.
Definition door_types.h:33
constexpr int kDoorGfxDown
constexpr int chests_length_pointer
Definition room.h:41
constexpr int kSpritesEndData
constexpr int kTorchesLengthPointer
Room LoadRoomHeaderFromRom(Rom *rom, int room_id)
Definition room.cc:206
constexpr int door_pos_down
Definition room.h:64
constexpr int door_gfx_up
Definition room.h:58
constexpr int chests_data_pointer1
Definition room.h:42
constexpr int pit_count
Definition room.h:56
constexpr int blocks_pointer3
Definition room.h:47
constexpr int door_gfx_left
Definition room.h:61
constexpr int kChestsLengthPointer
constexpr int dungeons_palettes
Definition room.h:37
constexpr int blocks_pointer4
Definition room.h:48
@ Ganon_Room
Definition room.h:130
@ Moving_Floor
Definition room.h:125
@ Effect_Nothing
Definition room.h:123
@ Red_Flashes
Definition room.h:128
@ Moving_Water
Definition room.h:126
@ Torch_Show_Floor
Definition room.h:129
constexpr int sprites_data_empty_room
Definition room.h:53
constexpr int kMessagesIdDungeon
constexpr int door_pos_left
Definition room.h:65
constexpr int NumberOfRooms
Definition room.h:70
constexpr int rooms_sprite_pointer
Definition room.h:39
constexpr int kDungeonsMainBgPalettePointers
RoomSize CalculateRoomSize(Rom *rom, int room_id)
Definition room.cc:107
constexpr int kSpriteBlocksetPointer
constexpr int kPitPointer
constexpr int kSpritesData
@ Kill_boss_Again
Definition room.h:213
@ Secret_Wall_Right
Definition room.h:178
@ Kill_Enemy_to_clear_level
Definition room.h:187
@ NE_Kill_Enemy_to_Open
Definition room.h:152
@ S_Kill_Enemy_for_Chest
Definition room.h:198
@ N_Push_Block_to_Open
Definition room.h:167
@ E_Kill_Enemy_to_Open
Definition room.h:156
@ Light_Torches_to_Open
Definition room.h:201
@ N_Kill_Enemy_to_Open
Definition room.h:157
@ W_Kill_Enemy_for_Chest
Definition room.h:195
@ Water_Twin
Definition room.h:177
@ N_Kill_Enemy_for_Chest
Definition room.h:197
@ Clear_Level_to_Open
Definition room.h:171
@ Push_Block_to_Open
Definition room.h:169
@ E_Kill_Enemy_for_Chest
Definition room.h:196
@ Secret_Wall_Left
Definition room.h:179
@ NE_Push_Block_to_Open
Definition room.h:162
@ Open_Chest_for_Holes_8
Definition room.h:209
@ S_Kill_Enemy_to_Open
Definition room.h:158
@ S_Push_Block_to_Open
Definition room.h:168
@ Trigger_activated_Chest
Definition room.h:189
@ SW_Kill_Enemy_for_Chest
Definition room.h:193
@ SE_Kill_Enemy_for_Chest
Definition room.h:194
@ Pull_lever_to_Bomb_Wall
Definition room.h:190
@ Pull_Switch_to_bomb_Wall
Definition room.h:182
@ Agahnim_Room
Definition room.h:206
@ Water_Gate
Definition room.h:176
@ SE_Kill_Enemy_to_Move_Block
Definition room.h:188
@ NE_Kill_Enemy_for_Chest
Definition room.h:192
@ SE_Push_Block_to_Open
Definition room.h:164
@ Pull_Lever_to_Open
Definition room.h:170
@ W_Push_Block_to_Open
Definition room.h:165
@ E_Push_Block_to_Open
Definition room.h:166
@ Kill_to_open_Ganon_Door
Definition room.h:211
@ SW_Push_Block_to_Open
Definition room.h:163
@ Turn_on_Water
Definition room.h:175
@ W_Kill_Enemy_to_Open
Definition room.h:155
@ Open_Chest_Activate_Holes_0
Definition room.h:184
@ Clear_Room_for_Chest
Definition room.h:200
@ Clear_Room_to_Open
Definition room.h:160
@ NW_Push_Block_to_Open
Definition room.h:161
@ Switch_Open_Door_Toggle
Definition room.h:173
@ SW_Kill_Enemy_to_Open
Definition room.h:153
@ Clear_Quadrant_for_Chest
Definition room.h:199
@ NW_Kill_Enemy_to_Open
Definition room.h:151
@ Switch_Open_Door_Hold
Definition room.h:172
@ SE_Kill_Enemy_to_Open
Definition room.h:154
@ Turn_off_Water
Definition room.h:174
@ Clear_Quadrant_to_Open
Definition room.h:159
@ Push_Block_for_Chest
Definition room.h:210
@ NW_Kill_Enemy_for_Chest
Definition room.h:191
@ Light_Torches_to_get_Chest
Definition room.h:212
constexpr int messages_id_dungeon
Definition room.h:43
constexpr int room_items_pointers
Definition room.h:38
constexpr int blocks_length
Definition room.h:44
constexpr int kDoorPosLeft
constexpr int sprites_data
Definition room.h:52
constexpr int kTileAddress
constexpr int kPitCount
constexpr std::string_view GetDoorDirectionName(DoorDirection dir)
Get human-readable name for door direction.
Definition door_types.h:161
constexpr int kRoomsSpritePointer
constexpr int sprite_blockset_pointer
Definition room.h:51
constexpr int kTileAddressFloor
constexpr int kDoorPosDown
constexpr int tile_address_floor
Definition room.h:69
constexpr int blocks_pointer2
Definition room.h:46
constexpr int dungeons_main_bg_palette_pointers
Definition room.h:35
constexpr int door_gfx_down
Definition room.h:59
constexpr int kChestsDataPointer1
constexpr int kBlocksLength
constexpr int kBlocksPointer1
constexpr int kRoomItemsPointers
constexpr int kDoorGfxLeft
constexpr int kDoorGfxCaveExitDown
constexpr uint16_t stairsObjects[]
Definition room.h:71
Room LoadRoomFromRom(Rom *rom, int room_id)
Definition room.cc:177
constexpr int gfx_groups_pointer
Definition room.h:40
constexpr DoorType DoorTypeFromRaw(uint8_t raw_type)
Convert raw type byte to DoorType enum.
Definition door_types.h:208
constexpr int blocks_pointer1
Definition room.h:45
constexpr int torches_length_pointer
Definition room.h:50
constexpr std::array< std::string_view, 297 > kRoomNames
Definition room.h:660
constexpr int kDungeonSpritePointers
constexpr std::string_view GetDoorTypeName(DoorType type)
Get human-readable name for door type.
Definition door_types.h:106
constexpr int doorPointers
Definition room.h:57
constexpr int kNumberOfRooms
constexpr int kDoorPosRight
constexpr int door_gfx_cavexit_down
Definition room.h:60
const std::string RoomEffect[8]
Definition room.cc:28
constexpr int kBlocksPointer3
constexpr int torch_data
Definition room.h:49
constexpr int kGfxGroupsPointer
constexpr int kDungeonsPalettes
constexpr int kDoorGfxUp
constexpr int door_gfx_right
Definition room.h:62
constexpr int kTorchData
DoorDirection
Door direction on room walls.
Definition door_types.h:18
constexpr int room_object_pointer
Definition room.h:34
constexpr int door_pos_up
Definition room.h:63
constexpr int kDoorGfxRight
constexpr int door_pos_right
Definition room.h:66
constexpr int tile_address
Definition room.h:68
constexpr int sprites_end_data
Definition room.h:54
constexpr int pit_pointer
Definition room.h:55
constexpr int kSpritesDataEmptyRoom
constexpr int kBlocksPointer2
@ Moving_Water_Collision
Definition room.h:119
@ One_Collision
Definition room.h:115
@ Moving_Floor_Collision
Definition room.h:118
@ Both_With_Scroll
Definition room.h:117
constexpr int kRoomObjectPointer
constexpr int dungeon_spr_ptrs
Definition room.h:67
Room transition destination.
Definition zelda.h:448
uint8_t target_layer
Definition zelda.h:451
uint8_t target
Definition zelda.h:450
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:83
int GetPixelX() const
Definition room.h:141
int GetPixelY() const
Definition room.h:142
int GetTileY() const
Definition room.h:146
int GetTileX() const
Definition room.h:145
uint16_t position
Definition room.h:136
int64_t room_size_pointer
Definition room.h:650
Represents a door in a dungeon room.
Definition room.h:263
std::tuple< int, int, int, int > GetBounds() const
Get bounding rectangle (x, y, width, height in pixels)
Definition room.h:287
std::string_view GetTypeName() const
Get human-readable type name.
Definition room.h:292
uint8_t byte1
Original ROM byte 1 (position data)
Definition room.h:268
DoorDimensions GetDimensions() const
Get door dimensions in tiles.
Definition room.h:282
DoorType type
Door type (determines appearance/behavior)
Definition room.h:265
static Door FromRomBytes(uint8_t b1, uint8_t b2)
Definition room.h:310
std::pair< uint8_t, uint8_t > EncodeBytes() const
Encode door data for ROM storage.
Definition room.h:302
DoorDirection direction
Which wall the door is on.
Definition room.h:266
uint8_t position
Encoded position (5-bit, 0-31)
Definition room.h:264
std::string_view GetDirectionName() const
Get human-readable direction name.
Definition room.h:297
std::pair< int, int > GetPixelCoords() const
Get pixel coordinates for this door.
Definition room.h:277
uint8_t byte2
Original ROM byte 2 (type + direction)
Definition room.h:269
std::pair< int, int > GetTileCoords() const
Get tile coordinates for this door.
Definition room.h:272
ROM data pointers for different game versions.
Definition zelda.h:71
Yet Another Zelda3 Editor (YAZE) - Public C API.