1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_H
15#include "absl/status/statusor.h"
16#include "absl/types/span.h"
34class RoomLayerManager;
35struct DungeonStreamLayout;
38 const gfx::SnesPalette& dungeon_palette,
39 const gfx::SnesPalette* hud_palette =
nullptr);
42 std::span<uint16_t> cgram,
const gfx::SnesPalette& dungeon_palette,
43 const gfx::SnesPalette* hud_palette =
nullptr);
72const static LayerMergeType LayerMerge00{0x00,
"Off",
true,
false,
false};
73const static LayerMergeType LayerMerge01{0x01,
"Parallax",
true,
false,
false};
74const static LayerMergeType LayerMerge02{0x02,
"Dark",
true,
true,
true};
75const static LayerMergeType LayerMerge03{0x03,
"On top",
false,
true,
false};
76const static LayerMergeType LayerMerge04{0x04,
"Translucent",
true,
true,
true};
77const static LayerMergeType LayerMerge05{0x05,
"Addition",
true,
true,
true};
78const static LayerMergeType LayerMerge06{0x06,
"Normal",
true,
false,
false};
79const static LayerMergeType LayerMerge07{0x07,
"Transparent",
true,
true,
true};
80const static LayerMergeType LayerMerge08{0x08,
"Dark room",
true,
true,
true};
82const static LayerMergeType kLayerMergeTypeList[] = {
83 LayerMerge00, LayerMerge01, LayerMerge02, LayerMerge03, LayerMerge04,
84 LayerMerge05, LayerMerge06, LayerMerge07, LayerMerge08};
192 std::array<uint8_t, 64 * 64>
tiles{};
230 std::optional<uint8_t> entrance_blockset = std::nullopt);
248 void ReloadGraphics(std::optional<uint8_t> entrance_blockset = std::nullopt);
250 std::optional<uint8_t> entrance_blockset = std::nullopt);
358 if (index <
doors_.size()) {
404 absl::StatusOr<size_t>
FindObjectAt(
int x,
int y,
int layer)
const;
418 bool is_special_table_object =
false;
421 is_special_table_object =
true;
425 is_special_table_object =
true;
427 if (!is_special_table_object) {
433 const std::vector<RoomObject>& objects) {
434 for (
const auto&
object : objects) {
509 if (x < 0 || x >= 64 || y < 0 || y >= 64)
515 if (x < 0 || x >= 64 || y < 0 || y >= 64)
532 if (x < 0 || x >= 64 || y < 0 || y >= 64)
538 if (x < 0 || x >= 64 || y < 0 || y >= 64)
540 const uint8_t val = filled ? 1 : 0;
541 const size_t idx =
static_cast<size_t>(y * 64 + x);
613 for (
size_t index = 0; index <
tile_objects_.size(); ++index) {
616 snapshot.block_load_orders.push_back(
617 {.tile_object_index = index,
618 .load_order =
object.block_load_order()});
641 object.set_block_load_order(block.load_order);
945 int& nbr_of_staircase);
968 : zelda3_version::US);
1134 const std::function<
const Room*(
int)>& room_lookup);
1156 const std::function<
const Room*(
int)>& room_lookup);
1164 const std::function<
Room*(
int)>& room_lookup);
1173 const std::vector<uint8_t>& encoded_bytes);
1179absl::StatusOr<std::vector<std::pair<uint32_t, uint32_t>>>
1188 const std::function<
const Room*(
int)>& room_lookup);
1195 Rom* rom,
int room_count,
1196 const std::function<
const Room*(
int)>& room_lookup);
1198 const std::function<
const Room*(
int)>& room_lookup,
1206 "Hyrule Castle (North Corridor)",
1207 "Behind Sanctuary (Switch)",
1209 "Turtle Rock (Crysta-Roller)",
1211 "Swamp Palace (Arrghus[Boss])",
1212 "Tower of Hera (Moldorm[Boss])",
1213 "Cave (Healing Fairy)",
1214 "Palace of Darkness",
1215 "Palace of Darkness (Stalfos Trap)",
1216 "Palace of Darkness (Turtle)",
1217 "Ganon's Tower (Entrance)",
1218 "Ganon's Tower (Agahnim2[Boss])",
1219 "Ice Palace (Entrance )",
1221 "Ganon Evacuation Route",
1222 "Hyrule Castle (Bombable Stock )",
1224 "Turtle Rock (Hokku-Bokku Key 2)",
1225 "Turtle Rock (Big Key )",
1227 "Swamp Palace (Swimming Treadmill)",
1228 "Tower of Hera (Moldorm Fall )",
1230 "Palace of Darkness (Dark Maze)",
1231 "Palace of Darkness (Big Chest )",
1232 "Palace of Darkness (Mimics / Moving Wall )",
1233 "Ganon's Tower (Ice Armos)",
1234 "Ganon's Tower (Final Hallway)",
1235 "Ice Palace (Bomb Floor / Bari )",
1236 "Ice Palace (Pengator / Big Key )",
1237 "Agahnim's Tower (Agahnim[Boss])",
1238 "Hyrule Castle (Key-rat )",
1239 "Hyrule Castle (Sewer Text Trigger )",
1240 "Turtle Rock (West Exit to Balcony)",
1241 "Turtle Rock (Double Hokku-Bokku / Big chest )",
1243 "Swamp Palace (Statue )",
1244 "Tower of Hera (Big Chest)",
1245 "Swamp Palace (Entrance )",
1246 "Skull Woods (Mothula[Boss])",
1247 "Palace of Darkness (Big Hub )",
1248 "Palace of Darkness (Map Chest / Fairy )",
1251 "Ice Palace (Compass )",
1252 "Cave (Kakariko Well HP)",
1253 "Agahnim's Tower (Maiden Sacrifice Chamber)",
1254 "Tower of Hera (Hardhat Beetles )",
1255 "Hyrule Castle (Sewer Key Chest )",
1256 "Desert Palace (Lanmolas[Boss])",
1257 "Swamp Palace (Push Block Puzzle / Pre-Big Key )",
1258 "Swamp Palace (Big Key / BS )",
1259 "Swamp Palace (Big Chest )",
1260 "Swamp Palace (Map Chest / Water Fill )",
1261 "Swamp Palace (Key Pot )",
1262 "Skull Woods (Gibdo Key / Mothula Hole )",
1263 "Palace of Darkness (Bombable Floor )",
1264 "Palace of Darkness (Spike Block / Conveyor )",
1266 "Ganon's Tower (Torch 2)",
1267 "Ice Palace (Stalfos Knights / Conveyor Hellway)",
1268 "Ice Palace (Map Chest )",
1269 "Agahnim's Tower (Final Bridge )",
1270 "Hyrule Castle (First Dark )",
1271 "Hyrule Castle (6 Ropes )",
1272 "Desert Palace (Torch Puzzle / Moving Wall )",
1273 "Thieves Town (Big Chest )",
1274 "Thieves Town (Jail Cells )",
1275 "Swamp Palace (Compass Chest )",
1278 "Skull Woods (Gibdo Torch Puzzle )",
1279 "Palace of Darkness (Entrance )",
1280 "Palace of Darkness (Warps / South Mimics )",
1281 "Ganon's Tower (Mini-Helmasaur Conveyor )",
1282 "Ganon's Tower (Moldorm )",
1283 "Ice Palace (Bomb-Jump )",
1284 "Ice Palace Clone (Fairy )",
1285 "Hyrule Castle (West Corridor)",
1286 "Hyrule Castle (Throne )",
1287 "Hyrule Castle (East Corridor)",
1288 "Desert Palace (Popos 2 / Beamos Hellway )",
1289 "Swamp Palace (Upstairs Pits )",
1290 "Castle Secret Entrance / Uncle Death ",
1291 "Skull Woods (Key Pot / Trap )",
1292 "Skull Woods (Big Key )",
1293 "Skull Woods (Big Chest )",
1294 "Skull Woods (Final Section Entrance )",
1295 "Palace of Darkness (Helmasaur King[Boss])",
1296 "Ganon's Tower (Spike Pit )",
1297 "Ganon's Tower (Ganon-Ball Z)",
1298 "Ganon's Tower (Gauntlet 1/2/3)",
1299 "Ice Palace (Lonely Firebar)",
1300 "Ice Palace (Hidden Chest / Spike Floor )",
1301 "Hyrule Castle (West Entrance )",
1302 "Hyrule Castle (Main Entrance )",
1303 "Hyrule Castle (East Entrance )",
1304 "Desert Palace (Final Section Entrance )",
1305 "Thieves Town (West Attic )",
1306 "Thieves Town (East Attic )",
1307 "Swamp Palace (Hidden Chest / Hidden Door )",
1308 "Skull Woods (Compass Chest )",
1309 "Skull Woods (Key Chest / Trap )",
1311 "Palace of Darkness (Rupee )",
1312 "Ganon's Tower (Mimics s)",
1313 "Ganon's Tower (Lanmolas )",
1314 "Ganon's Tower (Gauntlet 4/5)",
1315 "Ice Palace (Pengators )",
1317 "Hyrule Castle (Small Corridor to Jail Cells)",
1318 "Hyrule Castle (Boomerang Chest )",
1319 "Hyrule Castle (Map Chest )",
1320 "Desert Palace (Big Chest )",
1321 "Desert Palace (Map Chest )",
1322 "Desert Palace (Big Key Chest )",
1323 "Swamp Palace (Water Drain )",
1324 "Tower of Hera (Entrance )",
1329 "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall )",
1330 "Ganon's Tower (Winder / Warp Maze )",
1331 "Ice Palace (Hidden Chest / Bombable Floor )",
1332 "Ice Palace ( Big Spike Traps )",
1333 "Hyrule Castle (Jail Cell )",
1335 "Hyrule Castle (Basement Chasm )",
1336 "Desert Palace (West Entrance )",
1337 "Desert Palace (Main Entrance )",
1338 "Desert Palace (East Entrance )",
1340 "Tower of Hera (Tile )",
1342 "Eastern Palace (Fairy )",
1344 "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest )",
1345 "Ganon's Tower (East and West Downstairs / Big Chest )",
1346 "Ganon's Tower (Tile / Torch Puzzle )",
1349 "Misery Mire (Vitreous[Boss])",
1350 "Misery Mire (Final Switch )",
1351 "Misery Mire (Dark Bomb Wall / Switches )",
1352 "Misery Mire (Dark Cane Floor Switch Puzzle )",
1354 "Ganon's Tower (Final Collapsing Bridge )",
1355 "Ganon's Tower (Torches 1 )",
1356 "Misery Mire (Torch Puzzle / Moving Wall )",
1357 "Misery Mire (Entrance )",
1358 "Eastern Palace (Eyegore Key )",
1360 "Ganon's Tower (Many Spikes / Warp Maze )",
1361 "Ganon's Tower (Invisible Floor Maze )",
1362 "Ganon's Tower (Compass Chest / Invisible Floor )",
1363 "Ice Palace (Big Chest )",
1365 "Misery Mire (Pre-Vitreous )",
1366 "Misery Mire (Fish )",
1367 "Misery Mire (Bridge Key Chest )",
1369 "Turtle Rock (Trinexx[Boss])",
1370 "Ganon's Tower (Wizzrobes s)",
1371 "Ganon's Tower (Moldorm Fall )",
1372 "Tower of Hera (Fairy )",
1373 "Eastern Palace (Stalfos Spawn )",
1374 "Eastern Palace (Big Chest )",
1375 "Eastern Palace (Map Chest )",
1376 "Thieves Town (Moving Spikes / Key Pot )",
1377 "Thieves Town (Blind The Thief[Boss])",
1380 "Ice Palace (Ice Bridge )",
1381 "Agahnim's Tower (Circle of Pots)",
1382 "Misery Mire (Hourglass )",
1383 "Misery Mire (Slug )",
1384 "Misery Mire (Spike Key Chest )",
1385 "Turtle Rock (Pre-Trinexx )",
1386 "Turtle Rock (Dark Maze)",
1387 "Turtle Rock (Chain Chomps )",
1388 "Turtle Rock (Map Chest / Key Chest / Roller )",
1389 "Eastern Palace (Big Key )",
1390 "Eastern Palace (Lobby Cannonballs )",
1391 "Eastern Palace (Dark Antifairy / Key Pot )",
1392 "Thieves Town (Hellway)",
1393 "Thieves Town (Conveyor Toilet)",
1395 "Ice Palace (Block Puzzle )",
1396 "Ice Palace Clone (Switch )",
1397 "Agahnim's Tower (Dark Bridge )",
1398 "Misery Mire (Compass Chest / Tile )",
1399 "Misery Mire (Big Hub )",
1400 "Misery Mire (Big Chest )",
1401 "Turtle Rock (Final Crystal Switch Puzzle )",
1402 "Turtle Rock (Laser Bridge)",
1404 "Turtle Rock (Torch Puzzle)",
1405 "Eastern Palace (Armos Knights[Boss])",
1406 "Eastern Palace (Entrance )",
1408 "Thieves Town (North West Entrance )",
1409 "Thieves Town (North East Entrance )",
1411 "Ice Palace (Hole to Kholdstare )",
1413 "Agahnim's Tower (Dark Maze)",
1414 "Misery Mire (Conveyor Slug / Big Key )",
1415 "Misery Mire (Mire02 / Wizzrobes )",
1418 "Turtle Rock (Laser Key )",
1419 "Turtle Rock (Entrance )",
1421 "Eastern Palace (Zeldagamer / Pre-Armos Knights )",
1422 "Eastern Palace (Canonball ",
1424 "Thieves Town (Main (South West) Entrance )",
1425 "Thieves Town (South East Entrance )",
1427 "Ice Palace (Kholdstare[Boss])",
1429 "Agahnim's Tower (Entrance )",
1430 "Cave (Lost Woods HP)",
1431 "Cave (Lumberjack's Tree HP)",
1433 "Cave (Lost Old Man Final Cave)",
1434 "Cave (Lost Old Man Final Cave)",
1439 "Cave (Spectacle Rock HP)",
1443 "Cave (Spiral Cave)",
1444 "Cave (Crystal Switch / 5 Chests )",
1445 "Cave (Lost Old Man Starting Cave)",
1446 "Cave (Lost Old Man Starting Cave)",
1448 "House (Old Woman (Sahasrahla's Wife?))",
1449 "House (Angry Brothers)",
1450 "House (Angry Brothers)",
1489 "Circle of bush Cave",
1490 "Big Bomb Shop, C-House",
1505extern 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.
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_
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)
bool ArePotItemsLoaded() const
void SetStair4Target(uint8_t target)
void SetPitsTarget(uint8_t target)
void SetIsLight(bool is_light)
void EnsureSpritesLoaded()
gfx::BackgroundBuffer bg2_buffer_
uint8_t resolved_main_blockset_
const std::vector< chest_data > & GetChests() 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 ClearObjectStreamDirty()
void ClearCustomCollisionDirty()
void CopyRoomGraphicsToBuffer()
void set_water_fill_sram_bit_mask(uint8_t mask)
uint16_t message_id() const
bool custom_collision_dirty() const
std::vector< staircase > & GetStairs()
zelda3_version_pointers version_constants() const
void set_floor2(uint8_t value)
void ClearPotItemsDirty()
const WaterFillZoneMap & water_fill_zone() const
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)
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)
uint8_t cached_floor1_graphics_
bool custom_collision_dirty_
static constexpr uint8_t kObjectHeaderFloor2Dirty
void ReloadGraphics(std::optional< uint8_t > entrance_blockset=std::nullopt)
bool pot_items_dirty() const
void set_has_custom_collision(bool has)
void ClearWaterFillZone()
const auto & object_bg1_buffer() const
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
const std::vector< staircase > & GetStairs() const
gfx::BackgroundBuffer bg1_buffer_
bool has_water_fill_zone() const
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)
absl::Status SaveRoomHeader()
gfx::Bitmap composite_bitmap_
Room & operator=(Room &&)
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
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)
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)
void MarkObjectStreamDirty()
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()
bool AreObjectsLoaded() const
void SetSpriteset(uint8_t ss)
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
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
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
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
void RenderObjectsToBackground()
bool AreChestsLoaded() const
void SetGameData(GameData *data)
auto & object_bg1_buffer()
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.
Room LoadRoomHeaderFromRom(Rom *rom, int room_id)
int FindMaxUsedSpriteAddress(Rom *rom)
absl::Status RelocateSpriteData(Rom *rom, int room_id, const std::vector< uint8_t > &encoded_bytes)
absl::Status SaveAllPotItems(Rom *rom, absl::Span< const Room > rooms)
RoomSize CalculateRoomSize(Rom *rom, int room_id)
@ 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
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)
std::vector< SDL_Color > BuildDungeonRenderPalette(const gfx::SnesPalette &dungeon_palette, const gfx::SnesPalette *hud_palette)
constexpr std::string_view GetDoorDirectionName(DoorDirection dir)
Get human-readable name for door direction.
absl::Status SaveAllPits(Rom *rom)
absl::Status SaveAllBlocks(Rom *rom)
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.
const std::string RoomEffect[8]
DoorDirection
Door direction on room walls.
absl::Status SaveAllCollision(Rom *rom, absl::Span< Room > rooms)
constexpr DoorDimensions GetEditorDoorDimensions(DoorDirection dir, DoorType type)
Get editor interaction dimensions for a door.
Room transition destination.
std::array< uint8_t, 64 *64 > tiles
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::array< uint8_t, 64 *64 > tiles
ROM data pointers for different game versions.
Public YAZE API umbrella header.