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 <string_view>
8#include <vector>
9
10#include "app/rom.h"
16
17namespace yaze {
18namespace zelda3 {
19
20// ROM addresses moved to dungeon_rom_addresses.h for better organization
21// Use kPrefixedNames for new code (clean naming convention)
22
23// Legacy aliases for backward compatibility (gradual migration)
39constexpr int torch_data = kTorchData;
42constexpr int sprites_data = kSpritesData;
45constexpr int pit_pointer = kPitPointer;
46constexpr int pit_count = kPitCount;
48constexpr int door_gfx_up = kDoorGfxUp;
53constexpr int door_pos_up = kDoorPosUp;
58constexpr int tile_address = kTileAddress;
61constexpr uint16_t stairsObjects[] = {0x139, 0x138, 0x13B, 0x12E, 0x12D};
62
63// TODO: Gradually migrate all code to use kPrefixedNames directly
64// Then remove these legacy aliases
65
67 uint8_t ID;
68 std::string Name;
72 LayerMergeType() = default;
73 LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans) {
74 ID = id;
75 Name = name;
76 Layer2OnTop = top;
77 Layer2Translucent = trans;
78 Layer2Visible = see;
79 }
80};
81
82const static LayerMergeType LayerMerge00{0x00, "Off", true, false, false};
83const static LayerMergeType LayerMerge01{0x01, "Parallax", true, false, false};
84const static LayerMergeType LayerMerge02{0x02, "Dark", true, true, true};
85const static LayerMergeType LayerMerge03{0x03, "On top", true, true, false};
86const static LayerMergeType LayerMerge04{0x04, "Translucent", true, true, true};
87const static LayerMergeType LayerMerge05{0x05, "Addition", true, true, true};
88const static LayerMergeType LayerMerge06{0x06, "Normal", true, false, false};
89const static LayerMergeType LayerMerge07{0x07, "Transparent", true, true, true};
90const static LayerMergeType LayerMerge08{0x08, "Dark room", true, true, true};
91
92const static LayerMergeType kLayerMergeTypeList[] = {
93 LayerMerge00, LayerMerge01, LayerMerge02, LayerMerge03, LayerMerge04,
94 LayerMerge05, LayerMerge06, LayerMerge07, LayerMerge08};
95
103
114
115enum TagKey {
181
182class Room {
183 public:
184 Room() = default;
185 Room(int room_id, Rom* rom) : room_id_(room_id), rom_(rom) {}
186
187 void LoadRoomGraphics(uint8_t entrance_blockset = 0xFF);
189 // LoadGraphicsSheetsIntoArena() removed - per-room graphics instead
190 void RenderRoomGraphics();
193 void LoadObjects();
194 void LoadSprites();
195 void LoadChests();
196 void LoadDoors();
197 void LoadTorches();
198 void LoadBlocks();
199 void LoadPits();
202
203
204 // Public getters and manipulators for sprites
205 const std::vector<zelda3::Sprite>& GetSprites() const { return sprites_; }
206 std::vector<zelda3::Sprite>& GetSprites() { return sprites_; }
207
208 // Public getters and manipulators for chests
209 const std::vector<chest_data>& GetChests() const { return chests_in_room_; }
210 std::vector<chest_data>& GetChests() { return chests_in_room_; }
211
212 // Public getters and manipulators for stairs
213 const std::vector<staircase>& GetStairs() const { return z3_staircases_; }
214 std::vector<staircase>& GetStairs() { return z3_staircases_; }
215
216 const RoomLayout& GetLayout() const { return layout_; }
217
218
219 // Public getters and manipulators for tile objects
220 const std::vector<RoomObject>& GetTileObjects() const {
221 return tile_objects_;
222 }
223 std::vector<RoomObject>& GetTileObjects() { return tile_objects_; }
224
225 // Methods for modifying tile objects
226 void ClearTileObjects() { tile_objects_.clear(); }
227 void AddTileObject(const RoomObject& object) {
228 tile_objects_.push_back(object);
230 }
231
232 // Enhanced object manipulation (Phase 3)
233 absl::Status AddObject(const RoomObject& object);
234 absl::Status RemoveObject(size_t index);
235 absl::Status UpdateObject(size_t index, const RoomObject& object);
236 absl::StatusOr<size_t> FindObjectAt(int x, int y, int layer) const;
237 bool ValidateObject(const RoomObject& object) const;
238
239 // Performance optimization: Mark objects as dirty when modified
243 void RemoveTileObject(size_t index) {
244 if (index < tile_objects_.size()) {
245 tile_objects_.erase(tile_objects_.begin() + index);
247 }
248 }
249 size_t GetTileObjectCount() const { return tile_objects_.size(); }
250 RoomObject& GetTileObject(size_t index) { return tile_objects_[index]; }
251 const RoomObject& GetTileObject(size_t index) const {
252 return tile_objects_[index];
253 }
254
255 // For undo/redo functionality
256 void SetTileObjects(const std::vector<RoomObject>& objects) {
257 tile_objects_ = objects;
259 }
260
261 // Public setters for LoadRoomFromRom function
262 void SetBg2(background2 bg2) { bg2_ = bg2; }
264 void SetIsLight(bool is_light) { is_light_ = is_light; }
265 void SetPalette(uint8_t palette) {
266 if (this->palette != palette) {
267 this->palette = palette;
269 }
270 }
271 void SetBlockset(uint8_t blockset) {
272 if (this->blockset != blockset) {
273 this->blockset = blockset;
275 }
276 }
277 void SetSpriteset(uint8_t spriteset) {
278 if (this->spriteset != spriteset) {
279 this->spriteset = spriteset;
281 }
282 }
284 if (effect_ != effect) {
285 effect_ = effect;
287 }
288 }
290 if (tag1_ != tag1) {
291 tag1_ = tag1;
293 }
294 }
296 if (tag2_ != tag2) {
297 tag2_ = tag2;
299 }
300 }
301 void SetStaircasePlane(int index, uint8_t plane) {
302 if (index >= 0 && index < 4) staircase_plane_[index] = plane;
303 }
304 void SetHolewarp(uint8_t holewarp) { this->holewarp = holewarp; }
305 void SetStaircaseRoom(int index, uint8_t room) {
306 if (index >= 0 && index < 4) staircase_rooms_[index] = room;
307 }
308 // SetFloor1/SetFloor2 removed - use set_floor1()/set_floor2() instead (defined above)
309 void SetMessageId(uint16_t message_id) { message_id_ = message_id; }
310
311 // Getters for LoadRoomFromRom function
312 bool IsLight() const { return is_light_; }
313
314 // Additional setters for LoadRoomFromRom function
315 void SetMessageIdDirect(uint16_t message_id) { message_id_ = message_id; }
316 void SetLayer2Mode(uint8_t mode) { layer2_mode_ = mode; }
317 void SetLayerMerging(LayerMergeType merging) { layer_merging_ = merging; }
318 void SetIsDark(bool is_dark) { is_dark_ = is_dark; }
320 void SetBackgroundTileset(uint8_t tileset) { background_tileset_ = tileset; }
321 void SetSpriteTileset(uint8_t tileset) { sprite_tileset_ = tileset; }
322 void SetLayer2Behavior(uint8_t behavior) { layer2_behavior_ = behavior; }
325 void SetPitsTargetLayer(uint8_t layer) { pits_.target_layer = layer; }
326 void SetStair1TargetLayer(uint8_t layer) { stair1_.target_layer = layer; }
327 void SetStair2TargetLayer(uint8_t layer) { stair2_.target_layer = layer; }
328 void SetStair3TargetLayer(uint8_t layer) { stair3_.target_layer = layer; }
329 void SetStair4TargetLayer(uint8_t layer) { stair4_.target_layer = layer; }
330 void SetPitsTarget(uint8_t target) { pits_.target = target; }
331 void SetStair1Target(uint8_t target) { stair1_.target = target; }
332 void SetStair2Target(uint8_t target) { stair2_.target = target; }
333 void SetStair3Target(uint8_t target) { stair3_.target = target; }
334 void SetStair4Target(uint8_t target) { stair4_.target = target; }
335
336 // Loaded state
337 bool IsLoaded() const { return is_loaded_; }
338 void SetLoaded(bool loaded) { is_loaded_ = loaded; }
339
340 // Read-only accessors for metadata
341 EffectKey effect() const { return effect_; }
342 TagKey tag1() const { return tag1_; }
343 TagKey tag2() const { return tag2_; }
345 const LayerMergeType& layer_merging() const { return layer_merging_; }
346
347 int id() const { return room_id_; }
348
349 uint8_t blockset = 0;
350 uint8_t spriteset = 0;
351 uint8_t palette = 0;
352 uint8_t layout = 0;
353 uint8_t holewarp = 0;
354 // NOTE: floor1/floor2 removed - use floor1() and floor2() accessors instead
355 // Floor graphics are now private (floor1_graphics_, floor2_graphics_)
356 uint16_t message_id_ = 0;
357
358 // Floor graphics accessors (use these instead of direct members!)
359 uint8_t floor1() const { return floor1_graphics_; }
360 uint8_t floor2() const { return floor2_graphics_; }
361 void set_floor1(uint8_t value) {
362 if (floor1_graphics_ != value) {
363 floor1_graphics_ = value;
365 }
366 }
367 void set_floor2(uint8_t value) {
368 if (floor2_graphics_ != value) {
369 floor2_graphics_ = value;
371 }
372 }
373 // Enhanced object parsing methods
374 void ParseObjectsFromLocation(int objects_location);
375 void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY,
376 int& nbr_of_staircase);
377
378 // Object saving (Phase 1, Task 1.3)
379 absl::Status SaveObjects();
380 std::vector<uint8_t> EncodeObjects() const;
381
382 auto blocks() const { return blocks_; }
383 auto& mutable_blocks() { return blocks_; }
384 auto rom() { return rom_; }
385 auto mutable_rom() { return rom_; }
386 const std::array<uint8_t, 0x4000>& get_gfx_buffer() const { return current_gfx16_; }
387
388 // Per-room background buffers (not shared via arena!)
389 auto& bg1_buffer() { return bg1_buffer_; }
390 auto& bg2_buffer() { return bg2_buffer_; }
391 const auto& bg1_buffer() const { return bg1_buffer_; }
392 const auto& bg2_buffer() const { return bg2_buffer_; }
393
394 private:
396
397 std::array<uint8_t, 0x4000> current_gfx16_;
398
399 // Each room has its OWN background buffers and bitmaps
402
404 bool is_loaded_ = false;
406 bool is_floor_ = true;
407
408 // Performance optimization: Cache room properties to avoid unnecessary re-renders
409 uint8_t cached_blockset_ = 0xFF;
410 uint8_t cached_spriteset_ = 0xFF;
411 uint8_t cached_palette_ = 0xFF;
412 uint8_t cached_layout_ = 0xFF;
415 uint8_t cached_effect_ = 0xFF;
418
419 // Dirty flags for selective rendering
420 bool graphics_dirty_ = true;
421 bool objects_dirty_ = true;
422 bool layout_dirty_ = true;
423 bool textures_dirty_ = true;
424
427
430
434 uint8_t palette_;
438
439 std::array<uint8_t, 16> blocks_;
440 std::array<chest, 16> chest_list_;
441
442 std::vector<RoomObject> tile_objects_;
443 // TODO: add separate door objects list when door section (F0 FF) is parsed
444 std::vector<zelda3::Sprite> sprites_;
445 std::vector<staircase> z3_staircases_;
446 std::vector<chest_data> chests_in_room_;
448
449
455
462};
463
464// Loads a room from the ROM.
465Room LoadRoomFromRom(Rom* rom, int room_id);
466
467struct RoomSize {
469 int64_t room_size;
470};
471
472// Calculates the size of a room in the ROM.
473RoomSize CalculateRoomSize(Rom* rom, int room_id);
474
475static const std::string RoomEffect[] = {"Nothing",
476 "Nothing",
477 "Moving Floor",
478 "Moving Water",
479 "Trinexx Shell",
480 "Red Flashes",
481 "Light Torch to See Floor",
482 "Ganon's Darkness"};
483
484constexpr std::string_view kRoomNames[] = {
485 "Ganon",
486 "Hyrule Castle (North Corridor)",
487 "Behind Sanctuary (Switch)",
488 "Houlihan",
489 "Turtle Rock (Crysta-Roller)",
490 "Empty",
491 "Swamp Palace (Arrghus[Boss])",
492 "Tower of Hera (Moldorm[Boss])",
493 "Cave (Healing Fairy)",
494 "Palace of Darkness",
495 "Palace of Darkness (Stalfos Trap)",
496 "Palace of Darkness (Turtle)",
497 "Ganon's Tower (Entrance)",
498 "Ganon's Tower (Agahnim2[Boss])",
499 "Ice Palace (Entrance )",
500 "Empty Clone ",
501 "Ganon Evacuation Route",
502 "Hyrule Castle (Bombable Stock )",
503 "Sanctuary",
504 "Turtle Rock (Hokku-Bokku Key 2)",
505 "Turtle Rock (Big Key )",
506 "Turtle Rock",
507 "Swamp Palace (Swimming Treadmill)",
508 "Tower of Hera (Moldorm Fall )",
509 "Cave",
510 "Palace of Darkness (Dark Maze)",
511 "Palace of Darkness (Big Chest )",
512 "Palace of Darkness (Mimics / Moving Wall )",
513 "Ganon's Tower (Ice Armos)",
514 "Ganon's Tower (Final Hallway)",
515 "Ice Palace (Bomb Floor / Bari )",
516 "Ice Palace (Pengator / Big Key )",
517 "Agahnim's Tower (Agahnim[Boss])",
518 "Hyrule Castle (Key-rat )",
519 "Hyrule Castle (Sewer Text Trigger )",
520 "Turtle Rock (West Exit to Balcony)",
521 "Turtle Rock (Double Hokku-Bokku / Big chest )",
522 "Empty Clone ",
523 "Swamp Palace (Statue )",
524 "Tower of Hera (Big Chest)",
525 "Swamp Palace (Entrance )",
526 "Skull Woods (Mothula[Boss])",
527 "Palace of Darkness (Big Hub )",
528 "Palace of Darkness (Map Chest / Fairy )",
529 "Cave",
530 "Empty Clone ",
531 "Ice Palace (Compass )",
532 "Cave (Kakariko Well HP)",
533 "Agahnim's Tower (Maiden Sacrifice Chamber)",
534 "Tower of Hera (Hardhat Beetles )",
535 "Hyrule Castle (Sewer Key Chest )",
536 "Desert Palace (Lanmolas[Boss])",
537 "Swamp Palace (Push Block Puzzle / Pre-Big Key )",
538 "Swamp Palace (Big Key / BS )",
539 "Swamp Palace (Big Chest )",
540 "Swamp Palace (Map Chest / Water Fill )",
541 "Swamp Palace (Key Pot )",
542 "Skull Woods (Gibdo Key / Mothula Hole )",
543 "Palace of Darkness (Bombable Floor )",
544 "Palace of Darkness (Spike Block / Conveyor )",
545 "Cave",
546 "Ganon's Tower (Torch 2)",
547 "Ice Palace (Stalfos Knights / Conveyor Hellway)",
548 "Ice Palace (Map Chest )",
549 "Agahnim's Tower (Final Bridge )",
550 "Hyrule Castle (First Dark )",
551 "Hyrule Castle (6 Ropes )",
552 "Desert Palace (Torch Puzzle / Moving Wall )",
553 "Thieves Town (Big Chest )",
554 "Thieves Town (Jail Cells )",
555 "Swamp Palace (Compass Chest )",
556 "Empty Clone ",
557 "Empty Clone ",
558 "Skull Woods (Gibdo Torch Puzzle )",
559 "Palace of Darkness (Entrance )",
560 "Palace of Darkness (Warps / South Mimics )",
561 "Ganon's Tower (Mini-Helmasaur Conveyor )",
562 "Ganon's Tower (Moldorm )",
563 "Ice Palace (Bomb-Jump )",
564 "Ice Palace Clone (Fairy )",
565 "Hyrule Castle (West Corridor)",
566 "Hyrule Castle (Throne )",
567 "Hyrule Castle (East Corridor)",
568 "Desert Palace (Popos 2 / Beamos Hellway )",
569 "Swamp Palace (Upstairs Pits )",
570 "Castle Secret Entrance / Uncle Death ",
571 "Skull Woods (Key Pot / Trap )",
572 "Skull Woods (Big Key )",
573 "Skull Woods (Big Chest )",
574 "Skull Woods (Final Section Entrance )",
575 "Palace of Darkness (Helmasaur King[Boss])",
576 "Ganon's Tower (Spike Pit )",
577 "Ganon's Tower (Ganon-Ball Z)",
578 "Ganon's Tower (Gauntlet 1/2/3)",
579 "Ice Palace (Lonely Firebar)",
580 "Ice Palace (Hidden Chest / Spike Floor )",
581 "Hyrule Castle (West Entrance )",
582 "Hyrule Castle (Main Entrance )",
583 "Hyrule Castle (East Entrance )",
584 "Desert Palace (Final Section Entrance )",
585 "Thieves Town (West Attic )",
586 "Thieves Town (East Attic )",
587 "Swamp Palace (Hidden Chest / Hidden Door )",
588 "Skull Woods (Compass Chest )",
589 "Skull Woods (Key Chest / Trap )",
590 "Empty Clone ",
591 "Palace of Darkness (Rupee )",
592 "Ganon's Tower (Mimics s)",
593 "Ganon's Tower (Lanmolas )",
594 "Ganon's Tower (Gauntlet 4/5)",
595 "Ice Palace (Pengators )",
596 "Empty Clone ",
597 "Hyrule Castle (Small Corridor to Jail Cells)",
598 "Hyrule Castle (Boomerang Chest )",
599 "Hyrule Castle (Map Chest )",
600 "Desert Palace (Big Chest )",
601 "Desert Palace (Map Chest )",
602 "Desert Palace (Big Key Chest )",
603 "Swamp Palace (Water Drain )",
604 "Tower of Hera (Entrance )",
605 "Empty Clone ",
606 "Empty Clone ",
607 "Empty Clone ",
608 "Ganon's Tower",
609 "Ganon's Tower (East Side Collapsing Bridge / Exploding Wall )",
610 "Ganon's Tower (Winder / Warp Maze )",
611 "Ice Palace (Hidden Chest / Bombable Floor )",
612 "Ice Palace ( Big Spike Traps )",
613 "Hyrule Castle (Jail Cell )",
614 "Hyrule Castle",
615 "Hyrule Castle (Basement Chasm )",
616 "Desert Palace (West Entrance )",
617 "Desert Palace (Main Entrance )",
618 "Desert Palace (East Entrance )",
619 "Empty Clone ",
620 "Tower of Hera (Tile )",
621 "Empty Clone ",
622 "Eastern Palace (Fairy )",
623 "Empty Clone ",
624 "Ganon's Tower (Block Puzzle / Spike Skip / Map Chest )",
625 "Ganon's Tower (East and West Downstairs / Big Chest )",
626 "Ganon's Tower (Tile / Torch Puzzle )",
627 "Ice Palace",
628 "Empty Clone ",
629 "Misery Mire (Vitreous[Boss])",
630 "Misery Mire (Final Switch )",
631 "Misery Mire (Dark Bomb Wall / Switches )",
632 "Misery Mire (Dark Cane Floor Switch Puzzle )",
633 "Empty Clone ",
634 "Ganon's Tower (Final Collapsing Bridge )",
635 "Ganon's Tower (Torches 1 )",
636 "Misery Mire (Torch Puzzle / Moving Wall )",
637 "Misery Mire (Entrance )",
638 "Eastern Palace (Eyegore Key )",
639 "Empty Clone ",
640 "Ganon's Tower (Many Spikes / Warp Maze )",
641 "Ganon's Tower (Invisible Floor Maze )",
642 "Ganon's Tower (Compass Chest / Invisible Floor )",
643 "Ice Palace (Big Chest )",
644 "Ice Palace",
645 "Misery Mire (Pre-Vitreous )",
646 "Misery Mire (Fish )",
647 "Misery Mire (Bridge Key Chest )",
648 "Misery Mire",
649 "Turtle Rock (Trinexx[Boss])",
650 "Ganon's Tower (Wizzrobes s)",
651 "Ganon's Tower (Moldorm Fall )",
652 "Tower of Hera (Fairy )",
653 "Eastern Palace (Stalfos Spawn )",
654 "Eastern Palace (Big Chest )",
655 "Eastern Palace (Map Chest )",
656 "Thieves Town (Moving Spikes / Key Pot )",
657 "Thieves Town (Blind The Thief[Boss])",
658 "Empty Clone ",
659 "Ice Palace",
660 "Ice Palace (Ice Bridge )",
661 "Agahnim's Tower (Circle of Pots)",
662 "Misery Mire (Hourglass )",
663 "Misery Mire (Slug )",
664 "Misery Mire (Spike Key Chest )",
665 "Turtle Rock (Pre-Trinexx )",
666 "Turtle Rock (Dark Maze)",
667 "Turtle Rock (Chain Chomps )",
668 "Turtle Rock (Map Chest / Key Chest / Roller )",
669 "Eastern Palace (Big Key )",
670 "Eastern Palace (Lobby Cannonballs )",
671 "Eastern Palace (Dark Antifairy / Key Pot )",
672 "Thieves Town (Hellway)",
673 "Thieves Town (Conveyor Toilet)",
674 "Empty Clone ",
675 "Ice Palace (Block Puzzle )",
676 "Ice Palace Clone (Switch )",
677 "Agahnim's Tower (Dark Bridge )",
678 "Misery Mire (Compass Chest / Tile )",
679 "Misery Mire (Big Hub )",
680 "Misery Mire (Big Chest )",
681 "Turtle Rock (Final Crystal Switch Puzzle )",
682 "Turtle Rock (Laser Bridge)",
683 "Turtle Rock",
684 "Turtle Rock (Torch Puzzle)",
685 "Eastern Palace (Armos Knights[Boss])",
686 "Eastern Palace (Entrance )",
687 "??",
688 "Thieves Town (North West Entrance )",
689 "Thieves Town (North East Entrance )",
690 "Empty Clone ",
691 "Ice Palace (Hole to Kholdstare )",
692 "Empty Clone ",
693 "Agahnim's Tower (Dark Maze)",
694 "Misery Mire (Conveyor Slug / Big Key )",
695 "Misery Mire (Mire02 / Wizzrobes )",
696 "Empty Clone ",
697 "Empty Clone ",
698 "Turtle Rock (Laser Key )",
699 "Turtle Rock (Entrance )",
700 "Empty Clone ",
701 "Eastern Palace (Zeldagamer / Pre-Armos Knights )",
702 "Eastern Palace (Canonball ",
703 "Eastern Palace",
704 "Thieves Town (Main (South West) Entrance )",
705 "Thieves Town (South East Entrance )",
706 "Empty Clone ",
707 "Ice Palace (Kholdstare[Boss])",
708 "Cave",
709 "Agahnim's Tower (Entrance )",
710 "Cave (Lost Woods HP)",
711 "Cave (Lumberjack's Tree HP)",
712 "Cave (1/2 Magic)",
713 "Cave (Lost Old Man Final Cave)",
714 "Cave (Lost Old Man Final Cave)",
715 "Cave",
716 "Cave",
717 "Cave",
718 "Empty Clone ",
719 "Cave (Spectacle Rock HP)",
720 "Cave",
721 "Empty Clone ",
722 "Cave",
723 "Cave (Spiral Cave)",
724 "Cave (Crystal Switch / 5 Chests )",
725 "Cave (Lost Old Man Starting Cave)",
726 "Cave (Lost Old Man Starting Cave)",
727 "House",
728 "House (Old Woman (Sahasrahla's Wife?))",
729 "House (Angry Brothers)",
730 "House (Angry Brothers)",
731 "Empty Clone ",
732 "Empty Clone ",
733 "Cave",
734 "Cave",
735 "Cave",
736 "Cave",
737 "Empty Clone ",
738 "Cave",
739 "Cave",
740 "Cave",
741
742 "Chest Minigame",
743 "Houses",
744 "Sick Boy house",
745 "Tavern",
746 "Link's House",
747 "Sarashrala Hut",
748 "Chest Minigame",
749 "Library",
750 "Chicken House",
751 "Witch Shop",
752 "A Aginah's Cave",
753 "Dam",
754 "Mimic Cave",
755 "Mire Shed",
756 "Cave",
757 "Shop",
758 "Shop",
759 "Archery Minigame",
760 "DW Church/Shop",
761 "Grave Cave",
762 "Fairy Fountain",
763 "Fairy Upgrade",
764 "Pyramid Fairy",
765 "Spike Cave",
766 "Chest Minigame",
767 "Blind Hut",
768 "Bonzai Cave",
769 "Circle of bush Cave",
770 "Big Bomb Shop, C-House",
771 "Blind Hut 2",
772 "Hype Cave",
773 "Shop",
774 "Ice Cave",
775 "Smith",
776 "Fortune Teller",
777 "MiniMoldorm Cave",
778 "Under Rock Caves",
779 "Smith",
780 "Cave",
781 "Mazeblock Cave",
782 "Smith Peg Cave"};
783
784static const std::string RoomTag[] = {"Nothing",
785 "NW Kill Enemy to Open",
786 "NE Kill Enemy to Open",
787 "SW Kill Enemy to Open",
788 "SE Kill Enemy to Open",
789 "W Kill Enemy to Open",
790 "E Kill Enemy to Open",
791 "N Kill Enemy to Open",
792 "S Kill Enemy to Open",
793 "Clear Quadrant to Open",
794 "Clear Full Tile to Open",
795
796 "NW Push Block to Open",
797 "NE Push Block to Open",
798 "SW Push Block to Open",
799 "SE Push Block to Open",
800 "W Push Block to Open",
801 "E Push Block to Open",
802 "N Push Block to Open",
803 "S Push Block to Open",
804 "Push Block to Open",
805 "Pull Lever to Open",
806 "Collect Prize to Open",
807
808 "Hold Switch Open Door",
809 "Toggle Switch to Open Door",
810 "Turn off Water",
811 "Turn on Water",
812 "Water Gate",
813 "Water Twin",
814 "Moving Wall Right",
815 "Moving Wall Left",
816 "Crash",
817 "Crash",
818 "Push Switch Exploding Wall",
819 "Holes 0",
820 "Open Chest (Holes 0)",
821 "Holes 1",
822 "Holes 2",
823 "Defeat Boss for Dungeon Prize",
824
825 "SE Kill Enemy to Push Block",
826 "Trigger Switch Chest",
827 "Pull Lever Exploding Wall",
828 "NW Kill Enemy for Chest",
829 "NE Kill Enemy for Chest",
830 "SW Kill Enemy for Chest",
831 "SE Kill Enemy for Chest",
832 "W Kill Enemy for Chest",
833 "E Kill Enemy for Chest",
834 "N Kill Enemy for Chest",
835 "S Kill Enemy for Chest",
836 "Clear Quadrant for Chest",
837 "Clear Full Tile for Chest",
838
839 "Light Torches to Open",
840 "Holes 3",
841 "Holes 4",
842 "Holes 5",
843 "Holes 6",
844 "Agahnim Room",
845 "Holes 7",
846 "Holes 8",
847 "Open Chest for Holes 8",
848 "Push Block for Chest",
849 "Clear Room for Triforce Door",
850 "Light Torches for Chest",
851 "Kill Boss Again"};
852
853} // namespace zelda3
854} // namespace yaze
855
856#endif
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
void SetBlockset(uint8_t blockset)
Definition room.h:271
Room(int room_id, Rom *rom)
Definition room.h:185
bool ValidateObject(const RoomObject &object) const
Definition room.cc:875
destination pits_
Definition room.h:457
std::vector< RoomObject > tile_objects_
Definition room.h:442
uint8_t cached_blockset_
Definition room.h:409
void SetSpriteset(uint8_t spriteset)
Definition room.h:277
EffectKey effect_
Definition room.h:452
uint8_t palette_
Definition room.h:434
void SetTag2Direct(TagKey tag2)
Definition room.h:324
uint8_t cached_layout_
Definition room.h:412
uint8_t staircase_plane_[4]
Definition room.h:428
absl::Status UpdateObject(size_t index, const RoomObject &object)
Definition room.cc:851
TagKey cached_tag2_
Definition room.h:417
void AddTileObject(const RoomObject &object)
Definition room.h:227
void MarkLayoutDirty()
Definition room.h:242
void SetStair4Target(uint8_t target)
Definition room.h:334
void SetPitsTarget(uint8_t target)
Definition room.h:330
void SetIsLight(bool is_light)
Definition room.h:264
void LoadChests()
Definition room.cc:978
void SetMessageId(uint16_t message_id)
Definition room.h:309
void MarkObjectsDirty()
Definition room.h:240
gfx::BackgroundBuffer bg2_buffer_
Definition room.h:401
void ClearTileObjects()
Definition room.h:226
const std::vector< chest_data > & GetChests() const
Definition room.h:209
uint8_t cached_floor2_graphics_
Definition room.h:414
std::vector< zelda3::Sprite > sprites_
Definition room.h:444
auto mutable_rom()
Definition room.h:385
void SetLoaded(bool loaded)
Definition room.h:338
std::array< uint8_t, 0x4000 > current_gfx16_
Definition room.h:397
void CopyRoomGraphicsToBuffer()
Definition room.cc:228
destination stair2_
Definition room.h:459
uint8_t cached_palette_
Definition room.h:411
std::vector< staircase > & GetStairs()
Definition room.h:214
void LoadRoomGraphics(uint8_t entrance_blockset=0xFF)
Definition room.cc:195
void set_floor2(uint8_t value)
Definition room.h:367
uint8_t cached_effect_
Definition room.h:415
bool graphics_dirty_
Definition room.h:420
void SetStaircaseRoom(int index, uint8_t room)
Definition room.h:305
uint8_t layer2_behavior_
Definition room.h:433
absl::Status RemoveObject(size_t index)
Definition room.cc:841
void SetStair1TargetLayer(uint8_t layer)
Definition room.h:326
void set_floor1(uint8_t value)
Definition room.h:361
void MarkGraphicsDirty()
Definition room.h:241
void LoadBlocks()
Definition room.cc:1089
bool layout_dirty_
Definition room.h:422
void SetLayer2Mode(uint8_t mode)
Definition room.h:316
RoomLayout layout_
Definition room.h:447
uint8_t layer2_mode_
Definition room.h:437
void LoadLayoutTilesToBuffer()
Definition room.cc:435
auto & mutable_blocks()
Definition room.h:383
void SetTag2(TagKey tag2)
Definition room.h:295
uint8_t holewarp
Definition room.h:353
bool IsLoaded() const
Definition room.h:337
void ParseObjectsFromLocation(int objects_location)
Definition room.cc:656
uint8_t cached_floor1_graphics_
Definition room.h:413
std::vector< zelda3::Sprite > & GetSprites()
Definition room.h:206
void SetTag1Direct(TagKey tag1)
Definition room.h:323
void LoadTorches()
Definition room.cc:1015
void SetPaletteDirect(uint8_t palette)
Definition room.h:319
TagKey tag2() const
Definition room.h:343
destination stair4_
Definition room.h:461
void SetStair2Target(uint8_t target)
Definition room.h:332
size_t GetTileObjectCount() const
Definition room.h:249
uint8_t floor2() const
Definition room.h:360
int animated_frame_
Definition room.h:426
void SetCollision(CollisionKey collision)
Definition room.h:263
uint8_t blockset
Definition room.h:349
const std::vector< staircase > & GetStairs() const
Definition room.h:213
gfx::BackgroundBuffer bg1_buffer_
Definition room.h:400
absl::Status SaveObjects()
Definition room.cc:783
RoomObject & GetTileObject(size_t index)
Definition room.h:250
void SetStaircasePlane(int index, uint8_t plane)
Definition room.h:301
void SetIsDark(bool is_dark)
Definition room.h:318
bool objects_dirty_
Definition room.h:421
uint8_t layout
Definition room.h:352
void RenderRoomGraphics()
Definition room.cc:289
bool textures_dirty_
Definition room.h:423
uint8_t sprite_tileset_
Definition room.h:432
std::vector< RoomObject > & GetTileObjects()
Definition room.h:223
uint16_t message_id_
Definition room.h:356
TagKey tag1() const
Definition room.h:342
CollisionKey collision() const
Definition room.h:344
const RoomLayout & GetLayout() const
Definition room.h:216
uint8_t staircase_rooms_[4]
Definition room.h:429
const auto & bg1_buffer() const
Definition room.h:391
std::vector< uint8_t > EncodeObjects() const
Definition room.cc:732
void SetEffect(EffectKey effect)
Definition room.h:283
std::array< uint8_t, 16 > blocks_
Definition room.h:439
void SetTag1(TagKey tag1)
Definition room.h:289
void SetBackgroundTileset(uint8_t tileset)
Definition room.h:320
void SetStair3TargetLayer(uint8_t layer)
Definition room.h:328
const std::vector< zelda3::Sprite > & GetSprites() const
Definition room.h:205
uint8_t floor2_graphics_
Definition room.h:436
background2 bg2_
Definition room.h:456
std::array< chest, 16 > chest_list_
Definition room.h:440
auto & bg1_buffer()
Definition room.h:389
const std::vector< RoomObject > & GetTileObjects() const
Definition room.h:220
bool IsLight() const
Definition room.h:312
uint8_t floor1_graphics_
Definition room.h:435
void SetMessageIdDirect(uint16_t message_id)
Definition room.h:315
const LayerMergeType & layer_merging() const
Definition room.h:345
auto blocks() const
Definition room.h:382
void SetLayerMerging(LayerMergeType merging)
Definition room.h:317
void SetPitsTargetLayer(uint8_t layer)
Definition room.h:325
void LoadObjects()
Definition room.cc:606
uint8_t spriteset
Definition room.h:350
const std::array< uint8_t, 0x4000 > & get_gfx_buffer() const
Definition room.h:386
EffectKey effect() const
Definition room.h:341
void SetSpriteTileset(uint8_t tileset)
Definition room.h:321
void SetStair1Target(uint8_t target)
Definition room.h:331
destination stair3_
Definition room.h:460
void SetBg2(background2 bg2)
Definition room.h:262
std::vector< chest_data > & GetChests()
Definition room.h:210
uint8_t floor1() const
Definition room.h:359
uint8_t palette
Definition room.h:351
void SetTileObjects(const std::vector< RoomObject > &objects)
Definition room.h:256
void LoadAnimatedGraphics()
Definition room.cc:545
std::vector< chest_data > chests_in_room_
Definition room.h:446
LayerMergeType layer_merging_
Definition room.h:450
const RoomObject & GetTileObject(size_t index) const
Definition room.h:251
uint8_t cached_spriteset_
Definition room.h:410
std::vector< staircase > z3_staircases_
Definition room.h:445
void SetPalette(uint8_t palette)
Definition room.h:265
void LoadSprites()
Definition room.cc:929
TagKey cached_tag1_
Definition room.h:416
void SetHolewarp(uint8_t holewarp)
Definition room.h:304
destination stair1_
Definition room.h:458
uint8_t background_tileset_
Definition room.h:431
void SetStair3Target(uint8_t target)
Definition room.h:333
void HandleSpecialObjects(short oid, uint8_t posX, uint8_t posY, int &nbr_of_staircase)
Definition room.cc:892
void SetStair4TargetLayer(uint8_t layer)
Definition room.h:329
absl::Status AddObject(const RoomObject &object)
Definition room.cc:829
absl::StatusOr< size_t > FindObjectAt(int x, int y, int layer) const
Definition room.cc:865
void RemoveTileObject(size_t index)
Definition room.h:243
void SetStair2TargetLayer(uint8_t layer)
Definition room.h:327
const auto & bg2_buffer() const
Definition room.h:392
void RenderObjectsToBackground()
Definition room.cc:477
CollisionKey collision_
Definition room.h:451
auto & bg2_buffer()
Definition room.h:390
void SetLayer2Behavior(uint8_t behavior)
Definition room.h:322
int id() const
Definition room.h:347
zelda3_bg2_effect
Background layer 2 effects.
Definition zelda.h:368
constexpr int kBlocksPointer4
constexpr int kRoomObjectLayoutPointer
constexpr int kDoorPosUp
constexpr int kDoorPointers
constexpr int room_object_layout_pointer
Definition room.h:24
constexpr int kDoorGfxDown
constexpr int chests_length_pointer
Definition room.h:31
constexpr int kSpritesEndData
constexpr int kTorchesLengthPointer
constexpr int door_pos_down
Definition room.h:54
constexpr int door_gfx_up
Definition room.h:48
constexpr int chests_data_pointer1
Definition room.h:32
constexpr int pit_count
Definition room.h:46
constexpr int blocks_pointer3
Definition room.h:37
constexpr int door_gfx_left
Definition room.h:51
constexpr int kChestsLengthPointer
constexpr int dungeons_palettes
Definition room.h:27
constexpr int blocks_pointer4
Definition room.h:38
@ Ganon_Room
Definition room.h:112
@ Moving_Floor
Definition room.h:107
@ Effect_Nothing
Definition room.h:105
@ Red_Flashes
Definition room.h:110
@ Moving_Water
Definition room.h:108
@ Torch_Show_Floor
Definition room.h:111
constexpr int sprites_data_empty_room
Definition room.h:43
constexpr int kMessagesIdDungeon
constexpr int door_pos_left
Definition room.h:55
constexpr int NumberOfRooms
Definition room.h:60
constexpr int rooms_sprite_pointer
Definition room.h:29
constexpr int kDungeonsMainBgPalettePointers
RoomSize CalculateRoomSize(Rom *rom, int room_id)
Definition room.cc:21
constexpr int kSpriteBlocksetPointer
constexpr int kPitPointer
constexpr int kSpritesData
@ Kill_boss_Again
Definition room.h:179
@ Secret_Wall_Right
Definition room.h:144
@ Kill_Enemy_to_clear_level
Definition room.h:153
@ NE_Kill_Enemy_to_Open
Definition room.h:118
@ S_Kill_Enemy_for_Chest
Definition room.h:164
@ N_Push_Block_to_Open
Definition room.h:133
@ E_Kill_Enemy_to_Open
Definition room.h:122
@ Light_Torches_to_Open
Definition room.h:167
@ N_Kill_Enemy_to_Open
Definition room.h:123
@ W_Kill_Enemy_for_Chest
Definition room.h:161
@ Water_Twin
Definition room.h:143
@ N_Kill_Enemy_for_Chest
Definition room.h:163
@ Clear_Level_to_Open
Definition room.h:137
@ Push_Block_to_Open
Definition room.h:135
@ E_Kill_Enemy_for_Chest
Definition room.h:162
@ Secret_Wall_Left
Definition room.h:145
@ NE_Push_Block_to_Open
Definition room.h:128
@ Open_Chest_for_Holes_8
Definition room.h:175
@ S_Kill_Enemy_to_Open
Definition room.h:124
@ S_Push_Block_to_Open
Definition room.h:134
@ Trigger_activated_Chest
Definition room.h:155
@ SW_Kill_Enemy_for_Chest
Definition room.h:159
@ SE_Kill_Enemy_for_Chest
Definition room.h:160
@ Pull_lever_to_Bomb_Wall
Definition room.h:156
@ Pull_Switch_to_bomb_Wall
Definition room.h:148
@ Agahnim_Room
Definition room.h:172
@ Water_Gate
Definition room.h:142
@ SE_Kill_Enemy_to_Move_Block
Definition room.h:154
@ NE_Kill_Enemy_for_Chest
Definition room.h:158
@ SE_Push_Block_to_Open
Definition room.h:130
@ Pull_Lever_to_Open
Definition room.h:136
@ W_Push_Block_to_Open
Definition room.h:131
@ E_Push_Block_to_Open
Definition room.h:132
@ Kill_to_open_Ganon_Door
Definition room.h:177
@ SW_Push_Block_to_Open
Definition room.h:129
@ Turn_on_Water
Definition room.h:141
@ W_Kill_Enemy_to_Open
Definition room.h:121
@ Open_Chest_Activate_Holes_0
Definition room.h:150
@ Clear_Room_for_Chest
Definition room.h:166
@ Clear_Room_to_Open
Definition room.h:126
@ NW_Push_Block_to_Open
Definition room.h:127
@ Switch_Open_Door_Toggle
Definition room.h:139
@ SW_Kill_Enemy_to_Open
Definition room.h:119
@ Clear_Quadrant_for_Chest
Definition room.h:165
@ NW_Kill_Enemy_to_Open
Definition room.h:117
@ Switch_Open_Door_Hold
Definition room.h:138
@ SE_Kill_Enemy_to_Open
Definition room.h:120
@ Turn_off_Water
Definition room.h:140
@ Clear_Quadrant_to_Open
Definition room.h:125
@ Push_Block_for_Chest
Definition room.h:176
@ NW_Kill_Enemy_for_Chest
Definition room.h:157
@ Light_Torches_to_get_Chest
Definition room.h:178
constexpr std::string_view kRoomNames[]
Definition room.h:484
constexpr int messages_id_dungeon
Definition room.h:33
constexpr int room_items_pointers
Definition room.h:28
constexpr int blocks_length
Definition room.h:34
constexpr int kDoorPosLeft
constexpr int sprites_data
Definition room.h:42
constexpr int kTileAddress
constexpr int kPitCount
constexpr int kRoomsSpritePointer
constexpr int sprite_blockset_pointer
Definition room.h:41
constexpr int kTileAddressFloor
constexpr int kDoorPosDown
constexpr int tile_address_floor
Definition room.h:59
constexpr int blocks_pointer2
Definition room.h:36
constexpr int dungeons_main_bg_palette_pointers
Definition room.h:26
constexpr int door_gfx_down
Definition room.h:49
constexpr int kChestsDataPointer1
constexpr int kBlocksLength
constexpr int kBlocksPointer1
constexpr int kRoomItemsPointers
constexpr int kDoorGfxLeft
constexpr int kDoorGfxCaveExitDown
constexpr uint16_t stairsObjects[]
Definition room.h:61
Room LoadRoomFromRom(Rom *rom, int room_id)
Definition room.cc:75
constexpr int gfx_groups_pointer
Definition room.h:30
constexpr int blocks_pointer1
Definition room.h:35
constexpr int torches_length_pointer
Definition room.h:40
constexpr int kDungeonSpritePointers
constexpr int doorPointers
Definition room.h:47
constexpr int kNumberOfRooms
constexpr int kDoorPosRight
constexpr int door_gfx_cavexit_down
Definition room.h:50
constexpr int kBlocksPointer3
constexpr int torch_data
Definition room.h:39
constexpr int kGfxGroupsPointer
constexpr int kDungeonsPalettes
constexpr int kDoorGfxUp
constexpr int door_gfx_right
Definition room.h:52
constexpr int kTorchData
constexpr int room_object_pointer
Definition room.h:25
constexpr int door_pos_up
Definition room.h:53
constexpr int kDoorGfxRight
constexpr int door_pos_right
Definition room.h:56
constexpr int tile_address
Definition room.h:58
constexpr int sprites_end_data
Definition room.h:44
constexpr int pit_pointer
Definition room.h:45
constexpr int kSpritesDataEmptyRoom
constexpr int kBlocksPointer2
@ Moving_Water_Collision
Definition room.h:101
@ One_Collision
Definition room.h:97
@ Moving_Floor_Collision
Definition room.h:100
@ Both_With_Scroll
Definition room.h:99
constexpr int kRoomObjectPointer
constexpr int dungeon_spr_ptrs
Definition room.h:57
Main namespace for the application.
Room transition destination.
Definition zelda.h:447
uint8_t target_layer
Definition zelda.h:450
uint8_t target
Definition zelda.h:449
LayerMergeType(uint8_t id, std::string name, bool see, bool top, bool trans)
Definition room.h:73
int64_t room_size_pointer
Definition room.h:468
Yet Another Zelda3 Editor (YAZE) - Public C API.