From 8cccbdfd4c24d3d420812ef73f9c189384004afc Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 10 Nov 2024 16:49:16 -0500 Subject: [PATCH] Add SaveMap16Expanded and SaveMap32Expanded functions based on ZS --- src/app/zelda3/overworld/overworld.cc | 128 ++++++++++++++++++++++++++ src/app/zelda3/overworld/overworld.h | 10 +- 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/src/app/zelda3/overworld/overworld.cc b/src/app/zelda3/overworld/overworld.cc index 08e8a296..a8c10dbc 100644 --- a/src/app/zelda3/overworld/overworld.cc +++ b/src/app/zelda3/overworld/overworld.cc @@ -1069,6 +1069,56 @@ absl::Status Overworld::CreateTile32Tilemap() { return absl::OkStatus(); } +absl::Status Overworld::SaveMap32Expanded() { + int bottomLeft = kMap32TileBLExpanded; + int bottomRight = kMap32TileBRExpanded; + int topRight = kMap32TileTRExpanded; + int limit = 0x8A80; + + // Updates the pointers too for the tile32 + // Top Right + RETURN_IF_ERROR( + rom()->WriteLong(0x0176EC, core::PcToSnes(kMap32TileTRExpanded))); + RETURN_IF_ERROR( + rom()->WriteLong(0x0176F3, core::PcToSnes(kMap32TileTRExpanded + 1))); + RETURN_IF_ERROR( + rom()->WriteLong(0x0176FA, core::PcToSnes(kMap32TileTRExpanded + 2))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017701, core::PcToSnes(kMap32TileTRExpanded + 3))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017708, core::PcToSnes(kMap32TileTRExpanded + 4))); + RETURN_IF_ERROR( + rom()->WriteLong(0x01771A, core::PcToSnes(kMap32TileTRExpanded + 5))); + + // BottomLeft + RETURN_IF_ERROR( + rom()->WriteLong(0x01772C, core::PcToSnes(kMap32TileBLExpanded))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017733, core::PcToSnes(kMap32TileBLExpanded + 1))); + RETURN_IF_ERROR( + rom()->WriteLong(0x01773A, core::PcToSnes(kMap32TileBLExpanded + 2))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017741, core::PcToSnes(kMap32TileBLExpanded + 3))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017748, core::PcToSnes(kMap32TileBLExpanded + 4))); + RETURN_IF_ERROR( + rom()->WriteLong(0x01775A, core::PcToSnes(kMap32TileBLExpanded + 5))); + + // BottomRight + RETURN_IF_ERROR( + rom()->WriteLong(0x01776C, core::PcToSnes(kMap32TileBRExpanded))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017773, core::PcToSnes(kMap32TileBRExpanded + 1))); + RETURN_IF_ERROR( + rom()->WriteLong(0x01777A, core::PcToSnes(kMap32TileBRExpanded + 2))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017781, core::PcToSnes(kMap32TileBRExpanded + 3))); + RETURN_IF_ERROR( + rom()->WriteLong(0x017788, core::PcToSnes(kMap32TileBRExpanded + 4))); + RETURN_IF_ERROR( + rom()->WriteLong(0x01779A, core::PcToSnes(kMap32TileBRExpanded + 5))); +} + absl::Status Overworld::SaveMap32Tiles() { core::Logger::log("Saving Map32 Tiles"); constexpr int kMaxUniqueTiles = 0x4540; @@ -1198,6 +1248,84 @@ absl::Status Overworld::SaveMap32Tiles() { return absl::OkStatus(); } +absl::Status Overworld::SaveMap16Expanded() { + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x008865), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x0EDE4F), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x0EDEE9), + core::PcToSnes(kMap16TilesExpanded))); + + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BBC2D), + core::PcToSnes(kMap16TilesExpanded + 2))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BBC4C), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BBCC2), + core::PcToSnes(kMap16TilesExpanded + 4))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BBCCB), + core::PcToSnes(kMap16TilesExpanded + 6))); + + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BBEF6), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BBF23), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BC041), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BC9B3), + core::PcToSnes(kMap16TilesExpanded))); + + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BC9BA), + core::PcToSnes(kMap16TilesExpanded + 2))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BC9C1), + core::PcToSnes(kMap16TilesExpanded + 4))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BC9C8), + core::PcToSnes(kMap16TilesExpanded + 6))); + + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BCA40), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BCA47), + core::PcToSnes(kMap16TilesExpanded + 2))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BCA4E), + core::PcToSnes(kMap16TilesExpanded + 4))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x1BCA55), + core::PcToSnes(kMap16TilesExpanded + 6))); + + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F457), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F45E), + core::PcToSnes(kMap16TilesExpanded + 2))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F467), + core::PcToSnes(kMap16TilesExpanded + 4))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F46E), + core::PcToSnes(kMap16TilesExpanded + 6))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F51F), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F526), + core::PcToSnes(kMap16TilesExpanded + 4))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F52F), + core::PcToSnes(kMap16TilesExpanded + 2))); + RETURN_IF_ERROR(rom()->WriteLong(core::SnesToPc(0x02F536), + core::PcToSnes(kMap16TilesExpanded + 6))); + + RETURN_IF_ERROR(rom()->WriteShort(core::SnesToPc(0x02FE1C), + core::PcToSnes(kMap16TilesExpanded))); + RETURN_IF_ERROR(rom()->WriteShort(core::SnesToPc(0x02FE23), + core::PcToSnes(kMap16TilesExpanded + 4))); + RETURN_IF_ERROR(rom()->WriteShort(core::SnesToPc(0x02FE2C), + core::PcToSnes(kMap16TilesExpanded + 2))); + RETURN_IF_ERROR(rom()->WriteShort(core::SnesToPc(0x02FE33), + core::PcToSnes(kMap16TilesExpanded + 6))); + + RETURN_IF_ERROR(rom()->Write( + core::SnesToPc(0x02FD28), + static_cast(core::PcToSnes(kMap16TilesExpanded) >> 16))); + RETURN_IF_ERROR(rom()->Write( + core::SnesToPc(0x02FD39), + static_cast(core::PcToSnes(kMap16TilesExpanded) >> 16))); + + return absl::OkStatus(); +} + absl::Status Overworld::SaveMap16Tiles() { core::Logger::log("Saving Map16 Tiles"); int tpos = kMap16Tiles; diff --git a/src/app/zelda3/overworld/overworld.h b/src/app/zelda3/overworld/overworld.h index fdac2454..8dfa7549 100644 --- a/src/app/zelda3/overworld/overworld.h +++ b/src/app/zelda3/overworld/overworld.h @@ -328,7 +328,6 @@ constexpr int OWHoleArea = 0xDB826; constexpr int OWHoleEntrance = 0xDB84C; class OverworldEntrance : public GameEntity { - public: uint16_t map_pos_; uchar entrance_id_; @@ -428,6 +427,13 @@ constexpr int transition_target_west = 0x13F62; constexpr int overworldCustomMosaicASM = 0x1301D0; constexpr int overworldCustomMosaicArray = 0x1301F0; +// Expanded tile16 and tile32 +constexpr int kMap16TilesExpanded = 0x1E8000; +constexpr int kMap32TileTRExpanded = 0x020000; +constexpr int kMap32TileBLExpanded = 0x1F0000; +constexpr int kMap32TileBRExpanded = 0x1F8000; +constexpr int kMap32TileCount = 0x0067E0; + constexpr int kMap16Tiles = 0x78000; constexpr int kNumOverworldMaps = 160; constexpr int kNumTile16Individual = 4096; @@ -464,7 +470,9 @@ class Overworld : public SharedRom, public core::ExperimentFlags { absl::Status SaveItems(); absl::Status CreateTile32Tilemap(); + absl::Status SaveMap16Expanded(); absl::Status SaveMap16Tiles(); + absl::Status SaveMap32Expanded(); absl::Status SaveMap32Tiles(); absl::Status SaveMapProperties();