7#include "absl/status/status.h"
8#include "absl/status/statusor.h"
22 const auto flag_addr =
25 if (flag_addr >= rom.
size()) {
28 return rom.
data()[flag_addr] != 0xB8;
39 std::vector<OverworldEntrance> entrances;
43 int num_entrances = 129;
48 if (HasExpandedEntranceTables(*rom, addresses)) {
63 for (
int i = 0; i < num_entrances; i++) {
66 rom->
ReadWord(ow_entrance_pos_ptr + (i * 2)));
72 if (map_pos == 0xFFFF) {
75 entrances.emplace_back(
76 (x * 16) + (((map_id % 64) - (((map_id % 64) / 8) * 8)) * 512),
77 (y * 16) + (((map_id % 64) / 8) * 512), entrance_id, map_id, map_pos,
84absl::StatusOr<std::vector<OverworldEntrance>>
LoadHoles(
Rom* rom) {
85 constexpr int kNumHoles = 0x13;
86 std::vector<OverworldEntrance> holes;
87 for (
int i = 0; i < kNumHoles; i++) {
92 int p = (map_pos + 0x400) >> 1;
96 (x * 16) + (((map_id % 64) - (((map_id % 64) / 8) * 8)) * 512),
97 (y * 16) + (((map_id % 64) / 8) * 512), entrance_id, map_id,
98 (uint16_t)(map_pos + 0x400),
true);
104 const std::vector<OverworldEntrance>& entrances,
105 bool expanded_entrances) {
106 auto write_entrance = [&](
int index, uint32_t map_addr, uint32_t pos_addr,
107 uint32_t id_addr) -> absl::Status {
114 return absl::OkStatus();
119 const int legacy_count =
121 for (
int i = 0; i < legacy_count; ++i) {
127 if (expanded_entrances) {
130 constexpr int kExpandedOverworldEntrances = 256;
131 const int expanded_count =
132 std::min<int>(kExpandedOverworldEntrances, entrances.size());
133 for (
int i = 0; i < expanded_count; ++i) {
141 return absl::OkStatus();
144absl::Status
SaveHoles(
Rom* rom,
const std::vector<OverworldEntrance>& holes) {
153 uint16_t rom_map_pos =
static_cast<uint16_t
>(holes[i].map_pos_ >= 0x400
154 ? holes[i].map_pos_ - 0x400
155 : holes[i].map_pos_);
161 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::Status WriteByte(int addr, uint8_t value)
absl::StatusOr< uint8_t > ReadByte(int offset) const
absl::StatusOr< uint16_t > ReadWord(int offset) const
absl::Status WriteShort(int addr, uint16_t value)
static RomSettings & Get()
static OverworldVersion GetVersion(const Rom &rom)
Detect ROM version from ASM marker byte.
#define ASSIGN_OR_RETURN(type_variable_name, expression)
constexpr char kOverworldEntrancePosExpanded[]
constexpr char kOverworldEntranceMapExpanded[]
constexpr char kOverworldEntranceFlagExpanded[]
constexpr char kOverworldEntranceIdExpanded[]
bool HasExpandedEntranceTables(const Rom &rom, const core::RomAddressOverrides &addresses)
Zelda 3 specific classes and functions.
absl::Status SaveEntrances(Rom *rom, const std::vector< OverworldEntrance > &entrances, bool expanded_entrances)
constexpr int kOverworldHoleArea
constexpr int kOverworldEntrancePos
constexpr int kOverworldHoleEntrance
absl::StatusOr< std::vector< OverworldEntrance > > LoadEntrances(Rom *rom)
constexpr int kOverworldEntranceEntranceIdExpanded
constexpr int kNumOverworldHoles
constexpr int kOverworldEntranceEntranceId
constexpr int kOverworldHolePos
constexpr int kOverworldEntranceMap
@ kVanilla
0xFF in ROM, no ZScream ASM applied
constexpr int kOverworldEntrancePosExpanded
int GetOverworldEntrancePosExpanded()
int GetOverworldEntranceIdExpanded()
constexpr int kOverworldEntranceMapExpanded
absl::Status SaveHoles(Rom *rom, const std::vector< OverworldEntrance > &holes)
absl::StatusOr< std::vector< OverworldEntrance > > LoadHoles(Rom *rom)
constexpr int kOverworldEntranceExpandedFlagPos
int GetOverworldEntranceMapExpanded()
constexpr int kNumOverworldEntrances
#define RETURN_IF_ERROR(expr)
std::optional< uint32_t > GetAddress(const std::string &key) const