19 const int NumberOfOverworldExits = 0x4F;
20 std::vector<OverworldExit> exits;
21 for (
int i = 0; i < NumberOfOverworldExits; i++) {
22 const auto* rom_data = rom->
data();
24 uint16_t exit_room_id;
27 uint16_t exit_y_scroll;
28 uint16_t exit_x_scroll;
29 uint16_t exit_y_player;
30 uint16_t exit_x_player;
31 uint16_t exit_y_camera;
32 uint16_t exit_x_camera;
33 uint16_t exit_scroll_mod_y;
34 uint16_t exit_scroll_mod_x;
35 uint16_t exit_door_type_1;
36 uint16_t exit_door_type_2;
44 exit_scroll_mod_x,
OWExitUnk2 + i, exit_door_type_1,
49 static_cast<uint16_t
>((rom_data[
OWExitYPlayer + (i * 2) + 1] << 8) +
52 static_cast<uint16_t
>((rom_data[
OWExitXPlayer + (i * 2) + 1] << 8) +
55 exits.emplace_back(exit_room_id, exit_map_id, exit_vram, exit_y_scroll,
56 exit_x_scroll, player_y, player_x, exit_y_camera,
57 exit_x_camera, exit_scroll_mod_y, exit_scroll_mod_x,
58 exit_door_type_1, exit_door_type_2,
59 (player_x & player_y) == 0xFFFF);
74 int area_size_x = 256;
75 int area_size_y = 256;
77 if (context !=
nullptr) {
78 const auto* overworld =
static_cast<const Overworld*
>(context);
79 auto area_size = overworld->
overworld_map(map_id)->area_size();
83 area_size_x = area_size_y = 768;
95 uint8_t normalized_map_id = map_id % 0x40;
99 int mapX = normalized_map_id % 8;
100 int mapY = normalized_map_id / 8;
104 game_x_ =
static_cast<int>((std::abs(
x_ - (mapX * 512)) / 16));
105 game_y_ =
static_cast<int>((std::abs(
y_ - (mapY * 512)) / 16));
109 int max_game_x = (area_size_x == 256) ? 31 : 63;
110 int max_game_y = (area_size_y == 256) ? 31 : 63;
116 int mapx = (normalized_map_id & 7) << 9;
117 int mapy = (normalized_map_id & 56) << 6;
140 if (
y_scroll_ > mapy + area_size_y + 32) {
157 if (
x_camera_ > mapx + 127 + area_size_x) {
161 if (
y_camera_ > mapy + 143 + area_size_y) {
168 int16_t vram_x_scroll =
static_cast<int16_t
>(
x_scroll_ - mapx);
169 int16_t vram_y_scroll =
static_cast<int16_t
>(
y_scroll_ - mapy);
171 map_pos_ =
static_cast<uint16_t
>(((vram_y_scroll & 0xFFF0) << 3) |
172 ((vram_x_scroll & 0xFFF0) >> 3));
175absl::Status
SaveExits(
Rom* rom,
const std::vector<OverworldExit>& exits) {
181 if (asm_version == 0x00) {
213 if (exits[i].room_id_ == 0x0180) {
216 }
else if (exits[i].room_id_ == 0x0181) {
219 }
else if (exits[i].room_id_ == 0x0182) {
225 return absl::OkStatus();