yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
overworld_entrance.h
Go to the documentation of this file.
1#ifndef YAZE_APP_ZELDA3_OVERWORLD_ENTRANCE_H
2#define YAZE_APP_ZELDA3_OVERWORLD_ENTRANCE_H
3
4#include <array>
5#include <cstdint>
6#include <cstdlib>
7#include <vector>
8
9#include "absl/status/status.h"
10#include "absl/status/statusor.h"
11#include "core/rom_settings.h"
12#include "rom/rom.h"
13#include "util/macro.h"
14#include "zelda3/common.h"
15
16namespace yaze::zelda3 {
17
18// EXPANDED to 0x78000 to 0x7A000
19constexpr int kEntranceRoomEXP = 0x078000;
20constexpr int kEntranceScrollEdgeEXP = 0x078200;
21constexpr int kEntranceCameraYEXP = 0x078A00;
22constexpr int kEntranceCameraXEXP = 0x078C00;
23constexpr int kEntranceYPositionEXP = 0x078E00;
24constexpr int kEntranceXPositionEXP = 0x079000;
25constexpr int kEntranceCameraYTriggerEXP = 0x079200;
26constexpr int kEntranceCameraXTriggerEXP = 0x079400;
27constexpr int kEntranceBlocksetEXP = 0x079600;
28constexpr int kEntranceFloorEXP = 0x079700;
29constexpr int kEntranceDungeonEXP = 0x079800;
30constexpr int kEntranceDoorEXP = 0x079900;
31constexpr int kEntranceLadderBgEXP = 0x079A00;
32constexpr int kEntranceScrollingEXP = 0x079B00;
33constexpr int kEntranceScrollQuadrantEXP = 0x079C00;
34constexpr int kEntranceExitEXP = 0x079D00;
35constexpr int kEntranceMusicEXP = 0x079F00;
36constexpr int kEntranceExtraEXP = 0x07A000;
37constexpr int kEntranceTotalEXP = 0xFF;
38constexpr int kEntranceTotal = 0x84;
39constexpr int kEntranceLinkSpawn = 0x00;
40constexpr int kEntranceNorthTavern = 0x43;
41constexpr int kEntranceEXP = 0x07F000;
42
43constexpr int kEntranceCameraY = 0x014D45; // 0x14AA9 // 2bytes each room
44constexpr int kEntranceCameraX = 0x014E4F; // 0x14BB3 // 2bytes
45
46constexpr int kNumOverworldEntrances = 129;
47constexpr int kNumOverworldHoles = 0x13;
48
49constexpr int kOverworldEntranceMap = 0xDB96F;
50constexpr int kOverworldEntrancePos = 0xDBA71;
51constexpr int kOverworldEntranceEntranceId = 0xDBB73;
52
53constexpr int kOverworldEntranceMapExpanded = 0x0DB55F;
54constexpr int kOverworldEntrancePosExpanded = 0x0DB35F;
55constexpr int kOverworldEntranceEntranceIdExpanded = 0x0DB75F;
56
57constexpr int kOverworldEntranceExpandedFlagPos = 0x0DB895; // 0xB8
58
64
70
76
82
83// (0x13 entries, 2 bytes each) modified(less 0x400)
84// map16 coordinates for each hole
85constexpr int kOverworldHolePos = 0xDB800;
86
87// (0x13 entries, 2 bytes each) corresponding
88// area numbers for each hole
89constexpr int kOverworldHoleArea = 0xDB826;
90
91//(0x13 entries, 1 byte each) corresponding entrance numbers
92constexpr int kOverworldHoleEntrance = 0xDB84C;
93
94// OWEntrances Expansion
95
96// Instructions for editors
97// if byte at (PC) address 0xDB895 == B8 then it is vanilla
98// Load normal overworld entrances data
99// Otherwise load from the expanded space
100// When saving just save in expanded space 256 values for each
101// (PC Addresses) - you can find snes address at the orgs below
102// 0x0DB35F = (short) Map16 tile address (mapPos in ZS)
103// 0x0DB55F = (short) Screen ID (MapID in ZS)
104// 0x0DB75F = (byte) Entrance leading to (EntranceID in ZS)
105
106// *Important* the Screen ID now also require bit 0x8000 (15) being set to tell
107// entrance is a hole
109 public:
110 uint16_t map_pos_;
112 bool is_hole_ = false;
113 bool deleted = false;
114
115 OverworldEntrance() = default;
116 OverworldEntrance(int x, int y, uint8_t entrance_id, short map_id,
117 uint16_t map_pos, bool hole)
118 : map_pos_(map_pos), entrance_id_(entrance_id), is_hole_(hole) {
119 x_ = x;
120 y_ = y;
121 map_id_ = map_id; // Store original map_id (no corruption)
122 entity_id_ = entrance_id;
124
125 // Use normalized map_id for coordinate calculations
126 uint8_t normalized_map_id = map_id % 0x40;
127 int mapX = normalized_map_id % 8;
128 int mapY = normalized_map_id / 8;
129
130 // Use base game_x_/game_y_ instead of duplicated area_x_/area_y_
131 game_x_ = static_cast<int>((std::abs(x - (mapX * 512)) / 16));
132 game_y_ = static_cast<int>((std::abs(y - (mapY * 512)) / 16));
133 }
134
135 void UpdateMapProperties(uint16_t map_id,
136 const void* context = nullptr) override {
137 (void)context; // Not used by entrances currently
138 map_id_ = map_id;
139
140 // Use normalized map_id for calculations (don't corrupt stored value)
141 uint8_t normalized_map_id = map_id % 0x40;
142 int mapX = normalized_map_id % 8;
143 int mapY = normalized_map_id / 8;
144
145 // Update game coordinates from world coordinates
146 game_x_ = static_cast<int>((std::abs(x_ - (mapX * 512)) / 16));
147 game_y_ = static_cast<int>((std::abs(y_ - (mapY * 512)) / 16));
148
149 // Calculate map position encoding for ROM save
150 map_pos_ = (uint16_t)((((game_y_) << 6) | (game_x_ & 0x3F)) << 1);
151 }
152};
153constexpr int kEntranceTileTypePtrLow = 0xDB8BF;
154constexpr int kEntranceTileTypePtrHigh = 0xDB917;
155constexpr int kNumEntranceTileTypes = 0x2C;
156
158 std::array<uint16_t, kNumEntranceTileTypes> low;
159 std::array<uint16_t, kNumEntranceTileTypes> high;
160};
161
162absl::StatusOr<std::vector<OverworldEntrance>> LoadEntrances(Rom* rom);
163absl::StatusOr<std::vector<OverworldEntrance>> LoadHoles(Rom* rom);
164
165absl::Status SaveEntrances(Rom* rom,
166 const std::vector<OverworldEntrance>& entrances,
167 bool expanded_entrances);
168absl::Status SaveHoles(Rom* rom, const std::vector<OverworldEntrance>& holes);
169
170inline absl::StatusOr<OverworldEntranceTileTypes> LoadEntranceTileTypes(
171 Rom* rom) {
173 for (int i = 0; i < kNumEntranceTileTypes; i++) {
174 ASSIGN_OR_RETURN(auto value_low,
176 tiletypes.low[i] = value_low;
177 ASSIGN_OR_RETURN(auto value_high,
179 tiletypes.high[i] = value_high;
180 }
181 return tiletypes;
182}
183
184} // namespace yaze::zelda3
185
186#endif
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
absl::StatusOr< uint16_t > ReadWord(int offset) const
Definition rom.cc:416
static RomSettings & Get()
uint32_t GetAddressOr(const std::string &key, uint32_t default_value) const
Base class for all overworld and dungeon entities.
Definition common.h:31
enum yaze::zelda3::GameEntity::EntityType entity_type_
OverworldEntrance(int x, int y, uint8_t entrance_id, short map_id, uint16_t map_pos, bool hole)
void UpdateMapProperties(uint16_t map_id, const void *context=nullptr) override
Update entity properties based on map position.
#define ASSIGN_OR_RETURN(type_variable_name, expression)
Definition macro.h:62
constexpr char kOverworldEntrancePosExpanded[]
constexpr char kOverworldEntranceMapExpanded[]
constexpr char kOverworldEntranceFlagExpanded[]
constexpr char kOverworldEntranceIdExpanded[]
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
constexpr int kEntranceFloorEXP
constexpr int kEntranceCameraXTriggerEXP
constexpr int kEntranceTotalEXP
absl::StatusOr< std::vector< OverworldEntrance > > LoadEntrances(Rom *rom)
constexpr int kEntranceScrollEdgeEXP
constexpr int kOverworldEntranceEntranceIdExpanded
constexpr int kEntranceCameraY
constexpr int kNumOverworldHoles
constexpr int kOverworldEntranceEntranceId
constexpr int kOverworldHolePos
constexpr int kOverworldEntranceMap
constexpr int kEntranceLadderBgEXP
constexpr int kEntranceXPositionEXP
constexpr int kNumEntranceTileTypes
constexpr int kEntranceNorthTavern
constexpr int kEntranceCameraYEXP
constexpr int kEntranceRoomEXP
constexpr int kEntranceDungeonEXP
constexpr int kEntranceYPositionEXP
constexpr int kEntranceCameraX
constexpr int kOverworldEntrancePosExpanded
constexpr int kEntranceBlocksetEXP
int GetOverworldEntrancePosExpanded()
constexpr int kEntranceCameraYTriggerEXP
constexpr int kEntranceExitEXP
constexpr int kEntranceTileTypePtrHigh
int GetOverworldEntranceIdExpanded()
constexpr int kOverworldEntranceMapExpanded
int GetOverworldEntranceFlagExpanded()
constexpr int kEntranceTileTypePtrLow
absl::Status SaveHoles(Rom *rom, const std::vector< OverworldEntrance > &holes)
absl::StatusOr< OverworldEntranceTileTypes > LoadEntranceTileTypes(Rom *rom)
absl::StatusOr< std::vector< OverworldEntrance > > LoadHoles(Rom *rom)
constexpr int kEntranceScrollQuadrantEXP
constexpr int kOverworldEntranceExpandedFlagPos
constexpr int kEntranceEXP
constexpr int kEntranceTotal
int GetOverworldEntranceMapExpanded()
constexpr int kEntranceDoorEXP
constexpr int kNumOverworldEntrances
constexpr int kEntranceExtraEXP
constexpr int kEntranceScrollingEXP
constexpr int kEntranceMusicEXP
constexpr int kEntranceCameraXEXP
constexpr int kEntranceLinkSpawn
std::array< uint16_t, kNumEntranceTileTypes > high
std::array< uint16_t, kNumEntranceTileTypes > low