diff --git a/src/app/zelda3/dungeon/room.cc b/src/app/zelda3/dungeon/room.cc index f6a422ab..44ae129a 100644 --- a/src/app/zelda3/dungeon/room.cc +++ b/src/app/zelda3/dungeon/room.cc @@ -117,7 +117,7 @@ void Room::LoadHeader() { std::cout << "Size of Room #" << room_id_ << ": " << std::dec << room_size << " bytes" << std::endl; } - } catch (const std::exception& e) { + } catch (const std::exception &e) { std::cout << "Error: " << e.what() << std::endl; } } @@ -184,8 +184,8 @@ void Room::LoadRoomFromROM() { hpos++; // Load room objects - int objectPointer = core::SnesToPc(room_object_pointer); - int room_address = objectPointer + (room_id_ * 3); + int object_pointer = core::SnesToPc(room_object_pointer); + int room_address = object_pointer + (room_id_ * 3); int objects_location = core::SnesToPc(room_address); // Load sprites @@ -195,18 +195,18 @@ void Room::LoadRoomFromROM() { } void Room::LoadRoomGraphics(uchar entrance_blockset) { - const auto& mainGfx = rom()->main_blockset_ids; - const auto& roomGfx = rom()->room_blockset_ids; - const auto& spriteGfx = rom()->spriteset_ids; + const auto &main_gfx = rom()->main_blockset_ids; + const auto &room_gfx = rom()->room_blockset_ids; + const auto &sprite_gfx = rom()->spriteset_ids; current_gfx16_.reserve(0x4000); for (int i = 0; i < 8; i++) { - blocks_[i] = mainGfx[blockset][i]; + blocks_[i] = main_gfx[blockset][i]; if (i >= 6 && i <= 6) { // 3-6 if (entrance_blockset != 0xFF) { - if (roomGfx[entrance_blockset][i - 3] != 0) { - blocks_[i] = roomGfx[entrance_blockset][i - 3]; + if (room_gfx[entrance_blockset][i - 3] != 0) { + blocks_[i] = room_gfx[entrance_blockset][i - 3]; } } } @@ -217,7 +217,7 @@ void Room::LoadRoomGraphics(uchar entrance_blockset) { blocks_[10] = 115 + 6; blocks_[11] = 115 + 7; for (int i = 0; i < 4; i++) { - blocks_[12 + i] = (uchar)(spriteGfx[spriteset + 64][i] + 115); + blocks_[12 + i] = (uchar)(sprite_gfx[spriteset + 64][i] + 115); } // 12-16 sprites } @@ -276,11 +276,11 @@ void Room::LoadAnimatedGraphics() { void Room::LoadObjects() { auto rom_data = rom()->vector(); - int objectPointer = (rom_data[room_object_pointer + 2] << 16) + - (rom_data[room_object_pointer + 1] << 8) + - (rom_data[room_object_pointer]); - objectPointer = core::SnesToPc(objectPointer); - int room_address = objectPointer + (room_id_ * 3); + int object_pointer = (rom_data[room_object_pointer + 2] << 16) + + (rom_data[room_object_pointer + 1] << 8) + + (rom_data[room_object_pointer]); + object_pointer = core::SnesToPc(object_pointer); + int room_address = object_pointer + (room_id_ * 3); int tile_address = (rom_data[room_address + 2] << 16) + (rom_data[room_address + 1] << 8) + rom_data[room_address]; @@ -388,27 +388,28 @@ void Room::LoadObjects() { } } } - /** + if (oid == 0xF99) { - if (chests_in_room.size() > 0) { - tilesObjects.back().options |= ObjectOption::Chest; - chest_list.push_back( - Chest(posX, posY, chests_in_room.front().itemIn, false)); - chests_in_room.erase(chests_in_room.begin()); + if (chests_in_room_.size() > 0) { + tile_objects_.back().set_options(ObjectOption::Chest | + tile_objects_.back().options()); + // chest_list_.push_back( + // Chest(posX, posY, chests_in_room_.front().itemIn, false)); + chests_in_room_.erase(chests_in_room_.begin()); } } else if (oid == 0xFB1) { - if (chests_in_room.size() > 0) { - tilesObjects.back().options |= ObjectOption::Chest; - chest_list.push_back( - Chest(posX + 1, posY, chests_in_room.front().itemIn, true)); - chests_in_room.erase(chests_in_room.begin()); + if (chests_in_room_.size() > 0) { + tile_objects_.back().set_options(ObjectOption::Chest | + tile_objects_.back().options()); + // chest_list_.push_back( + // Chest(posX + 1, posY, chests_in_room_.front().item_in, true)); + chests_in_room_.erase(chests_in_room_.begin()); } } } else { - tilesObjects.push_back(object_door(static_cast((b2 << 8) + b1), 0, - 0, 0, static_cast(layer))); - } - **/ + // tile_objects_.push_back(object_door(static_cast((b2 << 8) + b1), + // 0, + // 0, 0, static_cast(layer))); } } } @@ -435,28 +436,23 @@ void Room::LoadSprites() { break; } - Sprite new_sprite; - /** - * TODO: Implement Sprite constructor for Dungeons - (b3, (b2 & 0x1F), (b1 & 0x1F), - ((b2 & 0xE0) >> 5) + ((b1 & 0x60) >> 2), - (b1 & 0x80) >> 7); - */ - sprites_.emplace_back(new_sprite); + sprites_.emplace_back(b3, (b2 & 0x1F), (b1 & 0x1F), + ((b2 & 0xE0) >> 5) + ((b1 & 0x60) >> 2), + (b1 & 0x80) >> 7); if (sprites_.size() > 1) { - Sprite& spr = sprites_.back(); - Sprite& prevSprite = sprites_[sprites_.size() - 2]; + Sprite &spr = sprites_.back(); + Sprite &prevSprite = sprites_[sprites_.size() - 2]; if (spr.id() == 0xE4 && spr.x() == 0x00 && spr.y() == 0x1E && spr.layer() == 1 && spr.subtype() == 0x18) { - // prevSprite.keyDrop() = 1; + prevSprite.set_key_drop(1); sprites_.pop_back(); } if (spr.id() == 0xE4 && spr.x() == 0x00 && spr.y() == 0x1D && spr.layer() == 1 && spr.subtype() == 0x18) { - // prevSprite.keyDrop() = 2; + prevSprite.set_key_drop(2); sprites_.pop_back(); } } @@ -467,12 +463,11 @@ void Room::LoadSprites() { void Room::LoadChests() { auto rom_data = rom()->vector(); - int cpos = (rom_data[chests_data_pointer1 + 2] << 16) + - (rom_data[chests_data_pointer1 + 1] << 8) + - (rom_data[chests_data_pointer1]); - cpos = core::SnesToPc(cpos); - int clength = (rom_data[chests_length_pointer + 1] << 8) + - (rom_data[chests_length_pointer]); + uint32_t cpos = core::SnesToPc((rom_data[chests_data_pointer1 + 2] << 16) + + (rom_data[chests_data_pointer1 + 1] << 8) + + (rom_data[chests_data_pointer1])); + size_t clength = (rom_data[chests_length_pointer + 1] << 8) + + (rom_data[chests_length_pointer]); for (int i = 0; i < clength; i++) { if ((((rom_data[cpos + (i * 3) + 1] << 8) + (rom_data[cpos + (i * 3)])) & @@ -480,8 +475,7 @@ void Room::LoadChests() { // There's a chest in that room ! bool big = false; if ((((rom_data[cpos + (i * 3) + 1] << 8) + (rom_data[cpos + (i * 3)])) & - 0x8000) == 0x8000) // ????? - { + 0x8000) == 0x8000) { big = true; } diff --git a/src/app/zelda3/dungeon/room.h b/src/app/zelda3/dungeon/room.h index 6267c280..269ed49a 100644 --- a/src/app/zelda3/dungeon/room.h +++ b/src/app/zelda3/dungeon/room.h @@ -97,9 +97,17 @@ class DungeonDestination { uint8_t TargetLayer = 0; }; +struct Chest { + uint8_t x = 0; + uint8_t y = 0; + uint8_t item = 0; + bool picker = false; + bool big_chest = false; +}; + struct ChestData { ChestData() = default; - ChestData(uchar i, bool s) : id_(i), size_(s){}; + ChestData(uchar i, bool s) : id_(i), size_(s) {}; uchar id_; bool size_; @@ -107,12 +115,12 @@ struct ChestData { struct StaircaseRooms { StaircaseRooms() = default; - StaircaseRooms(uchar i, uchar r, const char* label) - : id_(i), room_(r), label_(label){}; + StaircaseRooms(uchar i, uchar r, const char *label) + : id_(i), room_(r), label_(label) {}; uchar id_; uchar room_; - const char* label_; + const char *label_; }; class Room : public SharedRom { @@ -120,6 +128,7 @@ class Room : public SharedRom { Room() = default; Room(int room_id) : room_id_(room_id) {} ~Room() = default; + void LoadHeader(); void LoadRoomFromROM(); @@ -132,7 +141,7 @@ class Room : public SharedRom { void LoadChests(); auto blocks() const { return blocks_; } - auto& mutable_blocks() { return blocks_; } + auto &mutable_blocks() { return blocks_; } auto layer1() const { return background_bmps_[0]; } auto layer2() const { return background_bmps_[1]; } auto layer3() const { return background_bmps_[2]; } diff --git a/src/app/zelda3/dungeon/room_entrance.h b/src/app/zelda3/dungeon/room_entrance.h index 2821fca1..074d9c42 100644 --- a/src/app/zelda3/dungeon/room_entrance.h +++ b/src/app/zelda3/dungeon/room_entrance.h @@ -99,11 +99,13 @@ constexpr int bedPositionResetYHigh = 0x02DE62; constexpr int bedSheetPositionX = 0x0480BD; // short value constexpr int bedSheetPositionY = 0x0480B8; // short value +/** + * @brief Dungeon Room Entrance or Spawn Point + */ class RoomEntrance { public: RoomEntrance() = default; - - RoomEntrance(Rom& rom, uint8_t entrance_id, bool is_spawn_point = false) + RoomEntrance(Rom &rom, uint8_t entrance_id, bool is_spawn_point = false) : entrance_id_(entrance_id) { room_ = static_cast((rom[kEntranceRoom + (entrance_id * 2) + 1] << 8) + @@ -209,7 +211,7 @@ class RoomEntrance { } } - absl::Status Save(Rom& rom, int entrance_id, bool is_spawn_point = false) { + absl::Status Save(Rom &rom, int entrance_id, bool is_spawn_point = false) { if (!is_spawn_point) { RETURN_IF_ERROR( rom.WriteShort(kEntranceYPosition + (entrance_id * 2), y_position_)); @@ -353,4 +355,4 @@ class RoomEntrance { } // namespace app } // namespace yaze -#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H \ No newline at end of file +#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H diff --git a/src/app/zelda3/dungeon/room_object.h b/src/app/zelda3/dungeon/room_object.h index 62e762bc..536e8651 100644 --- a/src/app/zelda3/dungeon/room_object.h +++ b/src/app/zelda3/dungeon/room_object.h @@ -174,14 +174,14 @@ class RoomObject : public SharedRom { class Subtype1 : public RoomObject { public: - bool allBgs; + bool all_bgs; int tile_count_; std::string name; Sorting sort; Subtype1(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer, - int tileCount) - : RoomObject(id, x, y, size, layer), tile_count_(tileCount) { + int tile_count) + : RoomObject(id, x, y, size, layer), tile_count_(tile_count) { auto rom_data = rom()->data(); int pos = kRoomObjectTileAddress + static_cast( @@ -206,7 +206,7 @@ class Subtype1 : public RoomObject { class Subtype2 : public RoomObject { public: std::string name; - bool allBgs; + bool all_bgs; Sorting sort; Subtype2(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer) @@ -232,7 +232,7 @@ class Subtype2 : public RoomObject { class Subtype3 : public RoomObject { public: - bool allBgs; + bool all_bgs; std::string name; Sorting sort;