Load sprites after overworld maps for current gfx
This commit is contained in:
@@ -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<std::future<absl::Status>> 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()) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#ifndef YAZE_APP_DATA_OVERWORLD_H
|
||||
#define YAZE_APP_DATA_OVERWORLD_H
|
||||
|
||||
#include <array>
|
||||
#include <vector>
|
||||
|
||||
#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<uint8_t, kNumOverworldMaps> map_parent_ = { 0 };
|
||||
std::array<uint8_t, kNumTileTypes> all_tiles_types_ = { 0 };
|
||||
std::vector<gfx::Tile16> tiles16_;
|
||||
std::vector<gfx::Tile32> tiles32_;
|
||||
std::vector<uint16_t> tiles32_list_;
|
||||
std::vector<gfx::Tile32> tiles32_unique_;
|
||||
std::vector<OverworldMap> overworld_maps_;
|
||||
std::vector<OverworldEntrance> all_entrances_;
|
||||
std::vector<OverworldEntrance> all_holes_;
|
||||
std::vector<OverworldExit> all_exits_;
|
||||
std::vector<OverworldItem> all_items_;
|
||||
std::array<std::vector<Sprite>, 3> all_sprites_;
|
||||
std::vector<uint64_t> deleted_entrances_;
|
||||
std::vector<std::vector<uint8_t>> map_data_p1 =
|
||||
std::vector<std::vector<uint8_t>>(kNumOverworldMaps);
|
||||
std::vector<std::vector<uint8_t>> map_data_p2 =
|
||||
std::vector<std::vector<uint8_t>>(kNumOverworldMaps);
|
||||
|
||||
std::vector<int> map_pointers1_id = std::vector<int>(kNumOverworldMaps);
|
||||
std::vector<int> map_pointers2_id = std::vector<int>(kNumOverworldMaps);
|
||||
std::vector<int> map_pointers1 = std::vector<int>(kNumOverworldMaps);
|
||||
std::vector<int> map_pointers2 = std::vector<int>(kNumOverworldMaps);
|
||||
std::vector<gfx::Tile16> tiles16_;
|
||||
std::vector<gfx::Tile32> tiles32_;
|
||||
std::vector<gfx::Tile32> tiles32_unique_;
|
||||
|
||||
std::vector<uint16_t> tiles32_list_;
|
||||
std::vector<uint64_t> deleted_entrances_;
|
||||
|
||||
std::array<uint8_t, kNumOverworldMaps> map_parent_ = {0};
|
||||
std::array<uint8_t, kNumTileTypes> all_tiles_types_ = {0};
|
||||
std::array<std::vector<Sprite>, 3> all_sprites_;
|
||||
std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p1;
|
||||
std::array<std::vector<uint8_t>, kNumOverworldMaps> map_data_p2;
|
||||
std::array<int, kNumOverworldMaps> map_pointers1_id;
|
||||
std::array<int, kNumOverworldMaps> map_pointers2_id;
|
||||
std::array<int, kNumOverworldMaps> map_pointers1;
|
||||
std::array<int, kNumOverworldMaps> map_pointers2;
|
||||
|
||||
std::vector<absl::flat_hash_map<uint16_t, int>> usage_stats_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user