yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
overworld_exit.cc
Go to the documentation of this file.
2#include "absl/status/status.h"
3#include "absl/status/statusor.h"
4#include "app/rom.h"
5#include "util/macro.h"
6#include "zelda3/common.h"
7#include <cstdint>
8#include <vector>
9
10namespace yaze::zelda3 {
11
12absl::StatusOr<std::vector<OverworldExit>> LoadExits(Rom* rom) {
13 const int NumberOfOverworldExits = 0x4F;
14 std::vector<OverworldExit> exits;
15 for (int i = 0; i < NumberOfOverworldExits; i++) {
16 auto rom_data = rom->data();
17
18 uint16_t exit_room_id;
19 uint16_t exit_map_id;
20 uint16_t exit_vram;
21 uint16_t exit_y_scroll;
22 uint16_t exit_x_scroll;
23 uint16_t exit_y_player;
24 uint16_t exit_x_player;
25 uint16_t exit_y_camera;
26 uint16_t exit_x_camera;
27 uint16_t exit_scroll_mod_y;
28 uint16_t exit_scroll_mod_x;
29 uint16_t exit_door_type_1;
30 uint16_t exit_door_type_2;
32 exit_room_id, (OWExitRoomId + (i * 2)), exit_map_id, OWExitMapId + i,
33 exit_vram, OWExitVram + (i * 2), exit_y_scroll, OWExitYScroll + (i * 2),
34 exit_x_scroll, OWExitXScroll + (i * 2), exit_y_player,
35 OWExitYPlayer + (i * 2), exit_x_player, OWExitXPlayer + (i * 2),
36 exit_y_camera, OWExitYCamera + (i * 2), exit_x_camera,
37 OWExitXCamera + (i * 2), exit_scroll_mod_y, OWExitUnk1 + i,
38 exit_scroll_mod_x, OWExitUnk2 + i, exit_door_type_1,
39 OWExitDoorType1 + (i * 2), exit_door_type_2,
40 OWExitDoorType2 + (i * 2)));
41
42 uint16_t py = (uint16_t)((rom_data[OWExitYPlayer + (i * 2) + 1] << 8) +
43 rom_data[OWExitYPlayer + (i * 2)]);
44 uint16_t px = (uint16_t)((rom_data[OWExitXPlayer + (i * 2) + 1] << 8) +
45 rom_data[OWExitXPlayer + (i * 2)]);
46
47 exits.emplace_back(exit_room_id, exit_map_id, exit_vram, exit_y_scroll,
48 exit_x_scroll, py, px, exit_y_camera, exit_x_camera,
49 exit_scroll_mod_y, exit_scroll_mod_x, exit_door_type_1,
50 exit_door_type_2, (px & py) == 0xFFFF);
51 }
52 return exits;
53}
54
55
56absl::Status SaveExits(Rom* rom, const std::vector<OverworldExit>& exits) {
57
58 // ASM version 0x03 added SW support and the exit leading to Zora's Domain specifically
59 // needs to be updated because its camera values are incorrect.
60 // We only update it if it was a vanilla ROM though because we don't know if the
61 // user has already adjusted it or not.
62 uint8_t asm_version = (*rom)[OverworldCustomASMHasBeenApplied];
63 if (asm_version == 0x00) {
64 // Apply special fix for Zora's Domain exit (index 0x4D)
65 // TODO: Implement SpecialUpdatePosition for OverworldExit
66 // if (all_exits_.size() > 0x4D) {
67 // all_exits_[0x4D].SpecialUpdatePosition();
68 // }
69 }
70
71 for (int i = 0; i < kNumOverworldExits; i++) {
73 rom->WriteShort(OWExitRoomId + (i * 2), exits[i].room_id_));
74 RETURN_IF_ERROR(rom->WriteByte(OWExitMapId + i, exits[i].map_id_));
76 rom->WriteShort(OWExitVram + (i * 2), exits[i].map_pos_));
78 rom->WriteShort(OWExitYScroll + (i * 2), exits[i].y_scroll_));
80 rom->WriteShort(OWExitXScroll + (i * 2), exits[i].x_scroll_));
82 rom->WriteShort(OWExitYPlayer + (i * 2), exits[i].y_player_));
84 rom->WriteShort(OWExitXPlayer + (i * 2), exits[i].x_player_));
86 rom->WriteShort(OWExitYCamera + (i * 2), exits[i].y_camera_));
88 rom->WriteShort(OWExitXCamera + (i * 2), exits[i].x_camera_));
90 rom->WriteByte(OWExitUnk1 + i, exits[i].scroll_mod_y_));
92 rom->WriteByte(OWExitUnk2 + i, exits[i].scroll_mod_x_));
94 exits[i].door_type_1_));
96 exits[i].door_type_2_));
97
98 if (exits[i].room_id_ == 0x0180) {
100 exits[i].map_id_ & 0xFF));
101 } else if (exits[i].room_id_ == 0x0181) {
103 exits[i].map_id_ & 0xFF));
104 } else if (exits[i].room_id_ == 0x0182) {
106 exits[i].map_id_ & 0xFF));
107 }
108 }
109
110 return absl::OkStatus();
111}
112
113} // namespace yaze::zelda3
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:74
absl::Status ReadTransaction(T &var, int address, Args &&... args)
Definition rom.h:140
absl::Status WriteByte(int addr, uint8_t value)
Definition rom.cc:728
auto data() const
Definition rom.h:206
absl::Status WriteShort(int addr, uint16_t value)
Definition rom.cc:753
#define RETURN_IF_ERROR(expression)
Definition macro.h:53
Zelda 3 specific classes and functions.
constexpr int OWExitYScroll
constexpr int OWExitDoorType2
constexpr int OWExitYCamera
constexpr int OWExitDoorPosition
constexpr int OWExitXScroll
constexpr int OWExitRoomId
constexpr int OWExitXCamera
constexpr int OWExitUnk1
constexpr int OWExitYPlayer
absl::StatusOr< std::vector< OverworldExit > > LoadExits(Rom *rom)
constexpr int OWExitMapId
constexpr int OWExitUnk2
constexpr int OverworldCustomASMHasBeenApplied
Definition common.h:50
constexpr int OWExitDoorType1
constexpr int kNumOverworldExits
absl::Status SaveExits(Rom *rom, const std::vector< OverworldExit > &exits)
constexpr int OWExitXPlayer
constexpr int OWExitVram