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, ImVec2 pos, int map_id, int game_state) {
16 MutationResult result;
17
18 if (type == "entrance") {
19 auto res = editor::InsertEntrance(&overworld_, pos, map_id, false);
20 if (res.ok()) {
21 result.entity = *res;
22 } else {
23 result.status = res.status();
24 result.error_message =
25 "Cannot insert entrance: " + std::string(res.status().message());
26 }
27 } else if (type == "hole") {
28 auto res = editor::InsertEntrance(&overworld_, pos, map_id, true);
29 if (res.ok()) {
30 result.entity = *res;
31 } else {
32 result.status = res.status();
33 result.error_message =
34 "Cannot insert hole: " + std::string(res.status().message());
35 }
36 } else if (type == "exit") {
37 auto res = editor::InsertExit(&overworld_, pos, map_id);
38 if (res.ok()) {
39 result.entity = *res;
40 } else {
41 result.status = res.status();
42 result.error_message =
43 "Cannot insert exit: " + std::string(res.status().message());
44 }
45 } else if (type == "item") {
46 auto res = editor::InsertItem(&overworld_, pos, map_id, 0x00);
47 if (res.ok()) {
48 result.entity = *res;
49 } else {
50 result.status = res.status();
51 result.error_message =
52 "Cannot insert item: " + std::string(res.status().message());
53 }
54 } else if (type == "sprite") {
55 auto res = editor::InsertSprite(&overworld_, pos, map_id, game_state, 0x00);
56 if (res.ok()) {
57 result.entity = *res;
58 } else {
59 result.status = res.status();
60 result.error_message =
61 "Cannot insert sprite: " + std::string(res.status().message());
62 }
63 } else {
64 result.status = absl::InvalidArgumentError("Unknown entity type: " + type);
65 }
66
67 return result;
68}
69
71 const zelda3::OverworldItem& source, int offset_x, int offset_y) {
72 MutationResult result;
73 auto res =
74 editor::DuplicateItemByIdentity(&overworld_, source, offset_x, offset_y);
75 if (res.ok()) {
76 result.entity = *res;
77 } else {
78 result.status = res.status();
79 result.error_message = "Failed to duplicate overworld item: " +
80 std::string(res.status().message());
81 }
82 return result;
83}
84
86 const zelda3::OverworldItem& item_identity) {
87 MutationResult result;
88 result.status = editor::RemoveItemByIdentity(&overworld_, item_identity);
89 if (!result.status.ok()) {
90 result.error_message = "Failed to delete selected item: " +
91 std::string(result.status.message());
92 }
93 return result;
94}
95
97 zelda3::Sprite* sprite, int game_state) {
98 MutationResult result;
99 if (!sprite) {
100 result.status = absl::InvalidArgumentError("Sprite is null");
101 return result;
102 }
103
104 auto& sprites = *overworld_.mutable_sprites(game_state);
105 auto it =
106 std::find_if(sprites.begin(), sprites.end(),
107 [sprite](const zelda3::Sprite& s) { return &s == sprite; });
108
109 if (it != sprites.end()) {
110 sprites.erase(it);
111 } else {
112 result.status =
113 absl::NotFoundError("Sprite not found in current game state");
114 }
115 return result;
116}
117
119 zelda3::OverworldEntrance* entrance) {
120 MutationResult result;
121 if (!entrance) {
122 result.status = absl::InvalidArgumentError("Entrance is null");
123 return result;
124 }
125 entrance->deleted = true;
126 return result;
127}
128
130 zelda3::OverworldExit* exit) {
131 MutationResult result;
132 if (!exit) {
133 result.status = absl::InvalidArgumentError("Exit is null");
134 return result;
135 }
136 exit->deleted_ = true;
137 return result;
138}
139
144
145} // namespace editor
146} // namespace yaze
EntityMutationService(zelda3::Overworld &overworld)
MutationResult DuplicateItem(const zelda3::OverworldItem &source, int offset_x, int offset_y)
MutationResult DeleteEntrance(zelda3::OverworldEntrance *entrance)
MutationResult DeleteItem(const zelda3::OverworldItem &item_identity)
MutationResult InsertEntity(const std::string &type, ImVec2 pos, int map_id, int game_state)
Dispatches entity insertion based on type string.
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.
Represents the full Overworld data, light and dark world.
Definition overworld.h:261
auto mutable_sprites(int state)
Definition overworld.h:553
A class for managing sprites in the overworld and underworld.
Definition sprite.h:35
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.