25 if (!rom || !rom->
is_loaded() || out ==
nullptr) {
26 return absl::InvalidArgumentError(
"ROM not loaded");
28 const auto& rom_data = rom->
vector();
29 if (kPitCount < 0 || kPitCount >=
static_cast<int>(rom_data.size()) ||
30 kPitPointer + 2 >=
static_cast<int>(rom_data.size())) {
31 return absl::OutOfRangeError(
"Pit count/pointer out of range");
34 const uint8_t max_offset = rom_data[
kPitCount];
35 const int entry_count = PitTableEntryCount(max_offset);
36 const int data_len = PitTableByteLength(max_offset);
38 const int pit_ptr_snes = (rom_data[
kPitPointer + 2] << 16) |
41 const int pit_data_pc =
SnesToPc(pit_ptr_snes);
42 if (pit_data_pc < 0 ||
43 pit_data_pc + data_len >
static_cast<int>(rom_data.size())) {
44 return absl::OutOfRangeError(
"Pit data region out of range");
49 for (
int offset = 0; offset < data_len; offset += 2) {
50 const int addr = pit_data_pc + offset;
51 const uint16_t room_id =
static_cast<uint16_t
>(rom_data[addr]) |
52 (
static_cast<uint16_t
>(rom_data[addr + 1]) << 8);
58 return absl::OkStatus();
63 return absl::InvalidArgumentError(
"ROM not loaded");
65 const auto& rom_data = rom->
vector();
66 if (kPitCount < 0 || kPitCount >=
static_cast<int>(rom_data.size()) ||
67 kPitPointer + 2 >=
static_cast<int>(rom_data.size())) {
68 return absl::OutOfRangeError(
"Pit count/pointer out of range");
71 const uint8_t max_offset = rom_data[
kPitCount];
72 const int expected_entries = PitTableEntryCount(max_offset);
73 const int data_len = PitTableByteLength(max_offset);
74 if (
static_cast<int>(
room_ids_.size()) != expected_entries) {
75 return absl::FailedPreconditionError(absl::StrFormat(
76 "PitDamageTable entry count %zu does not match ROM table capacity %d",
80 for (
size_t index = 0; index <
room_ids_.size(); ++index) {
81 const uint16_t room_id =
room_ids_[index];
83 return absl::InvalidArgumentError(absl::StrFormat(
84 "PitDamageTable room 0x%03X at index %zu is outside the dungeon "
89 return absl::AlreadyExistsError(absl::StrFormat(
90 "PitDamageTable room 0x%03X appears more than once", room_id));
95 const int pit_ptr_snes = (rom_data[
kPitPointer + 2] << 16) |
98 const int pit_data_pc =
SnesToPc(pit_ptr_snes);
99 if (pit_data_pc < 0 ||
100 pit_data_pc + data_len >
static_cast<int>(rom_data.size())) {
101 return absl::OutOfRangeError(
"Pit data region out of range");
104 std::vector<uint8_t> encoded;
105 encoded.reserve(data_len);
107 encoded.push_back(
static_cast<uint8_t
>(room_id & 0xFF));
108 encoded.push_back(
static_cast<uint8_t
>((room_id >> 8) & 0xFF));