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 "rom/rom.h"
12#include "util/macro.h"
13#include "zelda3/common.h"
14
15namespace yaze::zelda3 {
16
17// EXPANDED to 0x78000 to 0x7A000
18constexpr int kEntranceRoomEXP = 0x078000;
19constexpr int kEntranceScrollEdgeEXP = 0x078200;
20constexpr int kEntranceCameraYEXP = 0x078A00;
21constexpr int kEntranceCameraXEXP = 0x078C00;
22constexpr int kEntranceYPositionEXP = 0x078E00;
23constexpr int kEntranceXPositionEXP = 0x079000;
24constexpr int kEntranceCameraYTriggerEXP = 0x079200;
25constexpr int kEntranceCameraXTriggerEXP = 0x079400;
26constexpr int kEntranceBlocksetEXP = 0x079600;
27constexpr int kEntranceFloorEXP = 0x079700;
28constexpr int kEntranceDungeonEXP = 0x079800;
29constexpr int kEntranceDoorEXP = 0x079900;
30constexpr int kEntranceLadderBgEXP = 0x079A00;
31constexpr int kEntranceScrollingEXP = 0x079B00;
32constexpr int kEntranceScrollQuadrantEXP = 0x079C00;
33constexpr int kEntranceExitEXP = 0x079D00;
34constexpr int kEntranceMusicEXP = 0x079F00;
35constexpr int kEntranceExtraEXP = 0x07A000;
36constexpr int kEntranceTotalEXP = 0xFF;
37constexpr int kEntranceTotal = 0x84;
38constexpr int kEntranceLinkSpawn = 0x00;
39constexpr int kEntranceNorthTavern = 0x43;
40constexpr int kEntranceEXP = 0x07F000;
41
42constexpr int kEntranceCameraY = 0x014D45; // 0x14AA9 // 2bytes each room
43constexpr int kEntranceCameraX = 0x014E4F; // 0x14BB3 // 2bytes
44
45constexpr int kNumOverworldEntrances = 129;
46constexpr int kNumOverworldHoles = 0x13;
47
48constexpr int kOverworldEntranceMap = 0xDB96F;
49constexpr int kOverworldEntrancePos = 0xDBA71;
50constexpr int kOverworldEntranceEntranceId = 0xDBB73;
51
52constexpr int kOverworldEntranceMapExpanded = 0x0DB55F;
53constexpr int kOverworldEntrancePosExpanded = 0x0DB35F;
54constexpr int kOverworldEntranceEntranceIdExpanded = 0x0DB75F;
55
56constexpr int kOverworldEntranceExpandedFlagPos = 0x0DB895; // 0xB8
57
58// (0x13 entries, 2 bytes each) modified(less 0x400)
59// map16 coordinates for each hole
60constexpr int kOverworldHolePos = 0xDB800;
61
62// (0x13 entries, 2 bytes each) corresponding
63// area numbers for each hole
64constexpr int kOverworldHoleArea = 0xDB826;
65
66//(0x13 entries, 1 byte each) corresponding entrance numbers
67constexpr int kOverworldHoleEntrance = 0xDB84C;
68
69// OWEntrances Expansion
70
71// Instructions for editors
72// if byte at (PC) address 0xDB895 == B8 then it is vanilla
73// Load normal overworld entrances data
74// Otherwise load from the expanded space
75// When saving just save in expanded space 256 values for each
76// (PC Addresses) - you can find snes address at the orgs below
77// 0x0DB35F = (short) Map16 tile address (mapPos in ZS)
78// 0x0DB55F = (short) Screen ID (MapID in ZS)
79// 0x0DB75F = (byte) Entrance leading to (EntranceID in ZS)
80
81// *Important* the Screen ID now also require bit 0x8000 (15) being set to tell
82// entrance is a hole
84 public:
85 uint16_t map_pos_;
86 uint8_t entrance_id_;
87 bool is_hole_ = false;
88 bool deleted = false;
89
90 OverworldEntrance() = default;
91 OverworldEntrance(int x, int y, uint8_t entrance_id, short map_id,
92 uint16_t map_pos, bool hole)
93 : map_pos_(map_pos), entrance_id_(entrance_id), is_hole_(hole) {
94 x_ = x;
95 y_ = y;
96 map_id_ = map_id; // Store original map_id (no corruption)
97 entity_id_ = entrance_id;
99
100 // Use normalized map_id for coordinate calculations
101 uint8_t normalized_map_id = map_id % 0x40;
102 int mapX = normalized_map_id % 8;
103 int mapY = normalized_map_id / 8;
104
105 // Use base game_x_/game_y_ instead of duplicated area_x_/area_y_
106 game_x_ = static_cast<int>((std::abs(x - (mapX * 512)) / 16));
107 game_y_ = static_cast<int>((std::abs(y - (mapY * 512)) / 16));
108 }
109
110 void UpdateMapProperties(uint16_t map_id,
111 const void* context = nullptr) override {
112 (void)context; // Not used by entrances currently
113 map_id_ = map_id;
114
115 // Use normalized map_id for calculations (don't corrupt stored value)
116 uint8_t normalized_map_id = map_id % 0x40;
117 int mapX = normalized_map_id % 8;
118 int mapY = normalized_map_id / 8;
119
120 // Update game coordinates from world coordinates
121 game_x_ = static_cast<int>((std::abs(x_ - (mapX * 512)) / 16));
122 game_y_ = static_cast<int>((std::abs(y_ - (mapY * 512)) / 16));
123
124 // Calculate map position encoding for ROM save
125 map_pos_ = (uint16_t)((((game_y_) << 6) | (game_x_ & 0x3F)) << 1);
126 }
127};
128constexpr int kEntranceTileTypePtrLow = 0xDB8BF;
129constexpr int kEntranceTileTypePtrHigh = 0xDB917;
130constexpr int kNumEntranceTileTypes = 0x2C;
131
133 std::array<uint16_t, kNumEntranceTileTypes> low;
134 std::array<uint16_t, kNumEntranceTileTypes> high;
135};
136
137absl::StatusOr<std::vector<OverworldEntrance>> LoadEntrances(Rom* rom);
138absl::StatusOr<std::vector<OverworldEntrance>> LoadHoles(Rom* rom);
139
140absl::Status SaveEntrances(Rom* rom,
141 const std::vector<OverworldEntrance>& entrances,
142 bool expanded_entrances);
143absl::Status SaveHoles(Rom* rom, const std::vector<OverworldEntrance>& holes);
144
145inline absl::StatusOr<OverworldEntranceTileTypes> LoadEntranceTileTypes(
146 Rom* rom) {
148 for (int i = 0; i < kNumEntranceTileTypes; i++) {
149 ASSIGN_OR_RETURN(auto value_low,
151 tiletypes.low[i] = value_low;
152 ASSIGN_OR_RETURN(auto value_high,
154 tiletypes.high[i] = value_high;
155 }
156 return tiletypes;
157}
158
159} // namespace yaze::zelda3
160
161#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:24
absl::StatusOr< uint16_t > ReadWord(int offset)
Definition rom.cc:228
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
Zelda 3 specific classes and functions.
Definition editor.h:35
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
constexpr int kEntranceCameraYTriggerEXP
constexpr int kEntranceExitEXP
constexpr int kEntranceTileTypePtrHigh
constexpr int kOverworldEntranceMapExpanded
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
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