1bf5b526be
Work-Package: M02-QAR-INTEGRATOR-CLOSEOUT-001 Agent: sindo-main-codex Tests: all M02 contracts, renderer dry-run, documentation and coordination gates passed Fidelity: direct binding evidence and reference-only timing/routing are separated; remaining locomotion/camera gaps stay explicit
119 lines
5.6 KiB
Markdown
119 lines
5.6 KiB
Markdown
# M02-GMP-MOVEMENT-001 — Local movement state/controller
|
|
|
|
<!-- OPENWC_CLAIM:M02-GMP-MOVEMENT-001:sindo-main-codex:2026-07-16 -->
|
|
<!-- OPENWC_HANDOFF:READY:M02-GMP-MOVEMENT-001:435e1c9 -->
|
|
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-MOVEMENT-001:5206c42 -->
|
|
|
|
## Ownership
|
|
|
|
- Target: M02
|
|
- Program: GMP
|
|
- Owner/Agent ID: sindo-main-codex
|
|
- Branch: `work/sindo-main-codex/m02-local-movement`
|
|
- Lease expires UTC: 2026-07-16
|
|
- Integrator: M02 milestone integrator
|
|
|
|
## Outcome
|
|
|
|
Move local velocity, sandbox flight state, acceleration and directional speed
|
|
calculation from `ThirdPersonWowController` into a scene-free,
|
|
independently-testable local movement controller without changing current
|
|
sandbox motion.
|
|
|
|
## Non-goals
|
|
|
|
- Extract terrain queries, camera rig, character presentation or animation.
|
|
- Add jump/fall/swim, server prediction or reconciliation.
|
|
- Change current movement speeds, acceleration, camera-relative flight or ground snap.
|
|
- Gate debug movement by build profile; that remains a separate M02 package.
|
|
- Mark M02 complete or edit its checklist/Evidence.
|
|
|
|
## Paths
|
|
|
|
- Exclusive: `src/gameplay/movement/`,
|
|
`src/tools/verify_local_player_movement.gd`,
|
|
`docs/modules/local-player-movement.md`, this claim
|
|
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
|
|
`src/tools/verify_player_input.gd`, `docs/modules/player-input.md`,
|
|
`docs/modules/README.md`
|
|
- Generated/ignored: local `.godot`, native DLL, generated ADT resources and renderer corpus
|
|
|
|
## Contracts and data
|
|
|
|
- Public API: stateful `LocalPlayerMovementController`
|
|
- Inputs: immutable `MoveIntent`, local Godot movement basis and physics delta seconds
|
|
- Outputs: local Godot displacement and read-only velocity/flight state
|
|
- Schema/cache/coordinate contracts: unchanged
|
|
- Consumer: current sandbox player scene; later gameplay composition root
|
|
|
|
## Dependencies
|
|
|
|
- Requires: merged input seam on master `14dead1`
|
|
- Blocks: terrain query and camera/presentation extraction from the player hotspot
|
|
- External state: none; unit tests use synthetic intents and bases
|
|
|
|
## Verification
|
|
|
|
- Commands: dedicated pure movement verifier, player-input regression, asset-free
|
|
scene smoke, coordinate/StreamingFocus gates, renderer dry-run and repository gates
|
|
- Fixtures: identity/rotated/pitched bases, acceleration steps, sprint and flight transitions
|
|
- Fidelity evidence: exact current 7.0/4.5/4.5 speeds, 28.0 acceleration,
|
|
6x sandbox sprint and camera-relative free flight are regression-locked only
|
|
- Performance budget: one small state update per physics tick; no allocation, I/O or scene lookup
|
|
|
|
## Documentation deliverables
|
|
|
|
- Inline public API docs for movement state/configuration and update methods
|
|
- Local movement module specification with data-flow, state and sequence diagrams
|
|
- Updated player-input consumer diagram/status and module registry
|
|
|
|
## Simplicity and naming
|
|
|
|
- Important name: `LocalPlayerMovementController`
|
|
- Simplest approach: one stateful RefCounted owning velocity and flight toggle
|
|
- Rejected complexity: generic locomotion framework, ECS component hierarchy and event bus
|
|
- Unavoidable complexity: movement basis remains an explicit local-space input
|
|
so the pure controller does not discover player/camera Nodes
|
|
- Measured optimization evidence: not applicable
|
|
|
|
## Status
|
|
|
|
- State: ready-for-review
|
|
- Done: scene-free movement state/controller, player scene migration, twelve
|
|
numeric cases, two flight transitions, integrated regression and module documentation
|
|
- Next: M02 integrator reviews and merges before TerrainQuery extraction
|
|
- Blocked by:
|
|
|
|
## Handoff
|
|
|
|
- Commit: `435e1c9`
|
|
- Branch: `work/sindo-main-codex/m02-local-movement`
|
|
- Outcome: `ThirdPersonWowController` no longer owns velocity, flight state,
|
|
acceleration or directional speed calculation. It selects an explicit
|
|
Godot-world basis, applies returned displacement, and retains terrain and
|
|
presentation adapters for later M02 packages.
|
|
- Public contract: additive `LocalPlayerMovementController` with read-only
|
|
Godot-world velocity/flight state, `toggle_sandbox_flight` and `advance`.
|
|
Input, coordinate, cache and renderer contracts remain unchanged.
|
|
- Verification: `LOCAL_PLAYER_MOVEMENT PASS cases=12 state_transitions=2
|
|
scene_boundary=1`; `PLAYER_INPUT PASS actions=12 intent_cases=6 controller=1
|
|
regression_scene=1`; asset-free scene smoke exited `0`; coordinate boundary
|
|
and StreamingFocus passed; renderer dry-run passed all eight pre-capture gates
|
|
and seven checkpoint plans; coordination/documentation/diff gates passed.
|
|
- Fidelity: exact existing defaults are regression-locked—forward `7.0`,
|
|
backward/strafe `4.5`, acceleration `28.0`, sandbox sprint `6x`, vertical
|
|
flight `7.0`, velocity reset on toggle and camera-relative pitched flight.
|
|
This preserves the sandbox baseline but is not original-client evidence.
|
|
- Local verification inputs: the isolated worktree reused the existing ignored
|
|
native DLL and generated ADT resource scripts. Proprietary extracted data and
|
|
character GLB were absent, so renderer dry-run logged expected missing-corpus
|
|
diagnostics while every contract step returned success.
|
|
- Rebuild/migration: none; transient movement state is not persisted.
|
|
- Remaining risks: exported speed changes after `_ready` do not reconfigure the
|
|
controller; exact build-12340 movement semantics, terrain/collision state,
|
|
jump/fall/swim, server prediction and debug profile gating remain open.
|
|
- Documentation: inline public API plus `docs/modules/local-player-movement.md`
|
|
with inputs/outputs, data-flow, state and sequence diagrams, ownership,
|
|
recovery, capability status, risks and source map; player-input consumer
|
|
diagrams/status were updated.
|