12 : overworld_(overworld) {}
21 result.
status = absl::FailedPreconditionError(
22 "The insertion target is no longer available. Open the map menu "
32 const std::string& type, ImVec2 pos,
int map_id,
int game_state,
36 if (type ==
"entrance") {
41 result.
status = res.status();
43 "Cannot insert entrance: " + std::string(res.status().message());
45 }
else if (type ==
"hole") {
50 result.
status = res.status();
52 "Cannot insert hole: " + std::string(res.status().message());
54 }
else if (type ==
"exit") {
59 result.
status = res.status();
61 "Cannot insert exit: " + std::string(res.status().message());
63 }
else if (type ==
"item") {
68 result.
status = res.status();
70 "Cannot insert item: " + std::string(res.status().message());
72 }
else if (type ==
"sprite") {
77 result.
status = res.status();
79 "Cannot insert sprite: " + std::string(res.status().message());
82 result.
status = absl::InvalidArgumentError(
"Unknown entity type: " + type);
96 result.
status = res.status();
97 result.
error_message =
"Failed to duplicate overworld item: " +
98 std::string(res.status().message());
107 if (!result.
status.ok()) {
109 std::string(result.
status.message());
118 result.
status = absl::InvalidArgumentError(
"Sprite is null");
124 std::find_if(sprites.begin(), sprites.end(),
127 if (it != sprites.end()) {
131 absl::NotFoundError(
"Sprite not found in current game state");
140 result.
status = absl::InvalidArgumentError(
"Entrance is null");
151 result.
status = absl::InvalidArgumentError(
"Exit is null");
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::Overworld & overworld_
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 overworld_map(int i) const
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.
uint8_t GetParentMapId(const zelda3::OverworldMap *map, int current_map)
Helper to get parent map ID for multi-area maps.
std::string error_message
zelda3::GameEntity * entity
bool valid(int map_count=zelda3::kNumOverworldMaps) const