1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_H
18#include "absl/status/statusor.h"
19#include "absl/types/span.h"
42class RoomLayerManager;
43struct DungeonStreamLayout;
46 const gfx::SnesPalette& dungeon_palette,
47 const gfx::SnesPalette* hud_palette =
nullptr,
54 const gfx::SnesPalette& dungeon_palette,
55 const gfx::SnesPalette* hud_palette =
nullptr);
61 const gfx::SnesPalette& dungeon_palette,
const GameData* game_data);
69 const Room& room,
const GameData* game_data);
72 std::span<uint16_t> cgram,
const gfx::SnesPalette& dungeon_palette,
73 const gfx::SnesPalette* hud_palette =
nullptr);
102const static LayerMergeType LayerMerge00{0x00,
"Off",
true,
false,
false};
103const static LayerMergeType LayerMerge01{0x01,
"Parallax",
true,
false,
false};
104const static LayerMergeType LayerMerge02{0x02,
"Dark",
true,
true,
true};
105const static LayerMergeType LayerMerge03{0x03,
"On top",
false,
true,
false};
106const static LayerMergeType LayerMerge04{0x04,
"Translucent",
true,
true,
true};
107const static LayerMergeType LayerMerge05{0x05,
"Addition",
true,
true,
true};
108const static LayerMergeType LayerMerge06{0x06,
"Normal",
true,
false,
false};
109const static LayerMergeType LayerMerge07{0x07,
"Transparent",
true,
true,
true};
110const static LayerMergeType LayerMerge08{0x08,
"Dark room",
true,
true,
true};
112const static LayerMergeType kLayerMergeTypeList[] = {
113 LayerMerge00, LayerMerge01, LayerMerge02, LayerMerge03, LayerMerge04,
114 LayerMerge05, LayerMerge06, LayerMerge07, LayerMerge08};
223 std::array<uint8_t, 64 * 64>
tiles{};
291 std::optional<uint8_t> entrance_blockset = std::nullopt);
311 void ReloadGraphics(std::optional<uint8_t> entrance_blockset = std::nullopt);
313 std::optional<uint8_t> entrance_blockset = std::nullopt);
421 if (index <
doors_.size()) {
467 absl::StatusOr<size_t>
FindObjectAt(
int x,
int y,
int layer)
const;
481 bool is_special_table_object =
false;
484 is_special_table_object =
true;
488 is_special_table_object =
true;
490 if (!is_special_table_object) {
496 const std::vector<RoomObject>& objects) {
497 for (
const auto&
object : objects) {
572 if (x < 0 || x >= 64 || y < 0 || y >= 64)
578 return x >= 0 && x < 64 && y >= 0 && y < 64 &&
583 if (x < 0 || x >= 64 || y < 0 || y >= 64)
590 if (x < 0 || x >= 64 || y < 0 || y >= 64)
606 if (x < 0 || x >= 64 || y < 0 || y >= 64)
612 if (x < 0 || x >= 64 || y < 0 || y >= 64)
614 const uint8_t val = filled ? 1 : 0;
615 const size_t idx =
static_cast<size_t>(y * 64 + x);
687 for (
size_t index = 0; index <
tile_objects_.size(); ++index) {
690 snapshot.block_load_orders.push_back(
691 {.tile_object_index = index,
692 .load_order =
object.block_load_order()});
715 object.set_block_load_order(block.load_order);
731 const uint8_t raw_value =
static_cast<uint8_t
>(
bg2);
732 const uint8_t normalized_value = raw_value <= 8 ? raw_value : 0;
733 const bool dark_room = normalized_value == 8;
734 const uint8_t next_layer2_mode =
738 kLayerMergeTypeList[dark_room ? 8 : next_layer2_mode];
745 bg2_ = normalized_bg2;
854 const uint8_t normalized_mode = mode & 0x07;
857 if (
bg2_ != background2::DarkRoom) {
1060 int& nbr_of_staircase);
1066 absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1070 absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1075 absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1100 std::map<uint16_t, std::vector<uint8_t>> overrides) {
1118 : zelda3_version::US);
1174 std::vector<std::pair<uint32_t, uint32_t>>
write_ranges()
const;
1337 const std::function<
const Room*(
int)>& room_lookup);
1340absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1342 const std::function<
const Room*(
int)>& room_lookup);
1364 const std::function<
const Room*(
int)>& room_lookup);
1367absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1369 const std::function<
const Room*(
int)>& room_lookup);
1377 const std::function<
Room*(
int)>& room_lookup);
1386 const std::vector<uint8_t>& encoded_bytes);
1392absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1431 std::vector<std::pair<uint32_t, uint32_t>> ranges;
1432 ranges.reserve(
writes.size());
1434 ranges.emplace_back(write.pc, write.end());
1441 const Rom* rom,
int room_count,
1442 const std::function<
const Room*(
int)>& room_lookup);
1444 Rom* rom,
const ChestSavePlan& plan,
1445 const std::function<
const Room*(
int)>& room_lookup);
1452absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1454 const std::function<
const Room*(
int)>& room_lookup);
1462 const std::function<
const Room*(
int)>& room_lookup);
1467 const DungeonStreamLayout* repack_layout);
1469 Rom* rom,
int room_count,
1470 const std::function<
const Room*(
int)>& room_lookup);
1472 const std::function<
const Room*(
int)>& room_lookup,
1473 const DungeonStreamLayout* repack_layout);
1480 "Hyrule Castle (North Corridor)",
1481 "Behind Sanctuary (Switch)",
1483 "Turtle Rock (Crysta-Roller)",
1485 "Swamp Palace (Arrghus[Boss])",
1486 "Tower of Hera (Moldorm[Boss])",
1487 "Cave (Healing Fairy)",
1488 "Palace of Darkness",
1489 "Palace of Darkness (Stalfos Trap)",
1490 "Palace of Darkness (Turtle)",
1491 "Ganon's Tower (Entrance)",
1492 "Ganon's Tower (Agahnim2[Boss])",
1493 "Ice Palace (Entrance )",
1495 "Ganon Evacuation Route",
1496 "Hyrule Castle (Bombable Stock )",
1498 "Turtle Rock (Hokku-Bokku Key 2)",
1499 "Turtle Rock (Big Key )",
1501 "Swamp Palace (Swimming Treadmill)",
1502 "Tower of Hera (Moldorm Fall )",
1504 "Palace of Darkness (Dark Maze)",
1505 "Palace of Darkness (Big Chest )",
1506 "Palace of Darkness (Mimics / Moving Wall )",
1507 "Ganon's Tower (Ice Armos)",
1508 "Ganon's Tower (Final Hallway)",
1509 "Ice Palace (Bomb Floor / Bari )",
1510 "Ice Palace (Pengator / Big Key )",
1511 "Agahnim's Tower (Agahnim[Boss])",
1512 "Hyrule Castle (Key-rat )",
1513 "Hyrule Castle (Sewer Text Trigger )",
1514 "Turtle Rock (West Exit to Balcony)",
1515 "Turtle Rock (Double Hokku-Bokku / Big chest )",
1517 "Swamp Palace (Statue )",
1518 "Tower of Hera (Big Chest)",
1519 "Swamp Palace (Entrance )",
1520 "Skull Woods (Mothula[Boss])",
1521 "Palace of Darkness (Big Hub )",
1522 "Palace of Darkness (Map Chest / Fairy )",
1525 "Ice Palace (Compass )",
1526 "Cave (Kakariko Well HP)",
1527 "Agahnim's Tower (Maiden Sacrifice Chamber)",
1528 "Tower of Hera (Hardhat Beetles )",
1529 "Hyrule Castle (Sewer Key Chest )",
1530 "Desert Palace (Lanmolas[Boss])",
1531 "Swamp Palace (Push Block Puzzle / Pre-Big Key )",
1532 "Swamp Palace (Big Key / BS )",
1533 "Swamp Palace (Big Chest )",
1534 "Swamp Palace (Map Chest / Water Fill )",
1535 "Swamp Palace (Key Pot )",
1536 "Skull Woods (Gibdo Key / Mothula Hole )",
1537 "Palace of Darkness (Bombable Floor )",
1538 "Palace of Darkness (Spike Block / Conveyor )",
1540 "Ganon's Tower (Torch 2)",
1541 "Ice Palace (Stalfos Knights / Conveyor Hellway)",
1542 "Ice Palace (Map Chest )",
1543 "Agahnim's Tower (Final Bridge )",
1544 "Hyrule Castle (First Dark )",
1545 "Hyrule Castle (6 Ropes )",
1546 "Desert Palace (Torch Puzzle / Moving Wall )",
1547 "Thieves Town (Big Chest )",
1548 "Thieves Town (Jail Cells )",
1549 "Swamp Palace (Compass Chest )",
1552 "Skull Woods (Gibdo Torch Puzzle )",
1553 "Palace of Darkness (Entrance )",
1554 "Palace of Darkness (Warps / South Mimics )",
1555 "Ganon's Tower (Mini-Helmasaur Conveyor )",
1556 "Ganon's Tower (Moldorm )",
1557 "Ice Palace (Bomb-Jump )",
1558 "Ice Palace Clone (Fairy )",
1559 "Hyrule Castle (West Corridor)",
1560 "Hyrule Castle (Throne )",
1561 "Hyrule Castle (East Corridor)",
1562 "Desert Palace (Popos 2 / Beamos Hellway )",
1563 "Swamp Palace (Upstairs Pits )",
1564 "Castle Secret Entrance / Uncle Death ",
1565 "Skull Woods (Key Pot / Trap )",
1566 "Skull Woods (Big Key )",
1567 "Skull Woods (Big Chest )",
1568 "Skull Woods (Final Section Entrance )",
1569 "Palace of Darkness (Helmasaur King[Boss])",
1570 "Ganon's Tower (Spike Pit )",
1571 "Ganon's Tower (Ganon-Ball Z)",
1572 "Ganon's Tower (Gauntlet 1/2/3)",
1573 "Ice Palace (Lonely Firebar)",
1574 "Ice Palace (Hidden Chest / Spike Floor )",
1575 "Hyrule Castle (West Entrance )",
1576 "Hyrule Castle (Main Entrance )",
1577 "Hyrule Castle (East Entrance )",
1578 "Desert Palace (Final Section Entrance )",
1579 "Thieves Town (West Attic )",
1580 "Thieves Town (East Attic )",
1581 "Swamp Palace (Hidden Chest / Hidden Door )",
1582 "Skull Woods (Compass Chest )",
1583 "Skull Woods (Key Chest / Trap )",
1585 "Palace of Darkness (Rupee )",
1586 "Ganon's Tower (Mimics s)",
1587 "Ganon's Tower (Lanmolas )",
1588 "Ganon's Tower (Gauntlet 4/5)",
1589 "Ice Palace (Pengators )",
1591 "Hyrule Castle (Small Corridor to Jail Cells)",
1592 "Hyrule Castle (Boomerang Chest )",
1593 "Hyrule Castle (Map Chest )",
1594 "Desert Palace (Big Chest )",
1595 "Desert Palace (Map Chest )",
1596 "Desert Palace (Big Key Chest )",
1597 "Swamp Palace (Water Drain )",
1598 "Tower of Hera (Entrance )",
1603 "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall )",
1604 "Ganon's Tower (Winder / Warp Maze )",
1605 "Ice Palace (Hidden Chest / Bombable Floor )",
1606 "Ice Palace ( Big Spike Traps )",
1607 "Hyrule Castle (Jail Cell )",
1609 "Hyrule Castle (Basement Chasm )",
1610 "Desert Palace (West Entrance )",
1611 "Desert Palace (Main Entrance )",
1612 "Desert Palace (East Entrance )",
1614 "Tower of Hera (Tile )",
1616 "Eastern Palace (Fairy )",
1618 "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest )",
1619 "Ganon's Tower (East and West Downstairs / Big Chest )",
1620 "Ganon's Tower (Tile / Torch Puzzle )",
1623 "Misery Mire (Vitreous[Boss])",
1624 "Misery Mire (Final Switch )",
1625 "Misery Mire (Dark Bomb Wall / Switches )",
1626 "Misery Mire (Dark Cane Floor Switch Puzzle )",
1628 "Ganon's Tower (Final Collapsing Bridge )",
1629 "Ganon's Tower (Torches 1 )",
1630 "Misery Mire (Torch Puzzle / Moving Wall )",
1631 "Misery Mire (Entrance )",
1632 "Eastern Palace (Eyegore Key )",
1634 "Ganon's Tower (Many Spikes / Warp Maze )",
1635 "Ganon's Tower (Invisible Floor Maze )",
1636 "Ganon's Tower (Compass Chest / Invisible Floor )",
1637 "Ice Palace (Big Chest )",
1639 "Misery Mire (Pre-Vitreous )",
1640 "Misery Mire (Fish )",
1641 "Misery Mire (Bridge Key Chest )",
1643 "Turtle Rock (Trinexx[Boss])",
1644 "Ganon's Tower (Wizzrobes s)",
1645 "Ganon's Tower (Moldorm Fall )",
1646 "Tower of Hera (Fairy )",
1647 "Eastern Palace (Stalfos Spawn )",
1648 "Eastern Palace (Big Chest )",
1649 "Eastern Palace (Map Chest )",
1650 "Thieves Town (Moving Spikes / Key Pot )",
1651 "Thieves Town (Blind The Thief[Boss])",
1654 "Ice Palace (Ice Bridge )",
1655 "Agahnim's Tower (Circle of Pots)",
1656 "Misery Mire (Hourglass )",
1657 "Misery Mire (Slug )",
1658 "Misery Mire (Spike Key Chest )",
1659 "Turtle Rock (Pre-Trinexx )",
1660 "Turtle Rock (Dark Maze)",
1661 "Turtle Rock (Chain Chomps )",
1662 "Turtle Rock (Map Chest / Key Chest / Roller )",
1663 "Eastern Palace (Big Key )",
1664 "Eastern Palace (Lobby Cannonballs )",
1665 "Eastern Palace (Dark Antifairy / Key Pot )",
1666 "Thieves Town (Hellway)",
1667 "Thieves Town (Conveyor Toilet)",
1669 "Ice Palace (Block Puzzle )",
1670 "Ice Palace Clone (Switch )",
1671 "Agahnim's Tower (Dark Bridge )",
1672 "Misery Mire (Compass Chest / Tile )",
1673 "Misery Mire (Big Hub )",
1674 "Misery Mire (Big Chest )",
1675 "Turtle Rock (Final Crystal Switch Puzzle )",
1676 "Turtle Rock (Laser Bridge)",
1678 "Turtle Rock (Torch Puzzle)",
1679 "Eastern Palace (Armos Knights[Boss])",
1680 "Eastern Palace (Entrance )",
1682 "Thieves Town (North West Entrance )",
1683 "Thieves Town (North East Entrance )",
1685 "Ice Palace (Hole to Kholdstare )",
1687 "Agahnim's Tower (Dark Maze)",
1688 "Misery Mire (Conveyor Slug / Big Key )",
1689 "Misery Mire (Mire02 / Wizzrobes )",
1692 "Turtle Rock (Laser Key )",
1693 "Turtle Rock (Entrance )",
1695 "Eastern Palace (Zeldagamer / Pre-Armos Knights )",
1696 "Eastern Palace (Canonball ",
1698 "Thieves Town (Main (South West) Entrance )",
1699 "Thieves Town (South East Entrance )",
1701 "Ice Palace (Kholdstare[Boss])",
1703 "Agahnim's Tower (Entrance )",
1704 "Cave (Lost Woods HP)",
1705 "Cave (Lumberjack's Tree HP)",
1707 "Cave (Lost Old Man Final Cave)",
1708 "Cave (Lost Old Man Final Cave)",
1713 "Cave (Spectacle Rock HP)",
1717 "Cave (Spiral Cave)",
1718 "Cave (Crystal Switch / 5 Chests )",
1719 "Cave (Lost Old Man Starting Cave)",
1720 "Cave (Lost Old Man Starting Cave)",
1722 "House (Old Woman (Sahasrahla's Wife?))",
1723 "House (Angry Brothers)",
1724 "House (Angry Brothers)",
1763 "Circle of bush Cave",
1764 "Big Bomb Shop, C-House",
1779extern const std::string
RoomTag[65];
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Represents a bitmap image optimized for SNES ROM hacking.
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
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 > GetDoorEditorBounds(uint8_t position, DoorDirection direction, DoorType type)
Get the editor interaction bounds for a typed door.
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.
bool ValidateObject(const RoomObject &object) const
const std::array< uint8_t, 0x10000 > & get_gfx_buffer() const
SaveDirtyState save_dirty_state_
std::vector< RoomObject > tile_objects_
std::vector< SDL_Color > rendered_palette_
gfx::BackgroundBuffer object_bg1_buffer_
void SetTag2Direct(TagKey tag2)
bool HasExceededLimits() const
Check if any object limits are exceeded.
void ClearObjectStreamHeaderDirty()
uint8_t render_entrance_blockset_
const CustomCollisionMap & custom_collision() const
uint8_t staircase_plane_[4]
absl::Status UpdateObject(size_t index, const RoomObject &object)
void ClearSaveDirtyState()
WaterFillZoneMap & water_fill_zone()
void AddTileObject(const RoomObject &object)
const std::map< uint16_t, std::vector< uint8_t > > & graphics_sheet_overrides() const
bool ArePotItemsLoaded() const
void SetStair4Target(uint8_t target)
void SetPitsTarget(uint8_t target)
void SetIsLight(bool is_light)
void EnsureSpritesLoaded()
uint64_t graphics_revision_
gfx::BackgroundBuffer bg2_buffer_
uint8_t resolved_main_blockset_
const std::vector< chest_data > & GetChests() const
int holewarp_destination_room() const
uint8_t cached_floor2_graphics_
std::vector< zelda3::Sprite > sprites_
CustomCollisionMap custom_collision_
void MarkSaveDirtyForTileObject(const RoomObject &object)
void SetLoaded(bool loaded)
uint8_t GetCollisionTile(int x, int y) const
void RenderComposite(const RoomLayerManager &layer_mgr, gfx::Bitmap &output)
void ClearObjectStreamDirty()
void ClearCustomCollisionDirty()
const std::vector< SDL_Color > & rendered_palette() const
void CopyRoomGraphicsToBuffer()
void set_water_fill_sram_bit_mask(uint8_t mask)
uint16_t message_id() const
const uint8_t * GraphicsSheetSource(int sheet_id) const
bool custom_collision_dirty() const
RoomLayerRegisters GameLayerRegisters(uint16_t room_flags=0) const
gfx::SnesPalette rendered_dungeon_palette_
std::vector< staircase > & GetStairs()
uint64_t composite_rendered_source_revision_
zelda3_version_pointers version_constants() const
void set_floor2(uint8_t value)
void RestoreMetadataSnapshot(const MetadataSnapshot &snapshot)
void ClearPotItemsDirty()
const WaterFillZoneMap & water_fill_zone() const
int staircase_destination_room(int index) const
void SetGraphicsSheetOverrides(std::map< uint16_t, std::vector< uint8_t > > overrides)
std::vector< Door > doors_
bool HasUnsavedChanges() const
void SetStaircaseRoom(int index, uint8_t room)
static constexpr uint8_t kObjectHeaderFloor1Dirty
const gfx::Bitmap & composite_bitmap() const
int WaterFillTileCount() const
absl::Status RemoveObject(size_t index)
void SetStair1TargetLayer(uint8_t layer)
void set_floor1(uint8_t value)
bool SourceSheetsChanged() const
void SetLayer2Mode(uint8_t mode)
void LoadLayoutTilesToBuffer()
uint8_t staircase_room(int index) const
void MarkTileObjectCollectionDirty()
void SetTag2(TagKey tag2)
const std::vector< Door > & GetDoors() const
std::vector< DungeonLimitInfo > GetExceededLimitDetails() const
Get list of exceeded limits with details.
auto & object_bg2_buffer()
void ParseObjectsFromLocation(int objects_location)
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetObjectSaveWriteRanges(const DungeonStreamLayout *layout=nullptr) const
uint8_t layer2_mode() const
uint8_t cached_floor1_graphics_
bool custom_collision_dirty_
static constexpr uint8_t kObjectHeaderFloor2Dirty
void ReloadGraphics(std::optional< uint8_t > entrance_blockset=std::nullopt)
absl::Status ApplyStreamSavePlan(const StreamSavePlan &plan)
bool pot_items_dirty() const
void set_has_custom_collision(bool has)
void ClearWaterFillZone()
const auto & object_bg1_buffer() const
void RecordSourceSheet(int sheet_id)
std::vector< zelda3::Sprite > & GetSprites()
void SetTag1Direct(TagKey tag1)
bool IsCompositeDirty() const
void SetLayoutId(uint8_t id)
void SetHolewarp(uint8_t hw)
std::vector< Door > & GetDoors()
void SetStair2Target(uint8_t target)
bool object_stream_dirty() const
size_t GetTileObjectCount() const
const auto & object_bg2_buffer() const
bool sprites_dirty() const
bool header_dirty() const
CustomCollisionMap & custom_collision()
void SetCollision(CollisionKey collision)
bool object_stream_header_dirty() const
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetObjectStreamHeaderSaveWriteRanges(const DungeonStreamLayout *layout=nullptr) const
const std::vector< staircase > & GetStairs() const
gfx::BackgroundBuffer bg1_buffer_
bool has_water_fill_zone() const
void ClearCollisionTile(int x, int y)
RoomObject & GetTileObject(size_t index)
void SetStaircasePlane(int index, uint8_t plane)
absl::Status SaveObjects(const DungeonStreamLayout *layout=nullptr)
void SetIsDark(bool is_dark)
WaterFillZoneMap water_fill_zone_
std::map< DungeonLimit, int > GetLimitedObjectCounts() const
Count limited objects in this room.
void RenderRoomGraphics()
void RestoreSaveDirtySnapshot(const SaveDirtySnapshot &snapshot)
PaletteAddressMap rendered_palette_addresses_
absl::Status SaveRoomHeader()
gfx::Bitmap composite_bitmap_
std::map< uint16_t, std::vector< uint8_t > > graphics_sheet_overrides_
bool HasCollisionOverride(int x, int y) const
const gfx::SnesPalette & rendered_dungeon_palette() const
Room & operator=(Room &&)
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetSpriteSaveWriteRanges(const DungeonStreamLayout *layout=nullptr) const
bool chests_dirty() const
uint64_t composite_signature_
std::vector< RoomObject > & GetTileObjects()
std::vector< PotItem > & GetPotItems()
CollisionKey collision() const
const RoomLayout & GetLayout() const
void MarkTileObjectDomainsDirtyForSnapshot(const std::vector< RoomObject > &objects)
void SetMessageIdDirect(uint16_t mid)
void AddDoor(const Door &door)
void LoadRoomGraphics(std::optional< uint8_t > entrance_blockset=std::nullopt)
uint8_t staircase_rooms_[4]
const auto & bg1_buffer() const
gfx::Bitmap & GetCompositeBitmap(RoomLayerManager &layer_mgr)
Get a composite bitmap of all layers merged.
std::vector< uint8_t > EncodeObjects() const
void SetEffect(EffectKey effect)
absl::Status SaveObjectStreamHeader(const DungeonStreamLayout *layout=nullptr)
gfx::BackgroundBuffer object_bg2_buffer_
uint8_t spriteset() const
void ClearWaterFillDirty()
Room & operator=(const Room &)=delete
absl::StatusOr< StreamSavePlan > PlanObjectSave(const DungeonStreamLayout *layout) const
absl::StatusOr< StreamSavePlan > PlanSpriteSave(const DungeonStreamLayout *layout) const
std::array< uint8_t, 16 > blocks_
void SetTag1(TagKey tag1)
void SetBackgroundTileset(uint8_t tileset)
void SetStair3TargetLayer(uint8_t layer)
void SetRenderEntranceBlockset(uint8_t entrance_blockset)
const std::vector< zelda3::Sprite > & GetSprites() const
std::array< chest, 16 > chest_list_
absl::Status SaveSprites(const DungeonStreamLayout *layout=nullptr)
uint64_t graphics_revision() const
void PrepareForRender(std::optional< uint8_t > entrance_blockset=std::nullopt)
const std::vector< RoomObject > & GetTileObjects() const
DungeonState * GetDungeonState()
const LayerMergeType & layer_merging() const
void MarkWaterFillDirty()
void SetLayerMerging(LayerMergeType merging)
void SetPitsTargetLayer(uint8_t layer)
int BackgroundPaletteOffset(int slot) const
void MarkObjectStreamDirty()
absl::StatusOr< StreamSavePlan > PlanObjectStreamHeaderSave(const DungeonStreamLayout *layout) const
const PaletteAddressMap & rendered_palette_addresses() const
bool blocks_dirty() const
bool GetWaterFillTile(int x, int y) const
void SetSpriteTileset(uint8_t tileset)
void SetStair1Target(uint8_t target)
void SetBg2(background2 bg2)
std::vector< chest_data > & GetChests()
static constexpr uint8_t kObjectHeaderLayoutDirty
bool torches_dirty() const
void EnsureObjectsLoaded()
uint64_t composite_source_revision_
bool AreObjectsLoaded() const
void SetSpriteset(uint8_t ss)
uint64_t composite_source_revision() const
void SetTileObjects(const std::vector< RoomObject > &objects)
void MarkCompositeDirty()
Mark composite bitmap as needing regeneration.
int ResolveDungeonPaletteId() const
std::unique_ptr< DungeonState > dungeon_state_
void LoadAnimatedGraphics()
std::vector< uint8_t > EncodeSprites() const
void SetCollisionTile(int x, int y, uint8_t tile)
std::vector< chest_data > chests_in_room_
void SetBlockset(uint8_t bs)
LayerMergeType layer_merging_
SaveDirtySnapshot CaptureSaveDirtySnapshot() const
bool water_fill_dirty() const
void EnsurePotItemsLoaded()
uint8_t staircase_plane(int index) const
bool has_composite_signature_
void MarkCustomCollisionDirty()
const RoomObject & GetTileObject(size_t index) const
std::vector< std::pair< uint16_t, uint64_t > > source_sheet_revisions_
bool AreTorchesLoaded() const
uint8_t cached_spriteset_
std::array< uint8_t, 0x10000 > current_gfx16_
std::vector< staircase > z3_staircases_
uint8_t render_entrance_blockset() const
std::vector< PotItem > pot_items_
bool AreBlocksLoaded() const
const DungeonState * GetDungeonState() const
int water_fill_tile_count_
bool AreSpritesLoaded() const
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 SetPalette(uint8_t pal)
uint8_t layout_id() const
bool has_custom_collision() const
MetadataSnapshot CaptureMetadataSnapshot() const
const std::vector< PotItem > & GetPotItems() const
uint8_t water_fill_sram_bit_mask() const
void RemoveDoor(size_t index)
void SetStair2TargetLayer(uint8_t layer)
Room(const Room &)=delete
const auto & bg2_buffer() const
const GameData * game_data() const
void RenderObjectsToBackground()
friend ResolvedGraphicsContext DescribeDungeonGraphicsContext(const Room &room, const GraphicsContextIdentity &identity)
bool AreChestsLoaded() const
void SetGameData(GameData *data)
auto & object_bg1_buffer()
uint8_t resolved_main_blockset() const
void SetLayer2Behavior(uint8_t behavior)
void SetWaterFillTile(int x, int y, bool filled)
void SetMessageId(uint16_t mid)
zelda3_bg2_effect
Background layer 2 effects.
absl::Status SaveAllChests(Rom *rom, absl::Span< const Room > rooms)
constexpr DoorDirection DoorDirectionFromRaw(uint8_t raw_dir)
Convert raw direction byte to DoorDirection enum.
const std::string RoomTag[65]
constexpr DoorDimensions GetDoorDimensions(DoorDirection dir)
Get door dimensions based on direction.
DoorType
Door types from ALTTP.
constexpr int ResolveHeaderDestinationRoom(int source_room_id, uint8_t header_byte)
constexpr int PotItemPixelX(uint16_t word)
Room LoadRoomHeaderFromRom(Rom *rom, int room_id)
absl::StatusOr< ChestSavePlan > BuildChestSavePlan(const Rom *rom, int room_count, const std::function< const Room *(int)> &room_lookup)
int FindMaxUsedSpriteAddress(Rom *rom)
absl::Status RelocateSpriteData(Rom *rom, int room_id, const std::vector< uint8_t > &encoded_bytes)
gfx::PaletteGroup BuildDungeonRenderPaletteGroup(const gfx::SnesPalette &dungeon_palette, const gfx::SnesPalette *hud_palette)
@ 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
absl::Status SaveAllPotItems(Rom *rom, absl::Span< const Room > rooms)
gfx::PaletteGroup BuildDungeonRenderPaletteGroupFromGameData(const gfx::SnesPalette &dungeon_palette, const GameData *game_data)
RoomSize CalculateRoomSize(Rom *rom, int room_id)
void LoadDungeonRenderPaletteToCgram(std::span< uint16_t > cgram, const gfx::SnesPalette &dungeon_palette, const gfx::SnesPalette *hud_palette)
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetChestTableWriteRanges(const Rom *rom)
absl::Status SaveAllTorches(Rom *rom, absl::Span< const Room > rooms)
constexpr int PotItemPixelY(uint16_t word)
constexpr std::string_view GetDoorDirectionName(DoorDirection dir)
Get human-readable name for door direction.
absl::Status SaveAllPits(Rom *rom)
absl::Status SaveAllBlocks(Rom *rom)
std::vector< SDL_Color > BuildDungeonRenderPalette(const gfx::SnesPalette &dungeon_palette, const gfx::SnesPalette *hud_palette, PaletteAddressMap *addresses, int palette_id)
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetDirtyChestWriteRanges(const Rom *rom, int room_count, const std::function< const Room *(int)> &room_lookup)
Room LoadRoomFromRom(Rom *rom, int room_id)
constexpr DoorType DoorTypeFromRaw(uint8_t raw_type)
Convert raw type byte to DoorType enum.
constexpr std::array< std::string_view, 297 > kRoomNames
constexpr std::string_view GetDoorTypeName(DoorType type)
Get human-readable name for door type.
absl::Status ApplyChestSavePlan(Rom *rom, const ChestSavePlan &plan, const std::function< const Room *(int)> &room_lookup)
const std::string RoomEffect[8]
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetTorchSaveWriteRanges(const Rom *rom, int room_count, const std::function< const Room *(int)> &room_lookup)
std::array< SDL_Color, 256 > BuildDungeonSpriteRenderPalette(const Room &room, const GameData *game_data)
DoorDirection
Door direction on room walls.
absl::Status SaveAllCollision(Rom *rom, absl::Span< Room > rooms)
absl::StatusOr< std::vector< std::pair< uint32_t, uint32_t > > > GetBlockSaveWriteRanges(const Rom *rom, int room_count, const std::function< const Room *(int)> &room_lookup)
constexpr DoorDimensions GetEditorDoorDimensions(DoorDirection dir, DoorType type)
Get visible editor dimensions for compatibility with UI callers.
std::array< std::optional< PaletteColorAddress >, 128 > PaletteAddressMap
Room transition destination.
bool operator==(const ChestDirtyRoomState &) const =default
std::vector< uint8_t > encoded_chests
std::vector< uint8_t > original_capacity_bytes
bool operator==(const ChestSavePlan &) const =default
std::vector< std::pair< uint32_t, uint32_t > > write_ranges() const
uint16_t original_byte_length
std::vector< ChestWriteRun > writes
std::array< uint8_t, 3 > pointer_operand
std::vector< ChestDirtyRoomState > dirty_rooms
std::vector< uint8_t > expected_bytes
std::vector< uint8_t > replacement_bytes
bool operator==(const ChestWriteRun &) const =default
std::array< uint8_t, 64 *64 > tiles
bool HasOverride(size_t offset) const
void SetOverride(size_t offset, uint8_t tile)
void ClearOverride(size_t offset)
Door dimensions in tiles (8x8 pixel tiles)
LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans)
bool operator==(const LayerMergeType &) const =default
int64_t room_size_pointer
Represents a door in a dungeon room.
std::tuple< int, int, int, int > GetEditorBounds() const
Get editor interaction bounds (x, y, width, height in pixels)
std::tuple< int, int, int, int > GetBounds() const
Get bounding rectangle (x, y, width, height in pixels)
std::string_view GetTypeName() const
Get human-readable type name.
uint8_t byte1
Original ROM byte 1 (position data)
DoorDimensions GetDimensions() const
Get door dimensions in tiles.
DoorType type
Door type (determines appearance/behavior)
static Door FromRomBytes(uint8_t b1, uint8_t b2)
std::pair< uint8_t, uint8_t > EncodeBytes() const
Encode door data for ROM storage.
DoorDirection direction
Which wall the door is on.
DoorDimensions GetEditorDimensions() const
Get editor interaction dimensions in tiles.
uint8_t position
Encoded position (5-bit, 0-31)
std::string_view GetDirectionName() const
Get human-readable direction name.
std::pair< int, int > GetPixelCoords() const
Get pixel coordinates for this door.
uint8_t byte2
Original ROM byte 2 (type + direction)
std::pair< int, int > GetTileCoords() const
Get tile coordinates for this door.
uint8_t object_stream_header
std::vector< BlockLoadOrder > block_load_orders
uint8_t water_fill_sram_bit_mask
uint8_t object_stream_header
std::vector< std::pair< uint32_t, uint32_t > > write_ranges() const
std::optional< std::pair< uint32_t, uint32_t > > direct_long_write
std::optional< DungeonStreamWritePlan > relocation
std::vector< std::pair< uint32_t, std::vector< uint8_t > > > direct_writes
std::array< uint8_t, 64 *64 > tiles
ROM data pointers for different game versions.
Public YAZE API umbrella header.