12 : overworld_(overworld) {}
15 const std::string& type, ImVec2 pos,
int map_id,
int game_state) {
18 if (type ==
"entrance") {
23 result.
status = res.status();
25 "Cannot insert entrance: " + std::string(res.status().message());
27 }
else if (type ==
"hole") {
32 result.
status = res.status();
34 "Cannot insert hole: " + std::string(res.status().message());
36 }
else if (type ==
"exit") {
41 result.
status = res.status();
43 "Cannot insert exit: " + std::string(res.status().message());
45 }
else if (type ==
"item") {
50 result.
status = res.status();
52 "Cannot insert item: " + std::string(res.status().message());
54 }
else if (type ==
"sprite") {
59 result.
status = res.status();
61 "Cannot insert sprite: " + std::string(res.status().message());
64 result.
status = absl::InvalidArgumentError(
"Unknown entity type: " + type);
78 result.
status = res.status();
79 result.
error_message =
"Failed to duplicate overworld item: " +
80 std::string(res.status().message());
91 std::string(result.
status.message());
100 result.
status = absl::InvalidArgumentError(
"Sprite is null");
106 std::find_if(sprites.begin(), sprites.end(),
109 if (it != sprites.end()) {
113 absl::NotFoundError(
"Sprite not found in current game state");
122 result.
status = absl::InvalidArgumentError(
"Entrance is null");
133 result.
status = absl::InvalidArgumentError(
"Exit is null");
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)
zelda3::Overworld & overworld_
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.
auto mutable_sprites(int state)
A class for managing sprites in the overworld and underworld.
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.
std::string error_message
zelda3::GameEntity * entity