yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
entity_mutation_service.cc
Go to the documentation of this file.
2
3#include <algorithm>
4
7
8namespace yaze {
9namespace editor {
10
12 : overworld_(overworld) {}
13
15 const std::string& type, const OverworldContextTarget& target,
16 uint8_t item_id) {
17 MutationResult result;
18 const auto* map = overworld_.overworld_map(target.map_id);
19 if (!target.valid() || !map || !overworld_.is_loaded() ||
20 GetParentMapId(map, target.map_id) != target.parent_map_id) {
21 result.status = absl::FailedPreconditionError(
22 "The insertion target is no longer available. Open the map menu "
23 "again.");
24 result.error_message = std::string(result.status.message());
25 return result;
26 }
27 return InsertEntity(type, target.world_position, target.map_id,
28 target.game_state, item_id);
29}
30
32 const std::string& type, ImVec2 pos, int map_id, int game_state,
33 uint8_t item_id) {
34 MutationResult result;
35
36 if (type == "entrance") {
37 auto res = editor::InsertEntrance(&overworld_, pos, map_id, false);
38 if (res.ok()) {
39 result.entity = *res;
40 } else {
41 result.status = res.status();
42 result.error_message =
43 "Cannot insert entrance: " + std::string(res.status().message());
44 }
45 } else if (type == "hole") {
46 auto res = editor::InsertEntrance(&overworld_, pos, map_id, true);
47 if (res.ok()) {
48 result.entity = *res;
49 } else {
50 result.status = res.status();
51 result.error_message =
52 "Cannot insert hole: " + std::string(res.status().message());
53 }
54 } else if (type == "exit") {
55 auto res = editor::InsertExit(&overworld_, pos, map_id);
56 if (res.ok()) {
57 result.entity = *res;
58 } else {
59 result.status = res.status();
60 result.error_message =
61 "Cannot insert exit: " + std::string(res.status().message());
62 }
63 } else if (type == "item") {
64 auto res = editor::InsertItem(&overworld_, pos, map_id, item_id);
65 if (res.ok()) {
66 result.entity = *res;
67 } else {
68 result.status = res.status();
69 result.error_message =
70 "Cannot insert item: " + std::string(res.status().message());
71 }
72 } else if (type == "sprite") {
73 auto res = editor::InsertSprite(&overworld_, pos, map_id, game_state, 0x00);
74 if (res.ok()) {
75 result.entity = *res;
76 } else {
77 result.status = res.status();
78 result.error_message =
79 "Cannot insert sprite: " + std::string(res.status().message());
80 }
81 } else {
82 result.status = absl::InvalidArgumentError("Unknown entity type: " + type);
83 }
84
85 return result;
86}
87
89 const zelda3::OverworldItem& source, int offset_x, int offset_y) {
90 MutationResult result;
91 auto res =
92 editor::DuplicateItemByIdentity(&overworld_, source, offset_x, offset_y);
93 if (res.ok()) {
94 result.entity = *res;
95 } else {
96 result.status = res.status();
97 result.error_message = "Failed to duplicate overworld item: " +
98 std::string(res.status().message());
99 }
100 return result;
101}
102
104 const zelda3::OverworldItem& item_identity) {
105 MutationResult result;
106 result.status = editor::RemoveItemByIdentity(&overworld_, item_identity);
107 if (!result.status.ok()) {
108 result.error_message = "Failed to delete selected item: " +
109 std::string(result.status.message());
110 }
111 return result;
112}
113
115 zelda3::Sprite* sprite, int game_state) {
116 MutationResult result;
117 if (!sprite) {
118 result.status = absl::InvalidArgumentError("Sprite is null");
119 return result;
120 }
121
122 auto& sprites = *overworld_.mutable_sprites(game_state);
123 auto it =
124 std::find_if(sprites.begin(), sprites.end(),
125 [sprite](const zelda3::Sprite& s) { return &s == sprite; });
126
127 if (it != sprites.end()) {
128 sprites.erase(it);
129 } else {
130 result.status =
131 absl::NotFoundError("Sprite not found in current game state");
132 }
133 return result;
134}
135
137 zelda3::OverworldEntrance* entrance) {
138 MutationResult result;
139 if (!entrance) {
140 result.status = absl::InvalidArgumentError("Entrance is null");
141 return result;
142 }
143 entrance->deleted = true;
144 return result;
145}
146
148 zelda3::OverworldExit* exit) {
149 MutationResult result;
150 if (!exit) {
151 result.status = absl::InvalidArgumentError("Exit is null");
152 return result;
153 }
154 exit->deleted_ = true;
155 return result;
156}
157
162
163} // namespace editor
164} // namespace yaze
EntityMutationService(zelda3::Overworld &overworld)
MutationResult DuplicateItem(const zelda3::OverworldItem &source, int offset_x, int offset_y)
MutationResult InsertEntity(const std::string &type, ImVec2 pos, int map_id, int game_state, uint8_t item_id=0)
Dispatches entity insertion based on type string.
MutationResult DeleteEntrance(zelda3::OverworldEntrance *entrance)
MutationResult DeleteItem(const zelda3::OverworldItem &item_identity)
zelda3::OverworldItem * ResolveNextSelection(const zelda3::OverworldItem &anchor_identity)
Resolves the best next item to select after a deletion.
MutationResult DeleteExit(zelda3::OverworldExit *exit)
MutationResult DeleteSprite(zelda3::Sprite *sprite, int game_state)
Represents an overworld exit that transitions from dungeon to overworld.
auto is_loaded() const
Definition overworld.h:803
auto overworld_map(int i) const
Definition overworld.h:737
auto mutable_sprites(int state)
Definition overworld.h:759
A class for managing sprites in the overworld and underworld.
Definition sprite.h:39
absl::StatusOr< zelda3::OverworldItem * > InsertItem(zelda3::Overworld *overworld, ImVec2 mouse_pos, int current_map, uint8_t item_id)
Insert a new item at the specified position.
absl::Status RemoveItemByIdentity(zelda3::Overworld *overworld, const zelda3::OverworldItem &item_identity)
Remove an item by value identity instead of pointer identity.
absl::StatusOr< zelda3::OverworldEntrance * > InsertEntrance(zelda3::Overworld *overworld, ImVec2 mouse_pos, int current_map, bool is_hole)
Flat helper functions for entity insertion/manipulation.
zelda3::OverworldItem * FindNearestItemForSelection(zelda3::Overworld *overworld, const zelda3::OverworldItem &anchor_identity)
Find the best next item to keep selection continuity after deletion.
absl::StatusOr< zelda3::OverworldExit * > InsertExit(zelda3::Overworld *overworld, ImVec2 mouse_pos, int current_map)
Insert a new exit at the specified position.
absl::StatusOr< zelda3::OverworldItem * > DuplicateItemByIdentity(zelda3::Overworld *overworld, const zelda3::OverworldItem &item_identity, int offset_x, int offset_y)
Duplicate an existing item by identity with a positional offset.
absl::StatusOr< zelda3::Sprite * > InsertSprite(zelda3::Overworld *overworld, ImVec2 mouse_pos, int current_map, int game_state, uint8_t sprite_id)
Insert a new sprite at the specified position.
uint8_t GetParentMapId(const zelda3::OverworldMap *map, int current_map)
Helper to get parent map ID for multi-area maps.
bool valid(int map_count=zelda3::kNumOverworldMaps) const