yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
dungeon_pit_damage_view_model.cc
Go to the documentation of this file.
2
3#include "absl/strings/str_format.h"
4#include "util/macro.h"
7
8namespace yaze::editor {
9namespace {
10
11bool IsValidRoomId(uint16_t room_id) {
12 return room_id < zelda3::kNumberOfRooms;
13}
14
15std::optional<uint16_t> FirstPitDamageMember(
16 const zelda3::PitDamageTable& table) {
17 for (uint16_t room_id : table.room_ids()) {
18 if (IsValidRoomId(room_id)) {
19 return room_id;
20 }
21 }
22 return std::nullopt;
23}
24
25std::optional<uint16_t> FirstNonPitDamageRoom(
26 const zelda3::PitDamageTable& table, uint16_t fallback) {
27 if (IsValidRoomId(fallback) && !table.Contains(fallback)) {
28 return fallback;
29 }
30 for (uint16_t room_id = 0; room_id < zelda3::kNumberOfRooms; ++room_id) {
31 if (!table.Contains(room_id)) {
32 return room_id;
33 }
34 }
35 return std::nullopt;
36}
37
39 uint16_t room_id, const char* room_label) {
40 if (table == nullptr) {
41 return absl::InvalidArgumentError("Pit damage table is unavailable");
42 }
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));
47 }
48 return absl::OkStatus();
49}
50
51} // namespace
52
54 const zelda3::PitDamageTable* table, int room_id,
55 uint16_t replacement_fallback, uint16_t victim_fallback) {
57 state.table_available = table != nullptr;
58 state.room_valid = room_id >= 0 && room_id < zelda3::kNumberOfRooms;
59 if (!state.table_available || !state.room_valid) {
60 return state;
61 }
62
63 state.room_id = static_cast<uint16_t>(room_id);
64 state.deals_damage = table->Contains(state.room_id);
65 state.dirty = table->dirty();
67 FirstNonPitDamageRoom(*table, replacement_fallback);
68 state.suggested_victim_room = FirstPitDamageMember(*table);
69 if (table->Contains(victim_fallback)) {
70 state.suggested_victim_room = victim_fallback;
71 }
72 return state;
73}
74
76 uint16_t current_room_id,
77 uint16_t victim_room_id) {
78 RETURN_IF_ERROR(ValidateTableAndRoom(table, current_room_id, "Current"));
79 RETURN_IF_ERROR(ValidateTableAndRoom(table, victim_room_id, "Victim"));
80 if (table->Contains(current_room_id)) {
81 return absl::FailedPreconditionError(absl::StrFormat(
82 "Room 0x%03X already deals pit damage", current_room_id));
83 }
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));
87 }
88 return table->ReplaceRoomId(victim_room_id, current_room_id);
89}
90
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));
100 }
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));
105 }
106 return table->ReplaceRoomId(current_room_id, replacement_room_id);
107}
108
109} // namespace yaze::editor
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)
Definition snes.cc:22