From adb7f0666ee743c81e3d61e22cb711185135a984 Mon Sep 17 00:00:00 2001 From: scawful Date: Wed, 31 Jan 2024 18:00:37 -0500 Subject: [PATCH] Fix the dumbest bug in the universe --- src/app/gfx/snes_tile.cc | 12 ++++++----- src/app/gfx/snes_tile.h | 4 ++-- src/app/rom.h | 2 +- src/app/zelda3/overworld.cc | 41 ++++++++++++++++++++----------------- src/app/zelda3/overworld.h | 4 ++-- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/app/gfx/snes_tile.cc b/src/app/gfx/snes_tile.cc index 7571dfc9..8af9cc23 100644 --- a/src/app/gfx/snes_tile.cc +++ b/src/app/gfx/snes_tile.cc @@ -85,7 +85,8 @@ Bytes PackBppTile(const tile8& tile, const uint32_t bpp) { // 2bpp format if (bpp >= 2) { output[col * 2] += (uint8_t)((color & 1) << (7 - row)); - output[col * 2 + 1] += (uint8_t)((uint8_t)((color & 2) == 2) << (7 - row)); + output[col * 2 + 1] += + (uint8_t)((uint8_t)((color & 2) == 2) << (7 - row)); } // 3bpp format @@ -101,7 +102,8 @@ Bytes PackBppTile(const tile8& tile, const uint32_t bpp) { // 8bpp format if (bpp == 8) { output[32 + col * 2] += (uint8_t)(((color & 16) == 16) << (7 - row)); - output[32 + col * 2 + 1] += (uint8_t)(((color & 32) == 32) << (7 - row)); + output[32 + col * 2 + 1] += + (uint8_t)(((color & 32) == 32) << (7 - row)); output[48 + col * 2] += (uint8_t)(((color & 64) == 64) << (7 - row)); output[48 + col * 2 + 1] += (uint8_t)(((color & 128) == 128) << (7 - row)); @@ -112,7 +114,7 @@ Bytes PackBppTile(const tile8& tile, const uint32_t bpp) { } std::vector ConvertBpp(const std::vector& tiles, - uint32_t from_bpp, uint32_t to_bpp) { + uint32_t from_bpp, uint32_t to_bpp) { unsigned int nb_tile = tiles.size() / (from_bpp * 8); std::vector converted(nb_tile * to_bpp * 8); @@ -346,8 +348,8 @@ uint16_t TileInfoToShort(TileInfo tile_info) { TileInfo GetTilesInfo(uint16_t tile) { // vhopppcc cccccccc - auto tid = (uint16_t)(tile & core::TileNameMask); - auto p = (uint8_t)((tile >> 10) & 0x07); + uint16_t tid = (uint16_t)(tile & core::TileNameMask); + uint8_t p = (uint8_t)((tile >> 10) & 0x07); bool o = ((tile & core::TilePriorityBit) == core::TilePriorityBit); bool h = ((tile & core::TileHFlipBit) == core::TileHFlipBit); diff --git a/src/app/gfx/snes_tile.h b/src/app/gfx/snes_tile.h index b2fc542c..9a87a9c0 100644 --- a/src/app/gfx/snes_tile.h +++ b/src/app/gfx/snes_tile.h @@ -12,7 +12,7 @@ namespace app { namespace gfx { constexpr uint8_t kGraphicsBitmap[8] = {0x80, 0x40, 0x20, 0x10, - 0x08, 0x04, 0x02, 0x01}; + 0x08, 0x04, 0x02, 0x01}; Bytes SnesTo8bppSheet(Bytes sheet, int bpp); Bytes Bpp8SnesToIndexed(Bytes data, uint64_t bpp = 0); @@ -30,7 +30,7 @@ tile8 UnpackBppTile(const Bytes& data, const uint32_t offset, Bytes PackBppTile(const tile8& tile, const uint32_t bpp); std::vector ConvertBpp(const std::vector& tiles, - uint32_t from_bpp, uint32_t to_bpp); + uint32_t from_bpp, uint32_t to_bpp); std::vector Convert3bppTo4bpp(const std::vector& tiles); std::vector Convert4bppTo3bpp(const std::vector& tiles); diff --git a/src/app/rom.h b/src/app/rom.h index 90cea6df..c6ddd09b 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -411,7 +411,7 @@ class ROM : public core::ExperimentFlags { return absl::OkStatus(); } - absl::Status WriteShort(uint32_t addr, uint16_t value) { + absl::Status WriteShort(int addr, uint16_t value) { if (addr + 1 >= rom_data_.size()) { return absl::InvalidArgumentError(absl::StrFormat( "Attempt to write short %#04x value failed, address %d out of range", diff --git a/src/app/zelda3/overworld.cc b/src/app/zelda3/overworld.cc index 2a405700..bd496938 100644 --- a/src/app/zelda3/overworld.cc +++ b/src/app/zelda3/overworld.cc @@ -697,15 +697,14 @@ absl::Status Overworld::SaveOverworldMaps() { absl::Status Overworld::SaveLargeMaps() { core::Logger::log("Saving Large Maps"); + std::vector checked_map; + for (int i = 0; i < 0x40; i++) { int y_pos = i / 8; int x_pos = i % 8; int parent_y_pos = overworld_maps_[i].parent() / 8; int parent_x_pos = overworld_maps_[i].parent() % 8; - // std::unordered_map checked_map; - std::vector checked_map; - // Always write the map parent since it should not matter RETURN_IF_ERROR( rom()->Write(overworldMapParentId + i, overworld_maps_[i].parent())) @@ -718,7 +717,7 @@ absl::Status Overworld::SaveLargeMaps() { // If it's large then save parent pos * // 0x200 otherwise pos * 0x200 if (overworld_maps_[i].is_large_map()) { - const int large_map_offsets[] = {0, 1, 8, 9}; + const uint8_t large_map_offsets[] = {0, 1, 8, 9}; for (const auto &offset : large_map_offsets) { // Check 1 RETURN_IF_ERROR(rom()->WriteByte(overworldMapSize + i + offset, 0x20)); @@ -779,6 +778,7 @@ absl::Status Overworld::SaveLargeMaps() { RETURN_IF_ERROR(rom()->WriteShort( overworldTransitionPositionY + (i * 2) + 02, (parent_y_pos * 0x200))); + // problematic RETURN_IF_ERROR(rom()->WriteShort( overworldTransitionPositionX + (i * 2) + 16, (parent_x_pos * 0x200))); RETURN_IF_ERROR(rom()->WriteShort( @@ -876,7 +876,7 @@ absl::Status Overworld::SaveLargeMaps() { // Always 0x2000 RETURN_IF_ERROR(rom()->WriteShort( - OverworldScreenTileMapChangeByScreen4 + (i * 2), 0x2000)); + OverworldScreenTileMapChangeByScreen4 + (i * 2) + 00, 0x2000)); RETURN_IF_ERROR(rom()->WriteShort( OverworldScreenTileMapChangeByScreen4 + (i * 2) + 16, 0x2000)); // Right side always 0x2040 @@ -1130,7 +1130,8 @@ absl::Status Overworld::SaveMap32Tiles() { } // Top Left. - const auto top_left = rom()->version_constants().kMap32TileTL; + auto top_left = rom()->version_constants().kMap32TileTL; + RETURN_IF_ERROR(rom()->WriteByte( top_left + i, (uint8_t)(tiles32_unique_[unique_tile_index].tile0_ & 0xFF))); @@ -1157,7 +1158,7 @@ absl::Status Overworld::SaveMap32Tiles() { 0x0F)))); // Top Right. - const auto top_right = rom()->version_constants().kMap32TileTR; + auto top_right = rom()->version_constants().kMap32TileTR; RETURN_IF_ERROR(rom()->WriteByte( top_right + i, (uint8_t)(tiles32_unique_[unique_tile_index].tile1_ & 0xFF))); @@ -1184,52 +1185,54 @@ absl::Status Overworld::SaveMap32Tiles() { 0x0F)))); // Bottom Left. + const auto map32TilesBL = rom()->version_constants().kMap32TileBL; RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBL + i, + map32TilesBL + i, (uint8_t)(tiles32_unique_[unique_tile_index].tile2_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBL + (i + 1), + map32TilesBL + (i + 1), (uint8_t)(tiles32_unique_[unique_tile_index + 1].tile2_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBL + (i + 2), + map32TilesBL + (i + 2), (uint8_t)(tiles32_unique_[unique_tile_index + 2].tile2_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBL + (i + 3), + map32TilesBL + (i + 3), (uint8_t)(tiles32_unique_[unique_tile_index + 3].tile2_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBL + (i + 4), + map32TilesBL + (i + 4), (uint8_t)(((tiles32_unique_[unique_tile_index].tile2_ >> 4) & 0xF0) | ((tiles32_unique_[unique_tile_index + 1].tile2_ >> 8) & 0x0F)))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBL + (i + 5), + map32TilesBL + (i + 5), (uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile2_ >> 4) & 0xF0) | ((tiles32_unique_[unique_tile_index + 3].tile2_ >> 8) & 0x0F)))); // Bottom Right. + const auto map32TilesBR = rom()->version_constants().kMap32TileBR; RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBR + i, + map32TilesBR + i, (uint8_t)(tiles32_unique_[unique_tile_index].tile3_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBR + (i + 1), + map32TilesBR + (i + 1), (uint8_t)(tiles32_unique_[unique_tile_index + 1].tile3_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBR + (i + 2), + map32TilesBR + (i + 2), (uint8_t)(tiles32_unique_[unique_tile_index + 2].tile3_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBR + (i + 3), + map32TilesBR + (i + 3), (uint8_t)(tiles32_unique_[unique_tile_index + 3].tile3_ & 0xFF))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBR + (i + 4), + map32TilesBR + (i + 4), (uint8_t)(((tiles32_unique_[unique_tile_index].tile3_ >> 4) & 0xF0) | ((tiles32_unique_[unique_tile_index + 1].tile3_ >> 8) & 0x0F)))); RETURN_IF_ERROR(rom()->WriteByte( - rom()->version_constants().kMap32TileBR + (i + 5), + map32TilesBR + (i + 5), (uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile3_ >> 4) & 0xF0) | ((tiles32_unique_[unique_tile_index + 3].tile3_ >> 8) & diff --git a/src/app/zelda3/overworld.h b/src/app/zelda3/overworld.h index c6cec17a..bd05540a 100644 --- a/src/app/zelda3/overworld.h +++ b/src/app/zelda3/overworld.h @@ -422,8 +422,8 @@ constexpr int OverworldScreenTileMapChangeByScreen4 = 0x127B4; constexpr int OverworldMapDataOverflow = 0x130000; -constexpr int transition_target_north = 0x13ee2; -constexpr int transition_target_west = 0x13f62; +constexpr int transition_target_north = 0x13EE2; +constexpr int transition_target_west = 0x13F62; constexpr int overworldCustomMosaicASM = 0x1301D0; constexpr int overworldCustomMosaicArray = 0x1301F0;