1#ifndef YAZE_APP_EDITOR_DUNGEON_INTERACTION_DOOR_INTERACTION_HANDLER_H_
2#define YAZE_APP_EDITOR_DUNGEON_INTERACTION_DOOR_INTERACTION_HANDLER_H_
9#include "absl/status/status.h"
47 bool HandleClick(
int canvas_x,
int canvas_y)
override;
48 void HandleDrag(ImVec2 current_pos, ImVec2 delta)
override;
56 int canvas_y)
const override;
125 std::function<absl::Status(
int,
const std::vector<zelda3::Room::Door>&)>;
131 std::function<
void(
const absl::Status&)> callback) {
180 bool PreflightDoors(
const std::vector<zelda3::Room::Door>& candidate);
Abstract base class for entity interaction handlers.
Handles door placement and interaction in the dungeon editor.
void clear_placement_blocked()
bool HandleOverlayClick(int canvas_x, int canvas_y)
bool door_placement_mode_
std::pair< int, int > GetCurrentDragAnchorPosition() const
bool NudgeSelected(int delta_x, int delta_y)
void DrawSelectionHighlight() override
Draw selection highlight for selected entities.
void DrawSnapIndicators()
Draw snap position indicators during door drag.
void SetDoorMutationPreflight(DoorMutationPreflight callback)
PlacementBlockReason placement_block_reason_
void SelectDoor(size_t index)
Select door at index.
std::optional< size_t > selected_door_index_
bool PreflightDoors(const std::vector< zelda3::Room::Door > &candidate)
zelda3::DoorType preview_door_type_
void DrawGhostPreview() override
Draw ghost preview during placement.
void ClearSelection()
Clear door selection.
void NavigateToPairBadge(const PairBadgeOverlay &badge) const
zelda3::DoorType GetDoorType() const
Get current door type for placement.
void HandleDrag(ImVec2 current_pos, ImVec2 delta) override
Handle mouse drag.
std::function< void(const absl::Status &) mutation_error_callback_)
void DeleteSelected()
Delete selected door.
const absl::Status & mutation_status() const
bool UpdateDoor(size_t index, zelda3::DoorType type, zelda3::DoorDirection direction, uint8_t position)
uint8_t snapped_door_position_
void SetDoorType(zelda3::DoorType type)
Set door type for placement.
void CancelPlacement() override
Cancel current placement.
std::function< absl::Status(int, const std::vector< zelda3::Room::Door > &)> DoorMutationPreflight
PlacementBlockReason placement_block_reason() const
zelda3::DoorDirection detected_door_direction_
void BeginPlacement() override
Begin placement mode.
void HandleRelease() override
Handle mouse release.
absl::Status mutation_status_
bool HandleClick(int canvas_x, int canvas_y) override
Handle mouse click at canvas position.
std::optional< size_t > GetSelectedIndex() const
Get selected door index.
GhostCapacityState GetPlacementGhostCapacityState() const
void SetMutationErrorCallback(std::function< void(const absl::Status &)> callback)
bool IsPlacementActive() const override
Check if placement mode is active.
bool UpdateSnappedPosition(int canvas_x, int canvas_y)
Update snapped position based on cursor.
ImVec2 drag_grab_offset_from_anchor_
void PlaceDoorAtSnappedPosition(int canvas_x, int canvas_y)
Place door at snapped position.
bool MutateDoorType(size_t index, zelda3::DoorType new_type)
Change the type of a door in place, re-encoding ROM bytes.
std::optional< size_t > GetEntityAtPosition(int canvas_x, int canvas_y) const override
Get entity at canvas position.
bool was_placement_blocked() const
True if the most recent PlaceDoorAtSnappedPosition was blocked.
bool HasSelection() const
Check if a door is selected.
std::optional< PairBadgeOverlay > BuildPairBadgeOverlay(const zelda3::Room::Door &door, ImVec2 door_pos, ImVec2 door_size, float scale) const
DoorMutationPreflight door_mutation_preflight_
DoorType
Door types from ALTTP.
@ NormalDoor
Normal door (upper layer)
DoorDirection
Door direction on room walls.
@ North
Top wall (horizontal door, 4x3 tiles)
std::optional< size_t > target_door_index
Represents a door in a dungeon room.