1#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H
2#define YAZE_APP_ZELDA3_DUNGEON_ROOM_ENTRANCE_H
10#include "absl/status/status.h"
11#include "absl/strings/str_format.h"
50constexpr std::array<std::pair<uint32_t, uint32_t>, 17>
77 std::vector<DungeonEntranceWriteRange> ranges;
79 for (
const auto& [table_pc, record_width] :
81 const uint32_t begin =
82 table_pc +
static_cast<uint32_t
>(entrance_id) * record_width;
83 ranges.emplace_back(begin, begin + record_width);
91 const RoomEntrance& entrance,
141 if (!loaded_spawn.ok()) {
172 room_ =
static_cast<short>(
201 exit_ =
static_cast<short>(
230 return absl::FailedPreconditionError(
"ROM not loaded");
233 return absl::FailedPreconditionError(absl::StrFormat(
234 "Dungeon spawn point 0x%02X cannot be saved: spawn writes are "
235 "disabled through the legacy RoomEntrance model; use the dedicated "
236 "spawn ROM schema in DungeonSpawnPoint",
291 return absl::OkStatus();
327inline std::vector<DungeonEntranceWriteRange>
329 const std::array<RoomEntrance, kNumDungeonEntranceSlots>& entrances) {
330 std::vector<DungeonEntranceWriteRange> ranges;
334 if (!entrance.dirty()) {
338 ranges.insert(ranges.end(), entrance_ranges.begin(), entrance_ranges.end());
346 return absl::OutOfRangeError(
347 absl::StrFormat(
"Regular dungeon entrance ID %d is outside [0, %d)",
351 return absl::InvalidArgumentError(absl::StrFormat(
352 "Regular dungeon entrance 0x%02X is marked as a spawn point",
355 if (entrance.
entrance_id_ !=
static_cast<uint16_t
>(entrance_id)) {
356 return absl::InvalidArgumentError(absl::StrFormat(
357 "Regular dungeon entrance model ID 0x%02X does not match requested "
362 return absl::OutOfRangeError(absl::StrFormat(
363 "Regular dungeon entrance 0x%02X room ID %d is outside [0, %d)",
367 for (
const auto& [begin, end] :
369 if (end > rom.
size()) {
370 return absl::FailedPreconditionError(absl::StrFormat(
371 "Regular dungeon entrance 0x%02X write range "
372 "0x%06X-0x%06X exceeds ROM size 0x%X",
373 entrance_id, begin, end,
static_cast<uint32_t
>(rom.
size())));
376 return absl::OkStatus();
381 const std::array<RoomEntrance, kNumDungeonEntranceSlots>& entrances,
382 bool dirty_only =
true) {
386 if (dirty_only && !entrance.dirty()) {
392 return absl::OkStatus();
396 const std::array<RoomEntrance, kNumDungeonEntranceSlots>& entrances,
397 bool dirty_only =
true) {
399 if (dirty_only && !entrances[spawn_id].dirty()) {
402 return absl::FailedPreconditionError(absl::StrFormat(
403 "Dungeon spawn point 0x%02X is scheduled for save through the legacy "
404 "RoomEntrance model; use the dedicated DungeonSpawnPoint model",
407 return absl::OkStatus();
411 Rom* rom, std::array<RoomEntrance, kNumDungeonEntranceSlots>& entrances,
412 bool dirty_only =
true) {
414 return absl::FailedPreconditionError(
"ROM not loaded");
430 if (dirty_only && !entrance.dirty()) {
436 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::Status WriteByte(int addr, uint8_t value)
absl::Status WriteShort(int addr, uint16_t value)
uint8_t camera_scroll_controller
uint16_t camera_trigger_x
std::array< uint8_t, 8 > camera_scroll_boundaries
uint16_t horizontal_scroll
uint16_t camera_trigger_y
uint16_t overworld_door_tilemap
static absl::StatusOr< DungeonSpawnPoint > Load(const Rom &rom, int spawn_id)
Dungeon Room Entrance or Spawn Point.
absl::Status Save(Rom *rom, int entrance_id, bool is_spawn_point=false)
uint8_t camera_boundary_fw_
uint8_t camera_boundary_qe_
RoomEntrance(Rom *rom, uint8_t entrance_id, bool is_spawn_point=false)
uint8_t camera_boundary_fe_
uint8_t camera_boundary_fs_
uint8_t camera_boundary_qs_
uint8_t camera_boundary_qw_
uint16_t camera_trigger_y_
uint8_t camera_boundary_fn_
uint16_t camera_trigger_x_
uint8_t camera_boundary_qn_
bool is_spawn_point() const
std::vector< DungeonEntranceWriteRange > RegularDungeonEntranceWriteRanges(int entrance_id)
constexpr int bedPositionResetXLow
constexpr int bedSheetPositionX
constexpr int kEntranceCameraXTrigger
constexpr int kEntranceRoom
constexpr int dungeons_startrooms
constexpr std::array< std::pair< uint32_t, uint32_t >, 17 > kRegularDungeonEntranceTableLayout
constexpr int kEntranceDoor
constexpr int kEntranceXScroll
constexpr int bedPositionResetXHigh
constexpr int items_data_start
constexpr int bedPositionResetYHigh
absl::Status ValidateRegularDungeonEntranceForSave(const Rom &rom, const RoomEntrance &entrance, int entrance_id)
constexpr int bedPositionResetYLow
std::vector< DungeonEntranceWriteRange > CollectDirtyRegularDungeonEntranceWriteRanges(const std::array< RoomEntrance, kNumDungeonEntranceSlots > &entrances)
constexpr int bedPositionY
constexpr int initial_equipement
constexpr int kEntranceExit
constexpr int kNumRegularDungeonEntrances
constexpr int chests_msgid
constexpr int chests_itemsgfx
constexpr int chests_sramvalue
constexpr int chests_backupitems
constexpr int chests_xoffset
constexpr int kEntranceFloor
constexpr int bedPositionX
constexpr int kEntranceCameraYTrigger
constexpr int kEntranceBlockset
constexpr int kEntranceXPosition
constexpr int kEntranceLadderBG
constexpr int dungeons_endrooms
constexpr int kEntranceMusic
constexpr int chests_itemsproperties
absl::Status RejectUnsupportedDungeonSpawnPointSaves(const std::array< RoomEntrance, kNumDungeonEntranceSlots > &entrances, bool dirty_only=true)
absl::Status SaveAllDungeonEntrances(Rom *rom, std::array< RoomEntrance, kNumDungeonEntranceSlots > &entrances, bool dirty_only=true)
constexpr int kNumDungeonSpawnPoints
absl::Status ValidateRegularDungeonEntrancesForSave(const Rom &rom, const std::array< RoomEntrance, kNumDungeonEntranceSlots > &entrances, bool dirty_only=true)
constexpr int chests_sramaddress
constexpr int kNumberOfRooms
std::pair< uint32_t, uint32_t > DungeonEntranceWriteRange
constexpr int kEntranceScrollEdge
constexpr int kEntranceDungeon
constexpr int dungeons_bossrooms
constexpr int kEntranceScrollQuadrant
constexpr int kEntrancescrolling
constexpr int chests_yoffset
constexpr int kEntranceYScroll
constexpr int chests_itemswide
constexpr int items_data_end
constexpr int bedSheetPositionY
constexpr int kEntranceYPosition
#define RETURN_IF_ERROR(expr)