1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_H
61constexpr uint16_t
stairsObjects[] = {0x139, 0x138, 0x13B, 0x12E, 0x12D};
73 LayerMergeType(uint8_t
id, std::string name,
bool see,
bool top,
bool trans) {
82const static LayerMergeType LayerMerge00{0x00,
"Off",
true,
false,
false};
83const static LayerMergeType LayerMerge01{0x01,
"Parallax",
true,
false,
false};
84const static LayerMergeType LayerMerge02{0x02,
"Dark",
true,
true,
true};
85const static LayerMergeType LayerMerge03{0x03,
"On top",
true,
true,
false};
86const static LayerMergeType LayerMerge04{0x04,
"Translucent",
true,
true,
true};
87const static LayerMergeType LayerMerge05{0x05,
"Addition",
true,
true,
true};
88const static LayerMergeType LayerMerge06{0x06,
"Normal",
true,
false,
false};
89const static LayerMergeType LayerMerge07{0x07,
"Transparent",
true,
true,
true};
90const static LayerMergeType LayerMerge08{0x08,
"Dark room",
true,
true,
true};
92const static LayerMergeType kLayerMergeTypeList[] = {
93 LayerMerge00, LayerMerge01, LayerMerge02, LayerMerge03, LayerMerge04,
94 LayerMerge05, LayerMerge06, LayerMerge07, LayerMerge08};
236 absl::StatusOr<size_t>
FindObjectAt(
int x,
int y,
int layer)
const;
266 if (this->palette !=
palette) {
376 int& nbr_of_staircase);
475static const std::string RoomEffect[] = {
"Nothing",
481 "Light Torch to See Floor",
486 "Hyrule Castle (North Corridor)",
487 "Behind Sanctuary (Switch)",
489 "Turtle Rock (Crysta-Roller)",
491 "Swamp Palace (Arrghus[Boss])",
492 "Tower of Hera (Moldorm[Boss])",
493 "Cave (Healing Fairy)",
494 "Palace of Darkness",
495 "Palace of Darkness (Stalfos Trap)",
496 "Palace of Darkness (Turtle)",
497 "Ganon's Tower (Entrance)",
498 "Ganon's Tower (Agahnim2[Boss])",
499 "Ice Palace (Entrance )",
501 "Ganon Evacuation Route",
502 "Hyrule Castle (Bombable Stock )",
504 "Turtle Rock (Hokku-Bokku Key 2)",
505 "Turtle Rock (Big Key )",
507 "Swamp Palace (Swimming Treadmill)",
508 "Tower of Hera (Moldorm Fall )",
510 "Palace of Darkness (Dark Maze)",
511 "Palace of Darkness (Big Chest )",
512 "Palace of Darkness (Mimics / Moving Wall )",
513 "Ganon's Tower (Ice Armos)",
514 "Ganon's Tower (Final Hallway)",
515 "Ice Palace (Bomb Floor / Bari )",
516 "Ice Palace (Pengator / Big Key )",
517 "Agahnim's Tower (Agahnim[Boss])",
518 "Hyrule Castle (Key-rat )",
519 "Hyrule Castle (Sewer Text Trigger )",
520 "Turtle Rock (West Exit to Balcony)",
521 "Turtle Rock (Double Hokku-Bokku / Big chest )",
523 "Swamp Palace (Statue )",
524 "Tower of Hera (Big Chest)",
525 "Swamp Palace (Entrance )",
526 "Skull Woods (Mothula[Boss])",
527 "Palace of Darkness (Big Hub )",
528 "Palace of Darkness (Map Chest / Fairy )",
531 "Ice Palace (Compass )",
532 "Cave (Kakariko Well HP)",
533 "Agahnim's Tower (Maiden Sacrifice Chamber)",
534 "Tower of Hera (Hardhat Beetles )",
535 "Hyrule Castle (Sewer Key Chest )",
536 "Desert Palace (Lanmolas[Boss])",
537 "Swamp Palace (Push Block Puzzle / Pre-Big Key )",
538 "Swamp Palace (Big Key / BS )",
539 "Swamp Palace (Big Chest )",
540 "Swamp Palace (Map Chest / Water Fill )",
541 "Swamp Palace (Key Pot )",
542 "Skull Woods (Gibdo Key / Mothula Hole )",
543 "Palace of Darkness (Bombable Floor )",
544 "Palace of Darkness (Spike Block / Conveyor )",
546 "Ganon's Tower (Torch 2)",
547 "Ice Palace (Stalfos Knights / Conveyor Hellway)",
548 "Ice Palace (Map Chest )",
549 "Agahnim's Tower (Final Bridge )",
550 "Hyrule Castle (First Dark )",
551 "Hyrule Castle (6 Ropes )",
552 "Desert Palace (Torch Puzzle / Moving Wall )",
553 "Thieves Town (Big Chest )",
554 "Thieves Town (Jail Cells )",
555 "Swamp Palace (Compass Chest )",
558 "Skull Woods (Gibdo Torch Puzzle )",
559 "Palace of Darkness (Entrance )",
560 "Palace of Darkness (Warps / South Mimics )",
561 "Ganon's Tower (Mini-Helmasaur Conveyor )",
562 "Ganon's Tower (Moldorm )",
563 "Ice Palace (Bomb-Jump )",
564 "Ice Palace Clone (Fairy )",
565 "Hyrule Castle (West Corridor)",
566 "Hyrule Castle (Throne )",
567 "Hyrule Castle (East Corridor)",
568 "Desert Palace (Popos 2 / Beamos Hellway )",
569 "Swamp Palace (Upstairs Pits )",
570 "Castle Secret Entrance / Uncle Death ",
571 "Skull Woods (Key Pot / Trap )",
572 "Skull Woods (Big Key )",
573 "Skull Woods (Big Chest )",
574 "Skull Woods (Final Section Entrance )",
575 "Palace of Darkness (Helmasaur King[Boss])",
576 "Ganon's Tower (Spike Pit )",
577 "Ganon's Tower (Ganon-Ball Z)",
578 "Ganon's Tower (Gauntlet 1/2/3)",
579 "Ice Palace (Lonely Firebar)",
580 "Ice Palace (Hidden Chest / Spike Floor )",
581 "Hyrule Castle (West Entrance )",
582 "Hyrule Castle (Main Entrance )",
583 "Hyrule Castle (East Entrance )",
584 "Desert Palace (Final Section Entrance )",
585 "Thieves Town (West Attic )",
586 "Thieves Town (East Attic )",
587 "Swamp Palace (Hidden Chest / Hidden Door )",
588 "Skull Woods (Compass Chest )",
589 "Skull Woods (Key Chest / Trap )",
591 "Palace of Darkness (Rupee )",
592 "Ganon's Tower (Mimics s)",
593 "Ganon's Tower (Lanmolas )",
594 "Ganon's Tower (Gauntlet 4/5)",
595 "Ice Palace (Pengators )",
597 "Hyrule Castle (Small Corridor to Jail Cells)",
598 "Hyrule Castle (Boomerang Chest )",
599 "Hyrule Castle (Map Chest )",
600 "Desert Palace (Big Chest )",
601 "Desert Palace (Map Chest )",
602 "Desert Palace (Big Key Chest )",
603 "Swamp Palace (Water Drain )",
604 "Tower of Hera (Entrance )",
609 "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall )",
610 "Ganon's Tower (Winder / Warp Maze )",
611 "Ice Palace (Hidden Chest / Bombable Floor )",
612 "Ice Palace ( Big Spike Traps )",
613 "Hyrule Castle (Jail Cell )",
615 "Hyrule Castle (Basement Chasm )",
616 "Desert Palace (West Entrance )",
617 "Desert Palace (Main Entrance )",
618 "Desert Palace (East Entrance )",
620 "Tower of Hera (Tile )",
622 "Eastern Palace (Fairy )",
624 "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest )",
625 "Ganon's Tower (East and West Downstairs / Big Chest )",
626 "Ganon's Tower (Tile / Torch Puzzle )",
629 "Misery Mire (Vitreous[Boss])",
630 "Misery Mire (Final Switch )",
631 "Misery Mire (Dark Bomb Wall / Switches )",
632 "Misery Mire (Dark Cane Floor Switch Puzzle )",
634 "Ganon's Tower (Final Collapsing Bridge )",
635 "Ganon's Tower (Torches 1 )",
636 "Misery Mire (Torch Puzzle / Moving Wall )",
637 "Misery Mire (Entrance )",
638 "Eastern Palace (Eyegore Key )",
640 "Ganon's Tower (Many Spikes / Warp Maze )",
641 "Ganon's Tower (Invisible Floor Maze )",
642 "Ganon's Tower (Compass Chest / Invisible Floor )",
643 "Ice Palace (Big Chest )",
645 "Misery Mire (Pre-Vitreous )",
646 "Misery Mire (Fish )",
647 "Misery Mire (Bridge Key Chest )",
649 "Turtle Rock (Trinexx[Boss])",
650 "Ganon's Tower (Wizzrobes s)",
651 "Ganon's Tower (Moldorm Fall )",
652 "Tower of Hera (Fairy )",
653 "Eastern Palace (Stalfos Spawn )",
654 "Eastern Palace (Big Chest )",
655 "Eastern Palace (Map Chest )",
656 "Thieves Town (Moving Spikes / Key Pot )",
657 "Thieves Town (Blind The Thief[Boss])",
660 "Ice Palace (Ice Bridge )",
661 "Agahnim's Tower (Circle of Pots)",
662 "Misery Mire (Hourglass )",
663 "Misery Mire (Slug )",
664 "Misery Mire (Spike Key Chest )",
665 "Turtle Rock (Pre-Trinexx )",
666 "Turtle Rock (Dark Maze)",
667 "Turtle Rock (Chain Chomps )",
668 "Turtle Rock (Map Chest / Key Chest / Roller )",
669 "Eastern Palace (Big Key )",
670 "Eastern Palace (Lobby Cannonballs )",
671 "Eastern Palace (Dark Antifairy / Key Pot )",
672 "Thieves Town (Hellway)",
673 "Thieves Town (Conveyor Toilet)",
675 "Ice Palace (Block Puzzle )",
676 "Ice Palace Clone (Switch )",
677 "Agahnim's Tower (Dark Bridge )",
678 "Misery Mire (Compass Chest / Tile )",
679 "Misery Mire (Big Hub )",
680 "Misery Mire (Big Chest )",
681 "Turtle Rock (Final Crystal Switch Puzzle )",
682 "Turtle Rock (Laser Bridge)",
684 "Turtle Rock (Torch Puzzle)",
685 "Eastern Palace (Armos Knights[Boss])",
686 "Eastern Palace (Entrance )",
688 "Thieves Town (North West Entrance )",
689 "Thieves Town (North East Entrance )",
691 "Ice Palace (Hole to Kholdstare )",
693 "Agahnim's Tower (Dark Maze)",
694 "Misery Mire (Conveyor Slug / Big Key )",
695 "Misery Mire (Mire02 / Wizzrobes )",
698 "Turtle Rock (Laser Key )",
699 "Turtle Rock (Entrance )",
701 "Eastern Palace (Zeldagamer / Pre-Armos Knights )",
702 "Eastern Palace (Canonball ",
704 "Thieves Town (Main (South West) Entrance )",
705 "Thieves Town (South East Entrance )",
707 "Ice Palace (Kholdstare[Boss])",
709 "Agahnim's Tower (Entrance )",
710 "Cave (Lost Woods HP)",
711 "Cave (Lumberjack's Tree HP)",
713 "Cave (Lost Old Man Final Cave)",
714 "Cave (Lost Old Man Final Cave)",
719 "Cave (Spectacle Rock HP)",
723 "Cave (Spiral Cave)",
724 "Cave (Crystal Switch / 5 Chests )",
725 "Cave (Lost Old Man Starting Cave)",
726 "Cave (Lost Old Man Starting Cave)",
728 "House (Old Woman (Sahasrahla's Wife?))",
729 "House (Angry Brothers)",
730 "House (Angry Brothers)",
769 "Circle of bush Cave",
770 "Big Bomb Shop, C-House",
784static const std::string RoomTag[] = {
"Nothing",
785 "NW Kill Enemy to Open",
786 "NE Kill Enemy to Open",
787 "SW Kill Enemy to Open",
788 "SE Kill Enemy to Open",
789 "W Kill Enemy to Open",
790 "E Kill Enemy to Open",
791 "N Kill Enemy to Open",
792 "S Kill Enemy to Open",
793 "Clear Quadrant to Open",
794 "Clear Full Tile to Open",
796 "NW Push Block to Open",
797 "NE Push Block to Open",
798 "SW Push Block to Open",
799 "SE Push Block to Open",
800 "W Push Block to Open",
801 "E Push Block to Open",
802 "N Push Block to Open",
803 "S Push Block to Open",
804 "Push Block to Open",
805 "Pull Lever to Open",
806 "Collect Prize to Open",
808 "Hold Switch Open Door",
809 "Toggle Switch to Open Door",
818 "Push Switch Exploding Wall",
820 "Open Chest (Holes 0)",
823 "Defeat Boss for Dungeon Prize",
825 "SE Kill Enemy to Push Block",
826 "Trigger Switch Chest",
827 "Pull Lever Exploding Wall",
828 "NW Kill Enemy for Chest",
829 "NE Kill Enemy for Chest",
830 "SW Kill Enemy for Chest",
831 "SE Kill Enemy for Chest",
832 "W Kill Enemy for Chest",
833 "E Kill Enemy for Chest",
834 "N Kill Enemy for Chest",
835 "S Kill Enemy for Chest",
836 "Clear Quadrant for Chest",
837 "Clear Full Tile for Chest",
839 "Light Torches to Open",
847 "Open Chest for Holes 8",
848 "Push Block for Chest",
849 "Clear Room for Triforce Door",
850 "Light Torches for Chest",
The Rom class is used to load, save, and modify Rom data.
void SetBlockset(uint8_t blockset)
Room(int room_id, Rom *rom)
bool ValidateObject(const RoomObject &object) const
std::vector< RoomObject > tile_objects_
void SetSpriteset(uint8_t spriteset)
void SetTag2Direct(TagKey tag2)
uint8_t staircase_plane_[4]
absl::Status UpdateObject(size_t index, const RoomObject &object)
void AddTileObject(const RoomObject &object)
void SetStair4Target(uint8_t target)
void SetPitsTarget(uint8_t target)
void SetIsLight(bool is_light)
void SetMessageId(uint16_t message_id)
gfx::BackgroundBuffer bg2_buffer_
const std::vector< chest_data > & GetChests() const
uint8_t cached_floor2_graphics_
std::vector< zelda3::Sprite > sprites_
void SetLoaded(bool loaded)
std::array< uint8_t, 0x4000 > current_gfx16_
void CopyRoomGraphicsToBuffer()
std::vector< staircase > & GetStairs()
void LoadRoomGraphics(uint8_t entrance_blockset=0xFF)
void set_floor2(uint8_t value)
void SetStaircaseRoom(int index, uint8_t room)
absl::Status RemoveObject(size_t index)
void SetStair1TargetLayer(uint8_t layer)
void set_floor1(uint8_t value)
void SetLayer2Mode(uint8_t mode)
void LoadLayoutTilesToBuffer()
void SetTag2(TagKey tag2)
void ParseObjectsFromLocation(int objects_location)
uint8_t cached_floor1_graphics_
std::vector< zelda3::Sprite > & GetSprites()
void SetTag1Direct(TagKey tag1)
void SetPaletteDirect(uint8_t palette)
void SetStair2Target(uint8_t target)
size_t GetTileObjectCount() const
void SetCollision(CollisionKey collision)
const std::vector< staircase > & GetStairs() const
gfx::BackgroundBuffer bg1_buffer_
absl::Status SaveObjects()
RoomObject & GetTileObject(size_t index)
void SetStaircasePlane(int index, uint8_t plane)
void SetIsDark(bool is_dark)
void RenderRoomGraphics()
std::vector< RoomObject > & GetTileObjects()
CollisionKey collision() const
const RoomLayout & GetLayout() const
uint8_t staircase_rooms_[4]
const auto & bg1_buffer() const
std::vector< uint8_t > EncodeObjects() const
void SetEffect(EffectKey effect)
std::array< uint8_t, 16 > blocks_
void SetTag1(TagKey tag1)
void SetBackgroundTileset(uint8_t tileset)
void SetStair3TargetLayer(uint8_t layer)
const std::vector< zelda3::Sprite > & GetSprites() const
std::array< chest, 16 > chest_list_
const std::vector< RoomObject > & GetTileObjects() const
void SetMessageIdDirect(uint16_t message_id)
const LayerMergeType & layer_merging() const
void SetLayerMerging(LayerMergeType merging)
void SetPitsTargetLayer(uint8_t layer)
const std::array< uint8_t, 0x4000 > & get_gfx_buffer() const
void SetSpriteTileset(uint8_t tileset)
void SetStair1Target(uint8_t target)
void SetBg2(background2 bg2)
std::vector< chest_data > & GetChests()
void SetTileObjects(const std::vector< RoomObject > &objects)
void LoadAnimatedGraphics()
std::vector< chest_data > chests_in_room_
LayerMergeType layer_merging_
const RoomObject & GetTileObject(size_t index) const
uint8_t cached_spriteset_
std::vector< staircase > z3_staircases_
void SetPalette(uint8_t palette)
void SetHolewarp(uint8_t holewarp)
uint8_t background_tileset_
void SetStair3Target(uint8_t target)
void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY, int &nbr_of_staircase)
void SetStair4TargetLayer(uint8_t layer)
absl::Status AddObject(const RoomObject &object)
absl::StatusOr< size_t > FindObjectAt(int x, int y, int layer) const
void RemoveTileObject(size_t index)
void SetStair2TargetLayer(uint8_t layer)
const auto & bg2_buffer() const
void RenderObjectsToBackground()
void SetLayer2Behavior(uint8_t behavior)
zelda3_bg2_effect
Background layer 2 effects.
constexpr int kBlocksPointer4
constexpr int kRoomObjectLayoutPointer
constexpr int kDoorPointers
constexpr int room_object_layout_pointer
constexpr int kDoorGfxDown
constexpr int chests_length_pointer
constexpr int kSpritesEndData
constexpr int kTorchesLengthPointer
constexpr int door_pos_down
constexpr int door_gfx_up
constexpr int chests_data_pointer1
constexpr int blocks_pointer3
constexpr int door_gfx_left
constexpr int kChestsLengthPointer
constexpr int dungeons_palettes
constexpr int blocks_pointer4
constexpr int sprites_data_empty_room
constexpr int kMessagesIdDungeon
constexpr int door_pos_left
constexpr int NumberOfRooms
constexpr int rooms_sprite_pointer
constexpr int kDungeonsMainBgPalettePointers
RoomSize CalculateRoomSize(Rom *rom, int room_id)
constexpr int kSpriteBlocksetPointer
constexpr int kPitPointer
constexpr int kSpritesData
@ Kill_Enemy_to_clear_level
@ Trigger_activated_Chest
@ SW_Kill_Enemy_for_Chest
@ SE_Kill_Enemy_for_Chest
@ Pull_lever_to_Bomb_Wall
@ Pull_Switch_to_bomb_Wall
@ SE_Kill_Enemy_to_Move_Block
@ NE_Kill_Enemy_for_Chest
@ Kill_to_open_Ganon_Door
@ Open_Chest_Activate_Holes_0
@ Switch_Open_Door_Toggle
@ Clear_Quadrant_for_Chest
@ NW_Kill_Enemy_for_Chest
@ Light_Torches_to_get_Chest
constexpr std::string_view kRoomNames[]
constexpr int messages_id_dungeon
constexpr int room_items_pointers
constexpr int blocks_length
constexpr int kDoorPosLeft
constexpr int sprites_data
constexpr int kTileAddress
constexpr int kRoomsSpritePointer
constexpr int sprite_blockset_pointer
constexpr int kTileAddressFloor
constexpr int kDoorPosDown
constexpr int tile_address_floor
constexpr int blocks_pointer2
constexpr int dungeons_main_bg_palette_pointers
constexpr int door_gfx_down
constexpr int kChestsDataPointer1
constexpr int kBlocksLength
constexpr int kBlocksPointer1
constexpr int kRoomItemsPointers
constexpr int kDoorGfxLeft
constexpr int kDoorGfxCaveExitDown
constexpr uint16_t stairsObjects[]
Room LoadRoomFromRom(Rom *rom, int room_id)
constexpr int gfx_groups_pointer
constexpr int blocks_pointer1
constexpr int torches_length_pointer
constexpr int kDungeonSpritePointers
constexpr int doorPointers
constexpr int kNumberOfRooms
constexpr int kDoorPosRight
constexpr int door_gfx_cavexit_down
constexpr int kBlocksPointer3
constexpr int kGfxGroupsPointer
constexpr int kDungeonsPalettes
constexpr int door_gfx_right
constexpr int room_object_pointer
constexpr int door_pos_up
constexpr int kDoorGfxRight
constexpr int door_pos_right
constexpr int tile_address
constexpr int sprites_end_data
constexpr int pit_pointer
constexpr int kSpritesDataEmptyRoom
constexpr int kBlocksPointer2
constexpr int kRoomObjectPointer
constexpr int dungeon_spr_ptrs
Main namespace for the application.
Room transition destination.
LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans)
int64_t room_size_pointer
Yet Another Zelda3 Editor (YAZE) - Public C API.