12 : overworld_(overworld) {}
19 const bool is_project_terrain = target.
map_id >= 0xA0 && target.
map_id < 0xC0;
21 (!map && !is_project_terrain) ||
23 result.
status = absl::FailedPreconditionError(
24 "The insertion target is no longer available. Open the map menu "
34 const std::string& type, ImVec2 pos,
int map_id,
int game_state,
38 if (type ==
"entrance") {
43 result.
status = res.status();
45 "Cannot insert entrance: " + std::string(res.status().message());
47 }
else if (type ==
"hole") {
52 result.
status = res.status();
54 "Cannot insert hole: " + std::string(res.status().message());
56 }
else if (type ==
"exit") {
61 result.
status = res.status();
63 "Cannot insert exit: " + std::string(res.status().message());
65 }
else if (type ==
"item") {
70 result.
status = res.status();
72 "Cannot insert item: " + std::string(res.status().message());
74 }
else if (type ==
"sprite") {
79 result.
status = res.status();
81 "Cannot insert sprite: " + std::string(res.status().message());
84 result.
status = absl::InvalidArgumentError(
"Unknown entity type: " + type);
98 result.
status = res.status();
99 result.
error_message =
"Failed to duplicate overworld item: " +
100 std::string(res.status().message());
109 if (!result.
status.ok()) {
111 std::string(result.
status.message());
120 result.
status = absl::InvalidArgumentError(
"Sprite is null");
126 std::find_if(sprites.begin(), sprites.end(),
129 if (it != sprites.end()) {
133 absl::NotFoundError(
"Sprite not found in current game state");
142 result.
status = absl::InvalidArgumentError(
"Entrance is null");
153 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.
constexpr int kExpandedMapCount
std::string error_message
zelda3::GameEntity * entity
bool valid(int map_count=zelda3::kNumOverworldMaps) const