yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
room_layout.cc
Go to the documentation of this file.
1#include "room_layout.h"
2
3#include "absl/strings/str_format.h"
4#include "app/snes.h"
6
7namespace yaze::zelda3 {
8
9namespace {
10constexpr uint16_t kLayerTerminator = 0xFFFF;
11
12uint16_t ReadWord(const Rom* rom, int pc_addr) {
13 const auto& data = rom->data();
14 return static_cast<uint16_t>(data[pc_addr] | (data[pc_addr + 1] << 8));
15}
16}
17
18absl::StatusOr<int> RoomLayout::GetLayoutAddress(int layout_id) const {
19 if (!rom_ || !rom_->is_loaded()) {
20 return absl::FailedPreconditionError("ROM not loaded");
21 }
22
23 if (layout_id < 0 || layout_id >= static_cast<int>(kRoomLayoutPointers.size())) {
24 return absl::InvalidArgumentError(absl::StrFormat("Invalid layout id %d", layout_id));
25 }
26
27 uint32_t snes_addr = kRoomLayoutPointers[layout_id];
28 int pc_addr = SnesToPc(static_cast<int>(snes_addr));
29 if (pc_addr < 0 || pc_addr >= static_cast<int>(rom_->size())) {
30 return absl::OutOfRangeError(absl::StrFormat("Layout pointer %d out of range", layout_id));
31 }
32 return pc_addr;
33}
34
35absl::Status RoomLayout::LoadLayout(int layout_id) {
36 objects_.clear();
37
38 auto addr_result = GetLayoutAddress(layout_id);
39 if (!addr_result.ok()) {
40 return addr_result.status();
41 }
42
43 int pos = addr_result.value();
44 const auto& rom_data = rom_->data();
45 int layer = 0;
46
47 while (pos + 2 < static_cast<int>(rom_->size())) {
48 uint8_t b1 = rom_data[pos];
49 uint8_t b2 = rom_data[pos + 1];
50
51 if (b1 == 0xFF && b2 == 0xFF) {
52 layer++;
53 pos += 2;
54 if (layer >= 3) {
55 break;
56 }
57 continue;
58 }
59
60 if (pos + 2 >= static_cast<int>(rom_->size())) {
61 break;
62 }
63
64 uint8_t b3 = rom_data[pos + 2];
65 pos += 3;
66
67 RoomObject obj = RoomObject::DecodeObjectFromBytes(b1, b2, b3, static_cast<uint8_t>(layer));
68 obj.set_rom(rom_);
70 objects_.push_back(obj);
71 }
72
73 return absl::OkStatus();
74}
75
76} // namespace yaze::zelda3
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
auto data() const
Definition rom.h:203
auto size() const
Definition rom.h:202
bool is_loaded() const
Definition rom.h:197
std::vector< RoomObject > objects_
Definition room_layout.h:28
absl::StatusOr< int > GetLayoutAddress(int layout_id) const
absl::Status LoadLayout(int layout_id)
static RoomObject DecodeObjectFromBytes(uint8_t b1, uint8_t b2, uint8_t b3, uint8_t layer)
void set_rom(Rom *rom)
Definition room_object.h:67
uint16_t ReadWord(const Rom *rom, int pc_addr)
Zelda 3 specific classes and functions.
uint32_t SnesToPc(uint32_t addr) noexcept
Definition snes.h:8