From d38ae7914dee6549c6d8de8458183c4c72fb0350 Mon Sep 17 00:00:00 2001 From: scawful Date: Mon, 6 Jan 2025 21:36:51 -0500 Subject: [PATCH] Load sprites after overworld maps for current gfx --- src/app/zelda3/overworld/overworld.cc | 67 ++++++++++++++------------- src/app/zelda3/overworld/overworld.h | 43 ++++++++--------- 2 files changed, 57 insertions(+), 53 deletions(-) diff --git a/src/app/zelda3/overworld/overworld.cc b/src/app/zelda3/overworld/overworld.cc index 53577d97..736959c8 100644 --- a/src/app/zelda3/overworld/overworld.cc +++ b/src/app/zelda3/overworld/overworld.cc @@ -29,8 +29,8 @@ absl::Status Overworld::Load(Rom &rom) { RETURN_IF_ERROR(LoadHoles()); RETURN_IF_ERROR(LoadExits()); RETURN_IF_ERROR(LoadItems()); - RETURN_IF_ERROR(LoadSprites()); RETURN_IF_ERROR(LoadOverworldMaps()); + RETURN_IF_ERROR(LoadSprites()); is_loaded_ = true; return absl::OkStatus(); @@ -309,9 +309,11 @@ absl::Status Overworld::LoadEntrances() { } for (int i = 0; i < num_entrances; i++) { - ASSIGN_OR_RETURN(auto map_id, rom()->ReadWord(ow_entrance_map_ptr + (i * 2))); - ASSIGN_OR_RETURN(auto map_pos, rom()->ReadWord(ow_entrance_pos_ptr + (i * 2))); - ASSIGN_OR_RETURN(auto entrance_id, rom()->ReadByte(ow_entrance_id_ptr + i)); + ASSIGN_OR_RETURN(auto map_id, + rom()->ReadWord(ow_entrance_map_ptr + (i * 2))); + ASSIGN_OR_RETURN(auto map_pos, + rom()->ReadWord(ow_entrance_pos_ptr + (i * 2))); + ASSIGN_OR_RETURN(auto entrance_id, rom()->ReadByte(ow_entrance_id_ptr + i)); int p = map_pos >> 1; int x = (p % 64); int y = (p >> 6); @@ -325,25 +327,27 @@ absl::Status Overworld::LoadEntrances() { deleted); } - return absl::OkStatus(); } absl::Status Overworld::LoadHoles() { - constexpr int kNumHoles = 0x13; + constexpr int kNumHoles = 0x13; for (int i = 0; i < kNumHoles; i++) { - ASSIGN_OR_RETURN(auto map_id, rom()->ReadWord(kOverworldHoleArea + (i * 2))); - ASSIGN_OR_RETURN(auto map_pos, rom()->ReadWord(kOverworldHolePos + (i * 2))); - ASSIGN_OR_RETURN(auto entrance_id, rom()->ReadByte(kOverworldHoleEntrance + i)); + ASSIGN_OR_RETURN(auto map_id, + rom()->ReadWord(kOverworldHoleArea + (i * 2))); + ASSIGN_OR_RETURN(auto map_pos, + rom()->ReadWord(kOverworldHolePos + (i * 2))); + ASSIGN_OR_RETURN(auto entrance_id, + rom()->ReadByte(kOverworldHoleEntrance + i)); int p = (map_pos + 0x400) >> 1; int x = (p % 64); int y = (p >> 6); all_holes_.emplace_back( - (x * 16) + (((map_id % 64) - (((map_id % 64) / 8) * 8)) * 512), - (y * 16) + (((map_id % 64) / 8) * 512), entrance_id, map_id, - (uint16_t)(map_pos + 0x400), true); + (x * 16) + (((map_id % 64) - (((map_id % 64) / 8) * 8)) * 512), + (y * 16) + (((map_id % 64) / 8) * 512), entrance_id, map_id, + (uint16_t)(map_pos + 0x400), true); } - return absl::OkStatus(); + return absl::OkStatus(); } absl::Status Overworld::LoadExits() { @@ -455,20 +459,20 @@ absl::Status Overworld::LoadItems() { absl::Status Overworld::LoadSprites() { std::vector> futures; - futures.emplace_back(std::async(std::launch::async, [this]() { - return LoadSpritesFromMap(kOverworldSpritesBeginning, 64, 0); - })); - futures.emplace_back(std::async(std::launch::async, [this]() { - return LoadSpritesFromMap(kOverworldSpritesZelda, 144, 1); - })); - futures.emplace_back(std::async(std::launch::async, [this]() { - return LoadSpritesFromMap(kOverworldSpritesAgahnim, 144, 2); - })); + futures.emplace_back(std::async(std::launch::async, [this]() { + return LoadSpritesFromMap(kOverworldSpritesBeginning, 64, 0); + })); + futures.emplace_back(std::async(std::launch::async, [this]() { + return LoadSpritesFromMap(kOverworldSpritesZelda, 144, 1); + })); + futures.emplace_back(std::async(std::launch::async, [this]() { + return LoadSpritesFromMap(kOverworldSpritesAgahnim, 144, 2); + })); - for (auto& future : futures) { - future.wait(); - RETURN_IF_ERROR(future.get()); - } + for (auto &future : futures) { + future.wait(); + RETURN_IF_ERROR(future.get()); + } return absl::OkStatus(); } @@ -499,10 +503,9 @@ absl::Status Overworld::LoadSpritesFromMap(int sprites_per_gamestate_ptr, int realX = ((b2 & 0x3F) * 16) + mapX * 512; int realY = ((b1 & 0x3F) * 16) + mapY * 512; - all_sprites_[game_state].emplace_back(*overworld_maps_[i].mutable_current_graphics(), - (uint8_t)i, b3, - (uint8_t)(b2 & 0x3F), - (uint8_t)(b1 & 0x3F), realX, realY); + all_sprites_[game_state].emplace_back( + *overworld_maps_[i].mutable_current_graphics(), (uint8_t)i, b3, + (uint8_t)(b2 & 0x3F), (uint8_t)(b1 & 0x3F), realX, realY); all_sprites_[game_state][i].Draw(); sprite_address += 3; @@ -673,8 +676,8 @@ absl::Status Overworld::SaveLargeMaps() { int parent_x_pos = overworld_maps_[i].parent() % 8; // Always write the map parent since it should not matter - RETURN_IF_ERROR( - rom()->WriteByte(kOverworldMapParentId + i, overworld_maps_[i].parent())) + RETURN_IF_ERROR(rom()->WriteByte(kOverworldMapParentId + i, + overworld_maps_[i].parent())) if (std::find(checked_map.begin(), checked_map.end(), i) != checked_map.end()) { diff --git a/src/app/zelda3/overworld/overworld.h b/src/app/zelda3/overworld/overworld.h index 3090ed01..fc9dead6 100644 --- a/src/app/zelda3/overworld/overworld.h +++ b/src/app/zelda3/overworld/overworld.h @@ -1,6 +1,7 @@ #ifndef YAZE_APP_DATA_OVERWORLD_H #define YAZE_APP_DATA_OVERWORLD_H +#include #include #include "absl/container/flat_hash_map.h" @@ -109,7 +110,7 @@ constexpr int NumberOfMap32 = Map32PerScreen * kNumOverworldMaps; */ class Overworld : public SharedRom { public: - Overworld(Rom& rom) : rom_(rom) {} + Overworld(Rom &rom) : rom_(rom) {} absl::Status Load(Rom &rom); absl::Status LoadOverworldMaps(); @@ -146,9 +147,9 @@ class Overworld : public SharedRom { all_entrances_.clear(); all_exits_.clear(); all_items_.clear(); - for (auto& sprites : all_sprites_) { - sprites.clear(); - } + for (auto &sprites : all_sprites_) { + sprites.clear(); + } is_loaded_ = false; } @@ -232,7 +233,7 @@ class Overworld : public SharedRom { int &ttpos); void DecompressAllMapTiles(); - Rom& rom_; + Rom &rom_; bool is_loaded_ = false; bool expanded_tile16_ = false; @@ -245,28 +246,28 @@ class Overworld : public SharedRom { OverworldMapTiles map_tiles_; - std::array map_parent_ = { 0 }; - std::array all_tiles_types_ = { 0 }; - std::vector tiles16_; - std::vector tiles32_; - std::vector tiles32_list_; - std::vector tiles32_unique_; std::vector overworld_maps_; std::vector all_entrances_; std::vector all_holes_; std::vector all_exits_; std::vector all_items_; - std::array, 3> all_sprites_; - std::vector deleted_entrances_; - std::vector> map_data_p1 = - std::vector>(kNumOverworldMaps); - std::vector> map_data_p2 = - std::vector>(kNumOverworldMaps); - std::vector map_pointers1_id = std::vector(kNumOverworldMaps); - std::vector map_pointers2_id = std::vector(kNumOverworldMaps); - std::vector map_pointers1 = std::vector(kNumOverworldMaps); - std::vector map_pointers2 = std::vector(kNumOverworldMaps); + std::vector tiles16_; + std::vector tiles32_; + std::vector tiles32_unique_; + + std::vector tiles32_list_; + std::vector deleted_entrances_; + + std::array map_parent_ = {0}; + std::array all_tiles_types_ = {0}; + std::array, 3> all_sprites_; + std::array, kNumOverworldMaps> map_data_p1; + std::array, kNumOverworldMaps> map_data_p2; + std::array map_pointers1_id; + std::array map_pointers2_id; + std::array map_pointers1; + std::array map_pointers2; std::vector> usage_stats_; };