8#include "absl/strings/str_cat.h"
34 auto room_size_address = 0xF8000 + (room_id * 3);
35 util::logf(
"Room #%#03X Addresss: %#06X", room_id, room_size_address);
38 uint8_t low = rom->
data()[room_size_address];
39 uint8_t high = rom->
data()[room_size_address + 1];
40 uint8_t bank = rom->
data()[room_size_address + 2];
43 int long_address = (bank << 16) | (high << 8) | low;
44 util::logf(
"%#06X", long_address);
47 if (long_address == 0x0A8000) {
49 util::logf(
"Size of Room #%#03X: 0 bytes", room_id);
56 int next_room_address = 0xF8000 + ((room_id + 1) * 3);
57 util::logf(
"Next Room Address: %#06X", next_room_address);
60 uint8_t next_low = rom->
data()[next_room_address];
61 uint8_t next_high = rom->
data()[next_room_address + 1];
62 uint8_t next_bank = rom->
data()[next_room_address + 2];
65 int next_long_address = (next_bank << 16) | (next_high << 8) | next_low;
66 util::logf(
"%#06X", next_long_address);
69 int actual_room_size = next_long_address - long_address;
71 util::logf(
"Size of Room #%#03X: %d bytes", room_id, actual_room_size);
83 header_pointer =
SnesToPc(header_pointer);
86 (rom->
data()[(header_pointer + 1) + (room_id * 2)] << 8) +
87 rom->
data()[(header_pointer) + (room_id * 2)];
89 auto header_location =
SnesToPc(address);
93 room.
is_light_ = ((rom->
data()[header_location]) & 0x01) == 1;
96 room.
bg2_ = background2::DarkRoom;
99 room.
palette = ((rom->
data()[header_location + 1] & 0x3F));
122 header_pointer_2 =
SnesToPc(header_pointer_2);
125 (rom->
data()[(header_pointer_2 + 1) + (room_id * 2)] << 8) +
126 rom->
data()[(header_pointer_2) + (room_id * 2)];
132 uint8_t b = rom->
data()[hpos];
157 b = rom->
data()[hpos];
180 int room_address = object_pointer + (room_id * 3);
181 int objects_location =
SnesToPc(room_address);
191 const auto &main_gfx =
rom()->main_blockset_ids;
192 const auto &room_gfx =
rom()->room_blockset_ids;
193 const auto &sprite_gfx =
rom()->spriteset_ids;
196 for (
int i = 0; i < 8; i++) {
198 if (i >= 6 && i <= 6) {
200 if (entrance_blockset != 0xFF &&
201 room_gfx[entrance_blockset][i - 3] != 0) {
202 blocks_[i] = room_gfx[entrance_blockset][i - 3];
211 for (
int i = 0; i < 4; i++) {
226 auto gfx_buffer_data =
rom()->graphics_buffer();
230 for (
int i = 0; i < 16; i++) {
234 uint8_t map_byte = gfx_buffer_data[data + block_offset];
250 int gfx_ptr =
SnesToPc(
rom()->version_constants().kGfxAnimatedPointer);
252 auto gfx_buffer_data =
rom()->graphics_buffer();
253 auto rom_data =
rom()->vector();
261 gfx_buffer_data[data +
270 auto rom_data =
rom()->vector();
274 object_pointer =
SnesToPc(object_pointer);
275 int room_address = object_pointer + (
room_id_ * 3);
277 int tile_address = (rom_data[room_address + 2] << 16) +
278 (rom_data[room_address + 1] << 8) + rom_data[room_address];
280 int objects_location =
SnesToPc(tile_address);
282 if (objects_location == 0x52CA2) {
283 std::cout <<
"Room ID : " <<
room_id_ << std::endl;
289 static_cast<uint8_t
>((rom_data[objects_location] >> 4) & 0x0F);
292 layout =
static_cast<uint8_t
>((rom_data[objects_location + 1] >> 2) & 0x07);
297 int nbr_of_staircase = 0;
299 int pos = objects_location + 2;
311 bool end_read =
false;
314 b2 = rom_data[pos + 1];
316 if (b1 == 0xFF && b2 == 0xFF) {
326 if (b1 == 0xF0 && b2 == 0xFF) {
332 b3 = rom_data[pos + 2];
341 oid =
static_cast<short>((b3 << 4) |
342 0x80 + (((b2 & 0x03) << 2) + ((b1 & 0x03))));
343 posX =
static_cast<uint8_t
>((b1 & 0xFC) >> 2);
344 posY =
static_cast<uint8_t
>((b2 & 0xFC) >> 2);
345 sizeXY =
static_cast<uint8_t
>((((b1 & 0x03) << 2) + (b2 & 0x03)));
348 posX =
static_cast<uint8_t
>((b1 & 0xFC) >> 2);
349 posY =
static_cast<uint8_t
>((b2 & 0xFC) >> 2);
350 sizeX =
static_cast<uint8_t
>((b1 & 0x03));
351 sizeY =
static_cast<uint8_t
>((b2 & 0x03));
352 sizeXY =
static_cast<uint8_t
>(((sizeX << 2) + sizeY));
356 oid =
static_cast<short>((b3 & 0x3F) + 0x100);
357 posX =
static_cast<uint8_t
>(((b2 & 0xF0) >> 4) + ((b1 & 0x3) << 4));
358 posY =
static_cast<uint8_t
>(((b2 & 0x0F) << 2) + ((b3 & 0xC0) >> 6));
362 RoomObject r(oid, posX, posY, sizeXY,
static_cast<uint8_t
>(layer));
367 if (nbr_of_staircase < 4) {
391 }
else if (oid == 0xFB1) {
411 auto rom_data =
rom()->vector();
412 int sprite_pointer = (0x04 << 16) +
415 int sprite_address_snes =
416 (0x09 << 16) + (rom_data[sprite_pointer + (
room_id_ * 2) + 1] << 8) +
417 rom_data[sprite_pointer + (
room_id_ * 2)];
419 int sprite_address =
SnesToPc(sprite_address_snes);
420 bool sortsprites = rom_data[sprite_address] == 1;
424 uint8_t b1 = rom_data[sprite_address];
425 uint8_t b2 = rom_data[sprite_address + 1];
426 uint8_t b3 = rom_data[sprite_address + 2];
432 sprites_.emplace_back(b3, (b2 & 0x1F), (b1 & 0x1F),
433 ((b2 & 0xE0) >> 5) + ((b1 & 0x60) >> 2),
440 if (spr.
id() == 0xE4 && spr.
x() == 0x00 && spr.
y() == 0x1E &&
446 if (spr.
id() == 0xE4 && spr.
x() == 0x00 && spr.
y() == 0x1D &&
458 auto rom_data =
rom()->vector();
465 for (
int i = 0; i < clength; i++) {
466 if ((((rom_data[cpos + (i * 3) + 1] << 8) + (rom_data[cpos + (i * 3)])) &
470 if ((((rom_data[cpos + (i * 3) + 1] << 8) + (rom_data[cpos + (i * 3)])) &
476 chest_data(rom_data[cpos + (i * 3) + 2], big));
The Rom class is used to load, save, and modify Rom data.
std::vector< RoomObject > tile_objects_
uint8_t staircase_plane_[4]
std::vector< zelda3::Sprite > sprites_
std::vector< uint8_t > current_gfx16_
void CopyRoomGraphicsToBuffer()
void LoadRoomGraphics(uint8_t entrance_blockset=0xFF)
uint8_t staircase_rooms_[4]
std::array< uint8_t, 16 > blocks_
void LoadAnimatedGraphics()
std::vector< chest_data > chests_in_room_
LayerMergeType layer_merging_
std::vector< staircase > z3_staircases_
uint8_t background_tileset_
A class for managing sprites in the overworld and underworld.
auto set_key_drop(int key)
Zelda 3 specific classes and functions.
constexpr int kGfxBufferAnimatedFrameStride
constexpr int kGfxBufferAnimatedFrameOffset
constexpr int chests_length_pointer
constexpr int chests_data_pointer1
constexpr int kGfxBufferRoomOffset
constexpr int rooms_sprite_pointer
constexpr int kGfxBufferRoomSpriteOffset
RoomSize CalculateRoomSize(Rom *rom, int room_id)
constexpr int messages_id_dungeon
constexpr int kGfxBufferRoomSpriteStride
constexpr uint16_t stairsObjects[]
Room LoadRoomFromRom(Rom *rom, int room_id)
constexpr int kRoomHeaderPointer
constexpr int kRoomHeaderPointerBank
constexpr int kGfxBufferStride
constexpr int room_object_pointer
constexpr int kGfxBufferRoomSpriteLastLineOffset
constexpr int dungeon_spr_ptrs
constexpr int kGfxBufferOffset
Main namespace for the application.
uint32_t SnesToPc(uint32_t addr) noexcept
int64_t room_size_pointer
struct chest_data chest_data
struct staircase staircase