Refactor Overworld: improve map handling by defining kNumMapsPerWorld and enhancing logging

This commit is contained in:
scawful
2025-02-28 09:25:56 -05:00
parent 7d77c51a27
commit a7d933eb14
2 changed files with 75 additions and 87 deletions

View File

@@ -53,7 +53,7 @@ void Overworld::FetchLargeMaps() {
overworld_maps_[138].SetAsLargeMap(129, 3); overworld_maps_[138].SetAsLargeMap(129, 3);
overworld_maps_[136].SetAsSmallMap(); overworld_maps_[136].SetAsSmallMap();
std::array<bool, 0x40> map_checked; std::array<bool, kNumMapsPerWorld> map_checked;
std::fill(map_checked.begin(), map_checked.end(), false); std::fill(map_checked.begin(), map_checked.end(), false);
int xx = 0; int xx = 0;
@@ -105,9 +105,8 @@ absl::StatusOr<uint16_t> Overworld::GetTile16ForTile32(
(((arg2 >> (quadrant % 2 == 0 ? 4 : 0)) & 0x0F) * 256)); (((arg2 >> (quadrant % 2 == 0 ? 4 : 0)) & 0x0F) * 256));
} }
constexpr int kMap32TilesLength = 0x33F0;
absl::Status Overworld::AssembleMap32Tiles() { absl::Status Overworld::AssembleMap32Tiles() {
constexpr int kMap32TilesLength = 0x33F0;
int num_tile32 = kMap32TilesLength; int num_tile32 = kMap32TilesLength;
uint32_t map32address[4] = {rom_.version_constants().kMap32TileTL, uint32_t map32address[4] = {rom_.version_constants().kMap32TileTL,
rom_.version_constants().kMap32TileTR, rom_.version_constants().kMap32TileTR,
@@ -391,18 +390,13 @@ absl::Status Overworld::LoadExits() {
uint16_t px = (uint16_t)((rom_data[OWExitXPlayer + (i * 2) + 1] << 8) + uint16_t px = (uint16_t)((rom_data[OWExitXPlayer + (i * 2) + 1] << 8) +
rom_data[OWExitXPlayer + (i * 2)]); rom_data[OWExitXPlayer + (i * 2)]);
if (core::FeatureFlags::get().kLogToConsole) { util::logf(
std::cout << "Exit: " << i << " RoomID: " << exit_room_id "Exit: %d RoomID: %d MapID: %d VRAM: %d YScroll: %d XScroll: "
<< " MapID: " << exit_map_id << " VRAM: " << exit_vram "%d YPlayer: %d XPlayer: %d YCamera: %d XCamera: %d "
<< " YScroll: " << exit_y_scroll "ScrollModY: %d ScrollModX: %d DoorType1: %d DoorType2: %d",
<< " XScroll: " << exit_x_scroll << " YPlayer: " << py i, exit_room_id, exit_map_id, exit_vram, exit_y_scroll, exit_x_scroll,
<< " XPlayer: " << px << " YCamera: " << exit_y_camera py, px, exit_y_camera, exit_x_camera, exit_scroll_mod_y,
<< " XCamera: " << exit_x_camera exit_scroll_mod_x, exit_door_type_1, exit_door_type_2);
<< " ScrollModY: " << exit_scroll_mod_y
<< " ScrollModX: " << exit_scroll_mod_x
<< " DoorType1: " << exit_door_type_1
<< " DoorType2: " << exit_door_type_2 << std::endl;
}
exits.emplace_back(exit_room_id, exit_map_id, exit_vram, exit_y_scroll, exits.emplace_back(exit_room_id, exit_map_id, exit_vram, exit_y_scroll,
exit_x_scroll, py, px, exit_y_camera, exit_x_camera, exit_x_scroll, py, px, exit_y_camera, exit_x_camera,
@@ -675,7 +669,7 @@ absl::Status Overworld::SaveLargeMaps() {
util::logf("Saving Large Maps"); util::logf("Saving Large Maps");
std::vector<uint8_t> checked_map; std::vector<uint8_t> checked_map;
for (int i = 0; i < 0x40; i++) { for (int i = 0; i < kNumMapsPerWorld; ++i) {
int y_pos = i / 8; int y_pos = i / 8;
int x_pos = i % 8; int x_pos = i % 8;
int parent_y_pos = overworld_maps_[i].parent() / 8; int parent_y_pos = overworld_maps_[i].parent() / 8;
@@ -1106,8 +1100,7 @@ absl::Status Overworld::SaveMap32Expanded() {
// Updates the pointers too for the tile32 // Updates the pointers too for the tile32
// Top Right // Top Right
RETURN_IF_ERROR( RETURN_IF_ERROR(rom()->WriteLong(0x0176EC, PcToSnes(kMap32TileTRExpanded)));
rom()->WriteLong(0x0176EC, PcToSnes(kMap32TileTRExpanded)));
RETURN_IF_ERROR( RETURN_IF_ERROR(
rom()->WriteLong(0x0176F3, PcToSnes(kMap32TileTRExpanded + 1))); rom()->WriteLong(0x0176F3, PcToSnes(kMap32TileTRExpanded + 1)));
RETURN_IF_ERROR( RETURN_IF_ERROR(
@@ -1120,8 +1113,7 @@ absl::Status Overworld::SaveMap32Expanded() {
rom()->WriteLong(0x01771A, PcToSnes(kMap32TileTRExpanded + 5))); rom()->WriteLong(0x01771A, PcToSnes(kMap32TileTRExpanded + 5)));
// BottomLeft // BottomLeft
RETURN_IF_ERROR( RETURN_IF_ERROR(rom()->WriteLong(0x01772C, PcToSnes(kMap32TileBLExpanded)));
rom()->WriteLong(0x01772C, PcToSnes(kMap32TileBLExpanded)));
RETURN_IF_ERROR( RETURN_IF_ERROR(
rom()->WriteLong(0x017733, PcToSnes(kMap32TileBLExpanded + 1))); rom()->WriteLong(0x017733, PcToSnes(kMap32TileBLExpanded + 1)));
RETURN_IF_ERROR( RETURN_IF_ERROR(
@@ -1134,8 +1126,7 @@ absl::Status Overworld::SaveMap32Expanded() {
rom()->WriteLong(0x01775A, PcToSnes(kMap32TileBLExpanded + 5))); rom()->WriteLong(0x01775A, PcToSnes(kMap32TileBLExpanded + 5)));
// BottomRight // BottomRight
RETURN_IF_ERROR( RETURN_IF_ERROR(rom()->WriteLong(0x01776C, PcToSnes(kMap32TileBRExpanded)));
rom()->WriteLong(0x01776C, PcToSnes(kMap32TileBRExpanded)));
RETURN_IF_ERROR( RETURN_IF_ERROR(
rom()->WriteLong(0x017773, PcToSnes(kMap32TileBRExpanded + 1))); rom()->WriteLong(0x017773, PcToSnes(kMap32TileBRExpanded + 1)));
RETURN_IF_ERROR( RETURN_IF_ERROR(
@@ -1279,72 +1270,72 @@ absl::Status Overworld::SaveMap32Tiles() {
} }
absl::Status Overworld::SaveMap16Expanded() { absl::Status Overworld::SaveMap16Expanded() {
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x008865), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x008865), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x0EDE4F), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x0EDE4F), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x0EDEE9), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x0EDEE9), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BBC2D), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 2))); rom()->WriteLong(SnesToPc(0x1BBC2D), PcToSnes(kMap16TilesExpanded + 2)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BBC4C), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x1BBC4C), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BBCC2), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 4))); rom()->WriteLong(SnesToPc(0x1BBCC2), PcToSnes(kMap16TilesExpanded + 4)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BBCCB), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 6))); rom()->WriteLong(SnesToPc(0x1BBCCB), PcToSnes(kMap16TilesExpanded + 6)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BBEF6), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x1BBEF6), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BBF23), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x1BBF23), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BC041), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x1BC041), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BC9B3), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x1BC9B3), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BC9BA), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 2))); rom()->WriteLong(SnesToPc(0x1BC9BA), PcToSnes(kMap16TilesExpanded + 2)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BC9C1), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 4))); rom()->WriteLong(SnesToPc(0x1BC9C1), PcToSnes(kMap16TilesExpanded + 4)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BC9C8), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 6))); rom()->WriteLong(SnesToPc(0x1BC9C8), PcToSnes(kMap16TilesExpanded + 6)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BCA40), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x1BCA40), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BCA47), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 2))); rom()->WriteLong(SnesToPc(0x1BCA47), PcToSnes(kMap16TilesExpanded + 2)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BCA4E), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 4))); rom()->WriteLong(SnesToPc(0x1BCA4E), PcToSnes(kMap16TilesExpanded + 4)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x1BCA55), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 6))); rom()->WriteLong(SnesToPc(0x1BCA55), PcToSnes(kMap16TilesExpanded + 6)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F457), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x02F457), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F45E), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 2))); rom()->WriteLong(SnesToPc(0x02F45E), PcToSnes(kMap16TilesExpanded + 2)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F467), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 4))); rom()->WriteLong(SnesToPc(0x02F467), PcToSnes(kMap16TilesExpanded + 4)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F46E), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 6))); rom()->WriteLong(SnesToPc(0x02F46E), PcToSnes(kMap16TilesExpanded + 6)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F51F), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteLong(SnesToPc(0x02F51F), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F526), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 4))); rom()->WriteLong(SnesToPc(0x02F526), PcToSnes(kMap16TilesExpanded + 4)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F52F), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 2))); rom()->WriteLong(SnesToPc(0x02F52F), PcToSnes(kMap16TilesExpanded + 2)));
RETURN_IF_ERROR(rom()->WriteLong(SnesToPc(0x02F536), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 6))); rom()->WriteLong(SnesToPc(0x02F536), PcToSnes(kMap16TilesExpanded + 6)));
RETURN_IF_ERROR(rom()->WriteShort(SnesToPc(0x02FE1C), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded))); rom()->WriteShort(SnesToPc(0x02FE1C), PcToSnes(kMap16TilesExpanded)));
RETURN_IF_ERROR(rom()->WriteShort(SnesToPc(0x02FE23), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 4))); rom()->WriteShort(SnesToPc(0x02FE23), PcToSnes(kMap16TilesExpanded + 4)));
RETURN_IF_ERROR(rom()->WriteShort(SnesToPc(0x02FE2C), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 2))); rom()->WriteShort(SnesToPc(0x02FE2C), PcToSnes(kMap16TilesExpanded + 2)));
RETURN_IF_ERROR(rom()->WriteShort(SnesToPc(0x02FE33), RETURN_IF_ERROR(
PcToSnes(kMap16TilesExpanded + 6))); rom()->WriteShort(SnesToPc(0x02FE33), PcToSnes(kMap16TilesExpanded + 6)));
RETURN_IF_ERROR(rom()->WriteByte( RETURN_IF_ERROR(rom()->WriteByte(
SnesToPc(0x02FD28), SnesToPc(0x02FD28),
@@ -1546,9 +1537,7 @@ absl::Status Overworld::SaveItems() {
return absl::AbortedError("Too many items"); return absl::AbortedError("Too many items");
} }
if (core::FeatureFlags::get().kLogToConsole) { util::logf("End of Items : %d", data_pos);
std::cout << "End of Items : " << data_pos << std::endl;
}
return absl::OkStatus(); return absl::OkStatus();
} }

View File

@@ -101,6 +101,7 @@ constexpr int NumberOfMap16Ex = 4096; // 4096
constexpr int LimitOfMap32 = 8864; constexpr int LimitOfMap32 = 8864;
constexpr int NumberOfOWSprites = 352; constexpr int NumberOfOWSprites = 352;
constexpr int NumberOfMap32 = Map32PerScreen * kNumOverworldMaps; constexpr int NumberOfMap32 = Map32PerScreen * kNumOverworldMaps;
constexpr int kNumMapsPerWorld = 0x40;
/** /**
* @brief Represents the full Overworld data, light and dark world. * @brief Represents the full Overworld data, light and dark world.
@@ -268,8 +269,6 @@ class Overworld : public SharedRom {
std::array<int, kNumOverworldMaps> map_pointers2_id; std::array<int, kNumOverworldMaps> map_pointers2_id;
std::array<int, kNumOverworldMaps> map_pointers1; std::array<int, kNumOverworldMaps> map_pointers1;
std::array<int, kNumOverworldMaps> map_pointers2; std::array<int, kNumOverworldMaps> map_pointers2;
std::vector<absl::flat_hash_map<uint16_t, int>> usage_stats_;
}; };
} // namespace zelda3 } // namespace zelda3