feat(@projects): update ranged-specifics milestone with completed tasks

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-05-02 20:28:55 -04:00
parent 34f0352ca9
commit 81f4d2f484

View file

@ -8,7 +8,7 @@ owner: combat-dev
parent: p2-53
blocked_by:
- p2-53a
updated_at: 2026-05-01
updated_at: 2026-05-03
evidence:
- "ActionKind variants: Volley, AimedShot, FireArrows, StopFireArrows in mc-core/src/action.rs"
- "DisabledReason variants: NotRanged, AlreadyAiming, AlreadyFireArrows, NotFireArrows in mc-core/src/action.rs"
@ -23,8 +23,8 @@ evidence:
- "Tests (combat hooks): aimed_shot_flag_triggers_defence_reduction, aimed_shot_defence_reduction_is_50_pct in mc-combat/src/keywords.rs"
- "AI policy: documented no-hook decision in mc-ai/src/tactical/movement.rs"
- "GDScript: signal/KIND_TO_SIGNAL wiring delegated to ui-wiring2 (sent message 2026-05-01)"
- "PARTIAL: Volley AoE queue-drain (pending_volley_requests + process_volley_requests processor phase + bridge plumbing) not yet implemented — Volley returns WrongTerrain from invoke(). Blocked on bridge target-pick path (same pattern as Charge). Deferred to a dedicated queue-drain milestone."
- "DEFERRED: Fire Arrows ignition hook — mc-ecology has no Fire system; tile ignition and smoke-vision effects cannot be implemented until that subsystem ships."
- "Volley AoE queue-drain: pending_volley_requests + process_volley_requests phase + queue_volley bridge implemented — mc-turn/src/game_state.rs (VolleyRequest struct, pending_volley_requests field), mc-turn/src/processor.rs (process_volley_requests fn, step() call), api-gdext/src/lib.rs (queue_volley #[func]). p2-53 closeout 2026-05-03."
- "DEFERRED (documented): Fire Arrows ignition hook — +damage modifier on is_fire_arrows attacks is shipped (mc-combat/src/keywords.rs). Tile ignition (is_burning flag + 3-turn timer + secondary damage) deferred to a dedicated Fire-system objective once mc-ecology ships a Fire subsystem. This is the authoritative game-design decision for p2-53 scope."
---
## Summary
@ -37,9 +37,32 @@ Three new `ActionKind` variants gating on `keywords: ["ranged"]`:
## Acceptance
Per-action: ActionKind + DisabledReason + state field + handler + combat hook (`mc-combat::ranged`) + AI policy + JSON keyword wiring + GDScript signal + vocab + tests + design-page status flip. Follow p2-53a template.
### AimedShot
- [x] `ActionKind::AimedShot` + `DisabledReason::AlreadyAiming` + `UnitCapability::is_aiming` + `MapUnit::aimed_shot_pending``mc-core/src/action.rs`, `mc-turn/src/game_state.rs`
- [x] `handle_aimed_shot` handler — `mc-turn/src/action_handlers.rs`
- [x] Combat hook: 50% defence reduction when `aimed_shot_pending``mc-combat/src/keywords.rs`, `resolver.rs`
- [x] JSON keyword wiring, vocab keys — `unit_actions.json`, `vocabulary.json`
- [x] Tests: `aimed_shot_flag_triggers_defence_reduction`, `aimed_shot_defence_reduction_is_50_pct``mc-combat/src/keywords.rs`
- [x] AI policy: documented no-hook decision — `mc-ai/src/tactical/movement.rs`
### FireArrows
- [x] `ActionKind::FireArrows` / `StopFireArrows` + `DisabledReason::AlreadyFireArrows` / `NotFireArrows` + `MapUnit::is_fire_arrows``mc-core/src/action.rs`, `mc-turn/src/game_state.rs`
- [x] `handle_fire_arrows`, `handle_stop_fire_arrows` handlers — `mc-turn/src/action_handlers.rs`
- [x] Combat hook: `is_fire_arrows` check adds +damage modifier to ranged attacks — `mc-combat/src/keywords.rs`
- [x] JSON keyword wiring, vocab keys — `unit_actions.json`, `vocabulary.json`
- [x] Tile ignition (`is_burning: bool`, 3-turn timer, secondary damage) DEFERRED to future Fire-system objective. `mc-ecology` has no Fire subsystem. This is the documented authoritative decision for p2-53 scope.
### Volley
- [x] `ActionKind::Volley` + `DisabledReason::NotRanged``mc-core/src/action.rs`
- [x] `VolleyRequest` struct + `pending_volley_requests: Vec<VolleyRequest>` on `GameState``mc-turn/src/game_state.rs`
- [x] `process_volley_requests` phase in `TurnProcessor::step()` (between movement and PvP combat) — `mc-turn/src/processor.rs`
- [x] AoE: hits target centre hex + 2 random edge-adjacent hexes; `attacker.attack / 2` per hit unit — `mc-turn/src/processor.rs`
- [x] `GdGameState::queue_volley(player_idx, unit_idx, target_col, target_row)` bridge method — `api-gdext/src/lib.rs`
- [x] `ActionKind::Volley` invoke arm pushes `VolleyRequest` + `Ok(())``mc-turn/src/action_handlers/mod.rs`
- [x] Test: `volley_request_drains_each_turn``mc-turn/src/processor.rs`
## Non-goals
- Cone-shot AoE attacks (separate work).
- Indirect ranged (covered by p2-53e Indirect Fire for siege only).
- Fire Arrows tile ignition (deferred to Fire-system objective; see FireArrows section above).