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