feat(input): v0.4.0 — was_action_released release-edge (P.3.10)

Additive, backward-compatible. Mirrors was_action_pressed dispatch
pattern. Selection-Lib's prev_click_down workaround now obsolete.
Engine bindings (was_released + was_mouse_released) added in
sporel-engine commit covering P.3.10 Task 1.

Removes was_released-edge entry from DEPRECATED-MVP list.
This commit is contained in:
Axel Meyer
2026-05-15 21:26:24 +02:00
parent 086c51ee28
commit 837dc3cbc7
3 changed files with 42 additions and 11 deletions

View File

@@ -1,7 +1,12 @@
-- =====================================================================
-- lib-core.input — Action-Mapping + Direction-Vector (v0.3.0)
-- lib-core.input — Action-Mapping + Direction-Vector (v0.4.0)
-- See: meta/docs/superpowers/specs/2026-05-12-p3-3-mouse-input-design.md
--
-- v0.4.0 (P.3.10 2026-05-15): was_action_released added — release-edge
-- detection parallel to was_action_pressed. Engine-Surface:
-- engine.input.was_released + was_mouse_released. Selection-Lib's
-- prev_click_down workaround promoted.
--
-- v0.3.0 (P.3.3 2026-05-12): bind() now accepts unified key+mouse
-- strings via BIND_MAP with kind-tagged entries ({kind="key"|"mouse",
-- code=<engine-int>}). Mixed bindings supported: e.g.
@@ -12,10 +17,10 @@
-- v0.2.0 (P.2.6 2026-05-11): bind() accepts string-key-names only.
-- Integer engine.input.KEY_* args are rejected.
--
-- Scope v0.3.0: action-mapping (string-key+mouse-arrays per action) +
-- direction-vector helper. DEPRECATED-MVP: mouse-wheel, was_released
-- edge, mouse-delta helper, side-buttons, gamepad bindings,
-- action-context-stack, key-rebinding config.
-- Scope v0.4.0: action-mapping (string-key+mouse-arrays per action) +
-- press-edge + release-edge detection + direction-vector helper.
-- DEPRECATED-MVP: mouse-wheel, mouse-delta helper, side-buttons,
-- gamepad bindings, action-context-stack, key-rebinding config.
-- =====================================================================
-- Unified string → {kind, code} mapping. Lowercase convention.
@@ -126,6 +131,16 @@ function M.was_action_pressed(action_name)
return false
end
function M.was_action_released(action_name)
local entries = bindings[action_name]
if not entries then return false end
for _, e in ipairs(entries) do
if e.kind == "key" and engine.input.was_released(e.code) then return true end
if e.kind == "mouse" and engine.input.was_mouse_released(e.code) then return true end
end
return false
end
-- Direction-vector helper: returns {x, y} in {-1, 0, +1} each axis.
-- Y-down-positive per Sporel pixel-convention (ADR-0031).
function M.direction(left_action, right_action, up_action, down_action)
@@ -144,7 +159,6 @@ end
-- DEPRECATED-MVP (P.3.3-introduced):
-- mouse-wheel binding (wheel_up/wheel_down) — P.3-future-slice (post-P.3.4); continuous-vs-edge brainstorming needed
-- was_action_released(action) — lift-detection-edge (both key + mouse atomic)
-- mouse-delta helper (engine.input.get_mouse_delta) — P.3.5/6 drag-pan / drag-box
-- mouse-button side-buttons (mouse_4 / mouse_5) — additive extension
-- mouse-position lib-wrapper (input.mouse_pos() → {x,y}) — convenience layer