From d41c3ca81a1c299f4ee4032e237f8cef52c498a9 Mon Sep 17 00:00:00 2001 From: scawful Date: Tue, 28 Mar 2023 12:08:55 -0500 Subject: [PATCH] Add Room class for Dungeon editing Loads basic properties from the dungeon room header by the room ID. --- src/CMakeLists.txt | 1 + src/app/zelda3/dungeon/room.cc | 109 ++++++++++++++++++++++++++++ src/app/zelda3/dungeon/room.h | 129 +++++++++++++++++++++++++++++++++ 3 files changed, 239 insertions(+) create mode 100644 src/app/zelda3/dungeon/room.cc create mode 100644 src/app/zelda3/dungeon/room.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fbc4f182..d48a6cd5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,6 +31,7 @@ set( app/zelda3/title_screen.cc app/zelda3/sprite.cc app/zelda3/tracker.cc + app/zelda3/dungeon/room.cc ) set( diff --git a/src/app/zelda3/dungeon/room.cc b/src/app/zelda3/dungeon/room.cc new file mode 100644 index 00000000..72c47f67 --- /dev/null +++ b/src/app/zelda3/dungeon/room.cc @@ -0,0 +1,109 @@ +#include "room.h" + +#include "app/core/common.h" +#include "app/gfx/bitmap.h" +#include "app/gfx/snes_palette.h" +#include "app/gfx/snes_tile.h" +#include "app/rom.h" +#include "gui/canvas.h" + +namespace yaze { +namespace app { +namespace zelda3 { +namespace dungeon { + +void Room::LoadChests() {} + +void Room::LoadBlocks() {} + +void Room::LoadTorches() {} + +void Room::LoadSecrets() {} + +void Room::LoadObjectsFromArray(int loc) {} + +void Room::LoadSpritesFromArray(int loc) {} + +void Room::LoadRoomFromROM() { + // Load dungeon header + int headerPointer = core::SnesToPc(room_header_pointer); + + MessageID = messages_id_dungeon + (RoomID * 2); + + int hpos = core::SnesToPc((rom_[room_header_pointers_bank] << 16) | + headerPointer + (RoomID * 2)); + hpos++; + uchar b = rom_[hpos]; + + Layer2Mode = (uchar)(b >> 5); + // TODO(@scawful): Make LayerMerging object. + // LayerMerging = LayerMergeType.ListOf[(b & 0x0C) >> 2]; + + IsDark = (b & 0x01) == 0x01; + hpos++; + + Palette = rom_[hpos]; + hpos++; + + BackgroundTileset = rom_[hpos]; + hpos++; + + SpriteTileset = rom_[hpos]; + hpos++; + + Layer2Behavior = rom_[hpos]; + hpos++; + + Tag1 = rom_[hpos]; + hpos++; + + Tag2 = rom_[hpos]; + hpos++; + + b = rom_[hpos]; + + Pits.TargetLayer = (uchar)(b & 0x03); + Stair1.TargetLayer = (uchar)((b >> 2) & 0x03); + Stair2.TargetLayer = (uchar)((b >> 4) & 0x03); + Stair3.TargetLayer = (uchar)((b >> 6) & 0x03); + hpos++; + Stair4.TargetLayer = (uchar)(rom_[hpos] & 0x03); + hpos++; + + Pits.Target = rom_[hpos]; + hpos++; + Stair1.Target = rom_[hpos]; + hpos++; + Stair2.Target = rom_[hpos]; + hpos++; + Stair3.Target = rom_[hpos]; + hpos++; + Stair4.Target = rom_[hpos]; + hpos++; + + // Load room objects + int objectPointer = core::SnesToPc(room_object_pointer); + int room_address = objectPointer + (RoomID * 3); + + int objects_location = core::SnesToPc(room_address); + + LoadObjectsFromArray(objects_location); + + // Load sprites + int spr_ptr = 0x040000 | rooms_sprite_pointer; + int sprite_address = + core::SnesToPc(dungeon_spr_ptrs | spr_ptr + (RoomID * 2)); + LoadSpritesFromArray(sprite_address); + + // Load other stuff + LoadChests(); + LoadBlocks(); + LoadTorches(); + LoadSecrets(); + Resync(); +} + +} // namespace dungeon +} // namespace zelda3 +} // namespace app +} // namespace yaze \ No newline at end of file diff --git a/src/app/zelda3/dungeon/room.h b/src/app/zelda3/dungeon/room.h new file mode 100644 index 00000000..3ca24116 --- /dev/null +++ b/src/app/zelda3/dungeon/room.h @@ -0,0 +1,129 @@ +#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_H +#define YAZE_APP_ZELDA3_DUNGEON_ROOM_H + +#include "app/core/common.h" +#include "app/gfx/bitmap.h" +#include "app/gfx/snes_palette.h" +#include "app/gfx/snes_tile.h" +#include "app/rom.h" +#include "gui/canvas.h" + +namespace yaze { +namespace app { +namespace zelda3 { +namespace dungeon { + +class DungeonDestination { + public: + DungeonDestination(uint8_t i) : Index(i) {} + + uint8_t Index; + uint8_t Target = 0; + uint8_t TargetLayer = 0; + // RoomObject* AssociatedObject = nullptr; + + // bool IsAssociated() { return AssociatedObject != nullptr; } + + // int RealX() { return AssociatedObject ? AssociatedObject->RealX : 0; } + + // int RealY() { return AssociatedObject ? AssociatedObject->RealY : 0; } + + // void Reset() { AssociatedObject = nullptr; } + + std::string ToString() { + return std::to_string(Index) + ": To " + std::to_string(Target); + } +}; + +constexpr int dungeons_palettes_groups = 0x75460; // JP 0x67DD0 +constexpr int dungeons_main_bg_palette_pointers = 0xDEC4B; // JP Same +constexpr int dungeons_palettes = 0xDD734; +constexpr int room_items_pointers = 0xDB69; // JP 0xDB67 +constexpr int rooms_sprite_pointer = 0x4C298; // JP Same //2byte bank 09D62E +constexpr int room_header_pointer = 0xB5DD; // LONG +constexpr int room_header_pointers_bank = 0xB5E7; // JP Same +constexpr int gfx_groups_pointer = 0x6237; +constexpr int room_object_layout_pointer = 0x882D; +constexpr int room_object_pointer = 0x874C; // Long pointer +constexpr int chests_length_pointer = 0xEBF6; +constexpr int chests_data_pointer1 = 0xEBFB; + +constexpr int messages_id_dungeon = 0x3F61D; + +constexpr int blocks_length = 0x8896; // Word value +constexpr int blocks_pointer1 = 0x15AFA; +constexpr int blocks_pointer2 = 0x15B01; +constexpr int blocks_pointer3 = 0x15B08; +constexpr int blocks_pointer4 = 0x15B0F; +constexpr int torch_data = 0x2736A; // JP 0x2704A +constexpr int torches_length_pointer = 0x88C1; +constexpr int sprite_blockset_pointer = 0x5B57; + +constexpr int sprites_data = 0x4D8B0; + +constexpr int sprites_data_empty_room = 0x4D8AE; +constexpr int sprites_end_data = 0x4EC9E; +constexpr int pit_pointer = 0x394AB; +constexpr int pit_count = 0x394A6; +constexpr int doorPointers = 0xF83C0; + +// doors +constexpr int door_gfx_up = 0x4D9E; +constexpr int door_gfx_down = 0x4E06; +constexpr int door_gfx_cavexit_down = 0x4E06; +constexpr int door_gfx_left = 0x4E66; +constexpr int door_gfx_right = 0x4EC6; +constexpr int door_pos_up = 0x197E; +constexpr int door_pos_down = 0x1996; +constexpr int door_pos_left = 0x19AE; +constexpr int door_pos_right = 0x19C6; + +constexpr int dungeon_spr_ptrs = 0x090000; + +class Room { + public: + Room() = default; + + private: + void LoadChests(); + void LoadBlocks(); + void LoadTorches(); + void LoadSecrets(); + void Resync(); + + void LoadObjectsFromArray(int loc); + void LoadSpritesFromArray(int loc); + + void LoadRoomFromROM(); + + DungeonDestination Pits; + DungeonDestination Stair1; + DungeonDestination Stair2; + DungeonDestination Stair3; + DungeonDestination Stair4; + + int RoomID = 0; + int MessageID = 0; + ushort MessageID; + uchar BackgroundTileset; + uchar SpriteTileset; + uchar Layer2Behavior; + uchar Palette; + uchar Floor1Graphics; + uchar Floor2Graphics; + uchar Layer2Mode; + + // LayerMergeType LayerMerging; + uchar Tag1; + uchar Tag2; + bool IsDark; + + ROM rom_; +}; + +} // namespace dungeon +} // namespace zelda3 +} // namespace app +} // namespace yaze + +#endif \ No newline at end of file