3#include "absl/strings/str_format.h"
11bool IsValidRoomId(uint16_t room_id) {
17 for (uint16_t room_id : table.
room_ids()) {
18 if (IsValidRoomId(room_id)) {
27 if (IsValidRoomId(fallback) && !table.
Contains(fallback)) {
39 uint16_t room_id,
const char* room_label) {
40 if (table ==
nullptr) {
41 return absl::InvalidArgumentError(
"Pit damage table is unavailable");
43 if (!IsValidRoomId(room_id)) {
44 return absl::InvalidArgumentError(
45 absl::StrFormat(
"%s room 0x%03X is outside the dungeon room range",
46 room_label, room_id));
48 return absl::OkStatus();
55 uint16_t replacement_fallback, uint16_t victim_fallback) {
63 state.
room_id =
static_cast<uint16_t
>(room_id);
67 FirstNonPitDamageRoom(*table, replacement_fallback);
69 if (table->
Contains(victim_fallback)) {
76 uint16_t current_room_id,
77 uint16_t victim_room_id) {
78 RETURN_IF_ERROR(ValidateTableAndRoom(table, current_room_id,
"Current"));
80 if (table->
Contains(current_room_id)) {
81 return absl::FailedPreconditionError(absl::StrFormat(
82 "Room 0x%03X already deals pit damage", current_room_id));
84 if (!table->
Contains(victim_room_id)) {
85 return absl::FailedPreconditionError(absl::StrFormat(
86 "Victim room 0x%03X is not in RoomsWithPitDamage", victim_room_id));
92 uint16_t current_room_id,
93 uint16_t replacement_room_id) {
94 RETURN_IF_ERROR(ValidateTableAndRoom(table, current_room_id,
"Current"));
96 ValidateTableAndRoom(table, replacement_room_id,
"Replacement"));
97 if (!table->
Contains(current_room_id)) {
98 return absl::FailedPreconditionError(absl::StrFormat(
99 "Room 0x%03X is not in RoomsWithPitDamage", current_room_id));
101 if (table->
Contains(replacement_room_id)) {
102 return absl::FailedPreconditionError(
103 absl::StrFormat(
"Replacement room 0x%03X already deals pit damage",
104 replacement_room_id));
106 return table->
ReplaceRoomId(current_room_id, replacement_room_id);
const std::vector< uint16_t > & room_ids() const
absl::Status ReplaceRoomId(uint16_t old_room_id, uint16_t new_room_id)
bool Contains(uint16_t room_id) const
std::optional< uint16_t > FirstPitDamageMember(const zelda3::PitDamageTable &table)
absl::Status ValidateTableAndRoom(zelda3::PitDamageTable *table, uint16_t room_id, const char *room_label)
std::optional< uint16_t > FirstNonPitDamageRoom(const zelda3::PitDamageTable &table, uint16_t fallback)
Editors are the view controllers for the application.
PitDamageMembershipState BuildPitDamageMembershipState(const zelda3::PitDamageTable *table, int room_id, uint16_t replacement_fallback, uint16_t victim_fallback)
absl::Status RemoveCurrentRoomFromPitDamage(zelda3::PitDamageTable *table, uint16_t current_room_id, uint16_t replacement_room_id)
absl::Status AddCurrentRoomToPitDamage(zelda3::PitDamageTable *table, uint16_t current_room_id, uint16_t victim_room_id)
constexpr int kNumberOfRooms
#define RETURN_IF_ERROR(expr)
std::optional< uint16_t > suggested_replacement_room
std::optional< uint16_t > suggested_victim_room