Add Room class for Dungeon editing

Loads basic properties from the dungeon room header by the room ID.
This commit is contained in:
scawful
2023-03-28 12:08:55 -05:00
parent 45b824c869
commit d41c3ca81a
3 changed files with 239 additions and 0 deletions

View File

@@ -31,6 +31,7 @@ set(
app/zelda3/title_screen.cc
app/zelda3/sprite.cc
app/zelda3/tracker.cc
app/zelda3/dungeon/room.cc
)
set(

View File

@@ -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

View File

@@ -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