Refactor room handling for consistency and readability by standardizing variable naming and improving code structure
This commit is contained in:
@@ -117,7 +117,7 @@ void Room::LoadHeader() {
|
|||||||
std::cout << "Size of Room #" << room_id_ << ": " << std::dec << room_size
|
std::cout << "Size of Room #" << room_id_ << ": " << std::dec << room_size
|
||||||
<< " bytes" << std::endl;
|
<< " bytes" << std::endl;
|
||||||
}
|
}
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception &e) {
|
||||||
std::cout << "Error: " << e.what() << std::endl;
|
std::cout << "Error: " << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,8 +184,8 @@ void Room::LoadRoomFromROM() {
|
|||||||
hpos++;
|
hpos++;
|
||||||
|
|
||||||
// Load room objects
|
// Load room objects
|
||||||
int objectPointer = core::SnesToPc(room_object_pointer);
|
int object_pointer = core::SnesToPc(room_object_pointer);
|
||||||
int room_address = objectPointer + (room_id_ * 3);
|
int room_address = object_pointer + (room_id_ * 3);
|
||||||
int objects_location = core::SnesToPc(room_address);
|
int objects_location = core::SnesToPc(room_address);
|
||||||
|
|
||||||
// Load sprites
|
// Load sprites
|
||||||
@@ -195,18 +195,18 @@ void Room::LoadRoomFromROM() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Room::LoadRoomGraphics(uchar entrance_blockset) {
|
void Room::LoadRoomGraphics(uchar entrance_blockset) {
|
||||||
const auto& mainGfx = rom()->main_blockset_ids;
|
const auto &main_gfx = rom()->main_blockset_ids;
|
||||||
const auto& roomGfx = rom()->room_blockset_ids;
|
const auto &room_gfx = rom()->room_blockset_ids;
|
||||||
const auto& spriteGfx = rom()->spriteset_ids;
|
const auto &sprite_gfx = rom()->spriteset_ids;
|
||||||
current_gfx16_.reserve(0x4000);
|
current_gfx16_.reserve(0x4000);
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
blocks_[i] = mainGfx[blockset][i];
|
blocks_[i] = main_gfx[blockset][i];
|
||||||
if (i >= 6 && i <= 6) {
|
if (i >= 6 && i <= 6) {
|
||||||
// 3-6
|
// 3-6
|
||||||
if (entrance_blockset != 0xFF) {
|
if (entrance_blockset != 0xFF) {
|
||||||
if (roomGfx[entrance_blockset][i - 3] != 0) {
|
if (room_gfx[entrance_blockset][i - 3] != 0) {
|
||||||
blocks_[i] = roomGfx[entrance_blockset][i - 3];
|
blocks_[i] = room_gfx[entrance_blockset][i - 3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -217,7 +217,7 @@ void Room::LoadRoomGraphics(uchar entrance_blockset) {
|
|||||||
blocks_[10] = 115 + 6;
|
blocks_[10] = 115 + 6;
|
||||||
blocks_[11] = 115 + 7;
|
blocks_[11] = 115 + 7;
|
||||||
for (int i = 0; i < 4; i++) {
|
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
|
} // 12-16 sprites
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,11 +276,11 @@ void Room::LoadAnimatedGraphics() {
|
|||||||
|
|
||||||
void Room::LoadObjects() {
|
void Room::LoadObjects() {
|
||||||
auto rom_data = rom()->vector();
|
auto rom_data = rom()->vector();
|
||||||
int objectPointer = (rom_data[room_object_pointer + 2] << 16) +
|
int object_pointer = (rom_data[room_object_pointer + 2] << 16) +
|
||||||
(rom_data[room_object_pointer + 1] << 8) +
|
(rom_data[room_object_pointer + 1] << 8) +
|
||||||
(rom_data[room_object_pointer]);
|
(rom_data[room_object_pointer]);
|
||||||
objectPointer = core::SnesToPc(objectPointer);
|
object_pointer = core::SnesToPc(object_pointer);
|
||||||
int room_address = objectPointer + (room_id_ * 3);
|
int room_address = object_pointer + (room_id_ * 3);
|
||||||
|
|
||||||
int tile_address = (rom_data[room_address + 2] << 16) +
|
int tile_address = (rom_data[room_address + 2] << 16) +
|
||||||
(rom_data[room_address + 1] << 8) + rom_data[room_address];
|
(rom_data[room_address + 1] << 8) + rom_data[room_address];
|
||||||
@@ -388,27 +388,28 @@ void Room::LoadObjects() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
if (oid == 0xF99) {
|
if (oid == 0xF99) {
|
||||||
if (chests_in_room.size() > 0) {
|
if (chests_in_room_.size() > 0) {
|
||||||
tilesObjects.back().options |= ObjectOption::Chest;
|
tile_objects_.back().set_options(ObjectOption::Chest |
|
||||||
chest_list.push_back(
|
tile_objects_.back().options());
|
||||||
Chest(posX, posY, chests_in_room.front().itemIn, false));
|
// chest_list_.push_back(
|
||||||
chests_in_room.erase(chests_in_room.begin());
|
// Chest(posX, posY, chests_in_room_.front().itemIn, false));
|
||||||
|
chests_in_room_.erase(chests_in_room_.begin());
|
||||||
}
|
}
|
||||||
} else if (oid == 0xFB1) {
|
} else if (oid == 0xFB1) {
|
||||||
if (chests_in_room.size() > 0) {
|
if (chests_in_room_.size() > 0) {
|
||||||
tilesObjects.back().options |= ObjectOption::Chest;
|
tile_objects_.back().set_options(ObjectOption::Chest |
|
||||||
chest_list.push_back(
|
tile_objects_.back().options());
|
||||||
Chest(posX + 1, posY, chests_in_room.front().itemIn, true));
|
// chest_list_.push_back(
|
||||||
chests_in_room.erase(chests_in_room.begin());
|
// Chest(posX + 1, posY, chests_in_room_.front().item_in, true));
|
||||||
|
chests_in_room_.erase(chests_in_room_.begin());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tilesObjects.push_back(object_door(static_cast<short>((b2 << 8) + b1), 0,
|
// tile_objects_.push_back(object_door(static_cast<short>((b2 << 8) + b1),
|
||||||
0, 0, static_cast<uint8_t>(layer)));
|
// 0,
|
||||||
}
|
// 0, 0, static_cast<uint8_t>(layer)));
|
||||||
**/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -435,28 +436,23 @@ void Room::LoadSprites() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sprite new_sprite;
|
sprites_.emplace_back(b3, (b2 & 0x1F), (b1 & 0x1F),
|
||||||
/**
|
|
||||||
* TODO: Implement Sprite constructor for Dungeons
|
|
||||||
(b3, (b2 & 0x1F), (b1 & 0x1F),
|
|
||||||
((b2 & 0xE0) >> 5) + ((b1 & 0x60) >> 2),
|
((b2 & 0xE0) >> 5) + ((b1 & 0x60) >> 2),
|
||||||
(b1 & 0x80) >> 7);
|
(b1 & 0x80) >> 7);
|
||||||
*/
|
|
||||||
sprites_.emplace_back(new_sprite);
|
|
||||||
|
|
||||||
if (sprites_.size() > 1) {
|
if (sprites_.size() > 1) {
|
||||||
Sprite& spr = sprites_.back();
|
Sprite &spr = sprites_.back();
|
||||||
Sprite& prevSprite = sprites_[sprites_.size() - 2];
|
Sprite &prevSprite = sprites_[sprites_.size() - 2];
|
||||||
|
|
||||||
if (spr.id() == 0xE4 && spr.x() == 0x00 && spr.y() == 0x1E &&
|
if (spr.id() == 0xE4 && spr.x() == 0x00 && spr.y() == 0x1E &&
|
||||||
spr.layer() == 1 && spr.subtype() == 0x18) {
|
spr.layer() == 1 && spr.subtype() == 0x18) {
|
||||||
// prevSprite.keyDrop() = 1;
|
prevSprite.set_key_drop(1);
|
||||||
sprites_.pop_back();
|
sprites_.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spr.id() == 0xE4 && spr.x() == 0x00 && spr.y() == 0x1D &&
|
if (spr.id() == 0xE4 && spr.x() == 0x00 && spr.y() == 0x1D &&
|
||||||
spr.layer() == 1 && spr.subtype() == 0x18) {
|
spr.layer() == 1 && spr.subtype() == 0x18) {
|
||||||
// prevSprite.keyDrop() = 2;
|
prevSprite.set_key_drop(2);
|
||||||
sprites_.pop_back();
|
sprites_.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -467,11 +463,10 @@ void Room::LoadSprites() {
|
|||||||
|
|
||||||
void Room::LoadChests() {
|
void Room::LoadChests() {
|
||||||
auto rom_data = rom()->vector();
|
auto rom_data = rom()->vector();
|
||||||
int cpos = (rom_data[chests_data_pointer1 + 2] << 16) +
|
uint32_t cpos = core::SnesToPc((rom_data[chests_data_pointer1 + 2] << 16) +
|
||||||
(rom_data[chests_data_pointer1 + 1] << 8) +
|
(rom_data[chests_data_pointer1 + 1] << 8) +
|
||||||
(rom_data[chests_data_pointer1]);
|
(rom_data[chests_data_pointer1]));
|
||||||
cpos = core::SnesToPc(cpos);
|
size_t clength = (rom_data[chests_length_pointer + 1] << 8) +
|
||||||
int clength = (rom_data[chests_length_pointer + 1] << 8) +
|
|
||||||
(rom_data[chests_length_pointer]);
|
(rom_data[chests_length_pointer]);
|
||||||
|
|
||||||
for (int i = 0; i < clength; i++) {
|
for (int i = 0; i < clength; i++) {
|
||||||
@@ -480,8 +475,7 @@ void Room::LoadChests() {
|
|||||||
// There's a chest in that room !
|
// There's a chest in that room !
|
||||||
bool big = false;
|
bool big = false;
|
||||||
if ((((rom_data[cpos + (i * 3) + 1] << 8) + (rom_data[cpos + (i * 3)])) &
|
if ((((rom_data[cpos + (i * 3) + 1] << 8) + (rom_data[cpos + (i * 3)])) &
|
||||||
0x8000) == 0x8000) // ?????
|
0x8000) == 0x8000) {
|
||||||
{
|
|
||||||
big = true;
|
big = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,9 +97,17 @@ class DungeonDestination {
|
|||||||
uint8_t TargetLayer = 0;
|
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 {
|
struct ChestData {
|
||||||
ChestData() = default;
|
ChestData() = default;
|
||||||
ChestData(uchar i, bool s) : id_(i), size_(s){};
|
ChestData(uchar i, bool s) : id_(i), size_(s) {};
|
||||||
|
|
||||||
uchar id_;
|
uchar id_;
|
||||||
bool size_;
|
bool size_;
|
||||||
@@ -107,12 +115,12 @@ struct ChestData {
|
|||||||
|
|
||||||
struct StaircaseRooms {
|
struct StaircaseRooms {
|
||||||
StaircaseRooms() = default;
|
StaircaseRooms() = default;
|
||||||
StaircaseRooms(uchar i, uchar r, const char* label)
|
StaircaseRooms(uchar i, uchar r, const char *label)
|
||||||
: id_(i), room_(r), label_(label){};
|
: id_(i), room_(r), label_(label) {};
|
||||||
|
|
||||||
uchar id_;
|
uchar id_;
|
||||||
uchar room_;
|
uchar room_;
|
||||||
const char* label_;
|
const char *label_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Room : public SharedRom {
|
class Room : public SharedRom {
|
||||||
@@ -120,6 +128,7 @@ class Room : public SharedRom {
|
|||||||
Room() = default;
|
Room() = default;
|
||||||
Room(int room_id) : room_id_(room_id) {}
|
Room(int room_id) : room_id_(room_id) {}
|
||||||
~Room() = default;
|
~Room() = default;
|
||||||
|
|
||||||
void LoadHeader();
|
void LoadHeader();
|
||||||
void LoadRoomFromROM();
|
void LoadRoomFromROM();
|
||||||
|
|
||||||
@@ -132,7 +141,7 @@ class Room : public SharedRom {
|
|||||||
void LoadChests();
|
void LoadChests();
|
||||||
|
|
||||||
auto blocks() const { return blocks_; }
|
auto blocks() const { return blocks_; }
|
||||||
auto& mutable_blocks() { return blocks_; }
|
auto &mutable_blocks() { return blocks_; }
|
||||||
auto layer1() const { return background_bmps_[0]; }
|
auto layer1() const { return background_bmps_[0]; }
|
||||||
auto layer2() const { return background_bmps_[1]; }
|
auto layer2() const { return background_bmps_[1]; }
|
||||||
auto layer3() const { return background_bmps_[2]; }
|
auto layer3() const { return background_bmps_[2]; }
|
||||||
|
|||||||
@@ -99,11 +99,13 @@ constexpr int bedPositionResetYHigh = 0x02DE62;
|
|||||||
constexpr int bedSheetPositionX = 0x0480BD; // short value
|
constexpr int bedSheetPositionX = 0x0480BD; // short value
|
||||||
constexpr int bedSheetPositionY = 0x0480B8; // short value
|
constexpr int bedSheetPositionY = 0x0480B8; // short value
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dungeon Room Entrance or Spawn Point
|
||||||
|
*/
|
||||||
class RoomEntrance {
|
class RoomEntrance {
|
||||||
public:
|
public:
|
||||||
RoomEntrance() = default;
|
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) {
|
: entrance_id_(entrance_id) {
|
||||||
room_ =
|
room_ =
|
||||||
static_cast<short>((rom[kEntranceRoom + (entrance_id * 2) + 1] << 8) +
|
static_cast<short>((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) {
|
if (!is_spawn_point) {
|
||||||
RETURN_IF_ERROR(
|
RETURN_IF_ERROR(
|
||||||
rom.WriteShort(kEntranceYPosition + (entrance_id * 2), y_position_));
|
rom.WriteShort(kEntranceYPosition + (entrance_id * 2), y_position_));
|
||||||
|
|||||||
@@ -174,14 +174,14 @@ class RoomObject : public SharedRom {
|
|||||||
|
|
||||||
class Subtype1 : public RoomObject {
|
class Subtype1 : public RoomObject {
|
||||||
public:
|
public:
|
||||||
bool allBgs;
|
bool all_bgs;
|
||||||
int tile_count_;
|
int tile_count_;
|
||||||
std::string name;
|
std::string name;
|
||||||
Sorting sort;
|
Sorting sort;
|
||||||
|
|
||||||
Subtype1(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer,
|
Subtype1(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer,
|
||||||
int tileCount)
|
int tile_count)
|
||||||
: RoomObject(id, x, y, size, layer), tile_count_(tileCount) {
|
: RoomObject(id, x, y, size, layer), tile_count_(tile_count) {
|
||||||
auto rom_data = rom()->data();
|
auto rom_data = rom()->data();
|
||||||
int pos = kRoomObjectTileAddress +
|
int pos = kRoomObjectTileAddress +
|
||||||
static_cast<int16_t>(
|
static_cast<int16_t>(
|
||||||
@@ -206,7 +206,7 @@ class Subtype1 : public RoomObject {
|
|||||||
class Subtype2 : public RoomObject {
|
class Subtype2 : public RoomObject {
|
||||||
public:
|
public:
|
||||||
std::string name;
|
std::string name;
|
||||||
bool allBgs;
|
bool all_bgs;
|
||||||
Sorting sort;
|
Sorting sort;
|
||||||
|
|
||||||
Subtype2(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer)
|
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 {
|
class Subtype3 : public RoomObject {
|
||||||
public:
|
public:
|
||||||
bool allBgs;
|
bool all_bgs;
|
||||||
std::string name;
|
std::string name;
|
||||||
Sorting sort;
|
Sorting sort;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user