# M02-GMP-MOVEMENT-001 — Local movement state/controller ## 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.