yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
sprite_interaction_handler.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_INTERACTION_SPRITE_INTERACTION_HANDLER_H_
2#define YAZE_APP_EDITOR_DUNGEON_INTERACTION_SPRITE_INTERACTION_HANDLER_H_
3
4#include <functional>
5#include <utility>
6#include <vector>
7
8#include "absl/status/status.h"
12
13namespace yaze {
14namespace editor {
15
22 public:
30
31 // ========================================================================
32 // BaseEntityHandler interface
33 // ========================================================================
34
35 void BeginPlacement() override;
36 void CancelPlacement() override { sprite_placement_mode_ = false; }
37 bool IsPlacementActive() const override { return sprite_placement_mode_; }
38
39 bool HandleClick(int canvas_x, int canvas_y) override;
40 void HandleDrag(ImVec2 current_pos, ImVec2 delta) override;
41 void HandleRelease() override;
42
43 void DrawGhostPreview() override;
44 void DrawSelectionHighlight() override;
45
46 std::optional<size_t> GetEntityAtPosition(int canvas_x,
47 int canvas_y) const override;
48
49 // ========================================================================
50 // Sprite-specific methods
51 // ========================================================================
52
56 void SetSpriteId(uint8_t id) { preview_sprite_id_ = id; }
57
61 uint8_t GetSpriteId() const { return preview_sprite_id_; }
62
66 void SelectSprite(size_t index);
67
71 void ClearSelection();
72
76 bool HasSelection() const { return selected_sprite_index_.has_value(); }
77
81 std::optional<size_t> GetSelectedIndex() const {
83 }
84
88 void DeleteSelected();
89 void DeleteAll();
90 bool NudgeSelected(int delta_x, int delta_y);
91 // ROM sprite fields: 5-bit coordinates/subtype, one-bit layer, key drop 0..2.
92 // Rejects reserved stream terminators and hidden key-marker encodings too.
93 static absl::Status ValidateSpriteProperties(uint8_t id, int x, int y,
94 int subtype, int layer,
95 int key_drop);
96 bool UpdateSprite(size_t index, uint8_t id, int x, int y, int subtype,
97 int layer, int key_drop);
98
99 // Preflight is read-only and runs before history or room data changes.
101 std::function<absl::Status(int, const std::vector<zelda3::Sprite>&)>;
103 sprite_mutation_preflight_ = std::move(callback);
104 }
105 const absl::Status& mutation_status() const { return mutation_status_; }
107 std::function<void(const absl::Status&)> callback) {
108 mutation_error_callback_ = std::move(callback);
109 }
110
122
123 private:
124 // Placement state
128
129 // Selection state
130 std::optional<size_t> selected_sprite_index_;
131 bool is_dragging_ = false;
134
136 std::function<void(const absl::Status&)> mutation_error_callback_;
137 absl::Status mutation_status_ = absl::OkStatus();
138
139 bool PreflightSprites(const std::vector<zelda3::Sprite>& candidate);
140
144 void PlaceSpriteAtPosition(int canvas_x, int canvas_y);
145
149 std::pair<int, int> CanvasToSpriteCoords(int canvas_x, int canvas_y) const;
150};
151
152} // namespace editor
153} // namespace yaze
154
155#endif // YAZE_APP_EDITOR_DUNGEON_INTERACTION_SPRITE_INTERACTION_HANDLER_H_
Abstract base class for entity interaction handlers.
Handles sprite placement and interaction in the dungeon editor.
GhostCapacityState GetPlacementGhostCapacityState() const
bool IsPlacementActive() const override
Check if placement mode is active.
bool PreflightSprites(const std::vector< zelda3::Sprite > &candidate)
bool UpdateSprite(size_t index, uint8_t id, int x, int y, int subtype, int layer, int key_drop)
void PlaceSpriteAtPosition(int canvas_x, int canvas_y)
Place sprite at position.
uint8_t GetSpriteId() const
Get current sprite ID for placement.
void CancelPlacement() override
Cancel current placement.
void HandleRelease() override
Handle mouse release.
void SelectSprite(size_t index)
Select sprite at index.
bool HasSelection() const
Check if a sprite is selected.
void SetSpriteMutationPreflight(SpriteMutationPreflight callback)
std::function< absl::Status(int, const std::vector< zelda3::Sprite > &)> SpriteMutationPreflight
std::function< void(const absl::Status &) mutation_error_callback_)
std::optional< size_t > GetEntityAtPosition(int canvas_x, int canvas_y) const override
Get entity at canvas position.
void DrawGhostPreview() override
Draw ghost preview during placement.
static absl::Status ValidateSpriteProperties(uint8_t id, int x, int y, int subtype, int layer, int key_drop)
bool was_placement_blocked() const
True if the most recent PlaceSpriteAtPosition was blocked.
void DrawSelectionHighlight() override
Draw selection highlight for selected entities.
void HandleDrag(ImVec2 current_pos, ImVec2 delta) override
Handle mouse drag.
bool HandleClick(int canvas_x, int canvas_y) override
Handle mouse click at canvas position.
std::optional< size_t > GetSelectedIndex() const
Get selected sprite index.
void SetSpriteId(uint8_t id)
Set sprite ID for placement.
void SetMutationErrorCallback(std::function< void(const absl::Status &)> callback)
std::pair< int, int > CanvasToSpriteCoords(int canvas_x, int canvas_y) const
Convert canvas to sprite coordinates (16-pixel grid)
void BeginPlacement() override
Begin placement mode.