Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 02dec23c2a | |||
| 8c1cf9be36 | |||
| f5bb64e6c7 | |||
| 0ce3cae208 | |||
| a45d521567 | |||
| 5206c42cf0 | |||
| d2d6df3655 | |||
| 435e1c95d2 | |||
| 14dead194b | |||
| e794764269 | |||
| 6bd2e84048 | |||
| 62eece991c |
@@ -0,0 +1,112 @@
|
||||
# M02-GMP-INPUT-001 — Player input intent seam
|
||||
|
||||
<!-- OPENWC_CLAIM:M02-GMP-INPUT-001:sindo-main-codex:2026-07-16 -->
|
||||
<!-- OPENWC_HANDOFF:READY:M02-GMP-INPUT-001:6bd2e84 -->
|
||||
|
||||
## Ownership
|
||||
|
||||
- Target: M02
|
||||
- Program: GMP/FND
|
||||
- Owner/Agent ID: sindo-main-codex
|
||||
- Branch: `work/sindo-main-codex/m02-player-input`
|
||||
- Lease expires UTC: 2026-07-16
|
||||
- Integrator: M02 milestone integrator
|
||||
|
||||
## Outcome
|
||||
|
||||
Replace direct keyboard polling in the runtime player with remappable Input Map
|
||||
actions and an immutable `PlayerInputSource → MoveIntent` boundary while
|
||||
preserving the current render-sandbox movement behavior.
|
||||
|
||||
## Non-goals
|
||||
|
||||
- Extract local movement, terrain query, camera rig or character presenters.
|
||||
- Claim exact build-12340 movement/keybinding parity before original-client fixtures.
|
||||
- Change movement speeds, camera geometry, terrain sampling or renderer behavior.
|
||||
- Mark M02 complete or edit its checklist/Evidence.
|
||||
|
||||
## Paths
|
||||
|
||||
- Exclusive: `src/domain/input/`, `src/gameplay/input/`,
|
||||
`src/tests/scenes/player_input_regression.tscn`,
|
||||
`src/tools/verify_player_input.gd`, `docs/modules/player-input.md`, this claim
|
||||
- Shared/hotspots: `project.godot`,
|
||||
`src/scenes/player/third_person_wow_controller.gd`, `docs/modules/README.md`
|
||||
- Generated/ignored: Godot import metadata, `.uid` files and local renderer corpus
|
||||
|
||||
## Contracts and data
|
||||
|
||||
- Public API: immutable `MoveIntent`; `PlayerInputSource.sample_move_intent`
|
||||
- Configuration: additive `openwc_player_*` Input Map actions
|
||||
- Persistence/schema/cache: unchanged
|
||||
- Consumers: current sandbox player controller; later local movement controller
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Requires: merged M01 coordinate/streaming-focus contracts on master `62eece9`
|
||||
- Blocks: later M02 movement-controller extraction
|
||||
- External state: none; tests use synthetic Input Map events
|
||||
|
||||
## Verification
|
||||
|
||||
- Commands: dedicated player-input verifier, headless project load, coordinate
|
||||
boundary gate, coordination/documentation gates and diff hygiene
|
||||
- Fixtures: synthetic action strengths and configured default bindings
|
||||
- Fidelity evidence: current W/S/A/D, Shift, E/Q and Space sandbox behavior remains
|
||||
mapped through actions; exact 3.3.5a semantics remain unverified
|
||||
- Performance budget: one immutable intent allocation per physics tick; no I/O
|
||||
|
||||
## Documentation deliverables
|
||||
|
||||
- Inline API documentation for `MoveIntent`, `PlayerInputActions` and
|
||||
`PlayerInputSource`
|
||||
- Player-input module specification with inputs/outputs, data-flow and sequence diagrams
|
||||
- Module registry/source map and honest capability status
|
||||
|
||||
## Simplicity and naming
|
||||
|
||||
- Important names: `MoveIntent`, `PlayerInputSource`, `PlayerInputActions`
|
||||
- Simplest approach: immutable value, one input adapter and one controller consumer
|
||||
- Rejected complexity: input provider hierarchy, event bus and generic command framework
|
||||
- Unavoidable complexity: none
|
||||
- Measured optimization evidence: not applicable
|
||||
|
||||
## Status
|
||||
|
||||
- State: ready-for-review
|
||||
- Done: twelve remappable actions, immutable `MoveIntent`, stateless
|
||||
`PlayerInputSource`, controller migration, asset-free regression scene,
|
||||
dedicated verifier and module specification
|
||||
- Next: M02 integrator reviews and merges before local movement extraction
|
||||
- Blocked by:
|
||||
|
||||
## Handoff
|
||||
|
||||
- Commit: `6bd2e84`
|
||||
- Branch: `work/sindo-main-codex/m02-player-input`
|
||||
- Outcome: the runtime player no longer polls physical keyboard keys. Movement
|
||||
action strengths cross an immutable `MoveIntent` seam; camera and immediate
|
||||
sandbox-flight events use the same remappable action catalog.
|
||||
- Public contract: additive `MoveIntent`, `PlayerInputActions` and
|
||||
`PlayerInputSource`; no schema, cache, coordinate or renderer contract change.
|
||||
- Verification: `PLAYER_INPUT PASS actions=12 intent_cases=6 controller=1
|
||||
regression_scene=1`; asset-free scene smoke exited `0`; coordinate boundary
|
||||
(`88` files) and StreamingFocus gates passed; unified renderer dry-run passed
|
||||
all eight pre-capture gates and produced seven dry-run checkpoint results;
|
||||
coordination/documentation/diff gates passed.
|
||||
- Fidelity: W/S/A/D, Shift, E/Q, Space, right mouse, wheel and Escape remain the
|
||||
default sandbox bindings. Regression drives forward movement, camera zoom and
|
||||
immediate flight toggle through the real controller. This does not establish
|
||||
exact build-12340 default bindings, turn/strafe policy or gameplay movement parity.
|
||||
- Local verification inputs: the isolated worktree reused the existing ignored
|
||||
native DLL and generated ADT resource scripts. Proprietary extracted data and
|
||||
the character GLB were absent, so the renderer dry-run logged the expected
|
||||
missing-corpus diagnostics while all contract steps returned success.
|
||||
- Rebuild/migration: none. Action names are additive; persisted user-binding
|
||||
migration does not exist yet and is documented as a gap.
|
||||
- Remaining risks: production profile gating for sprint/free flight, exact
|
||||
3.3.5a bindings, local movement/terrain/camera/presentation extraction and
|
||||
broader movement/camera state tests remain M02 work.
|
||||
- Documentation: inline API comments plus `docs/modules/player-input.md` with
|
||||
inputs/outputs, data-flow and sequence diagrams, ownership, recovery,
|
||||
capability status, known gaps and source map.
|
||||
@@ -0,0 +1,117 @@
|
||||
# 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 -->
|
||||
|
||||
## 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.
|
||||
@@ -0,0 +1,118 @@
|
||||
# M02-GMP-TERRAIN-QUERY-001 — Player terrain query boundary
|
||||
|
||||
<!-- OPENWC_CLAIM:M02-GMP-TERRAIN-QUERY-001:sindo-main-codex:2026-07-16 -->
|
||||
<!-- OPENWC_HANDOFF:READY:M02-GMP-TERRAIN-QUERY-001:a45d521 -->
|
||||
|
||||
## Ownership
|
||||
|
||||
- Target: M02
|
||||
- Program: GMP/RND
|
||||
- Owner/Agent ID: sindo-main-codex
|
||||
- Branch: `work/sindo-main-codex/m02-terrain-query`
|
||||
- Lease expires UTC: 2026-07-16
|
||||
- Integrator: M02 milestone integrator
|
||||
|
||||
## Outcome
|
||||
|
||||
Introduce a typed `TerrainQuery` boundary and move ADT loading, caching, chunk
|
||||
selection and height interpolation out of `ThirdPersonWowController` without
|
||||
changing current spawn/ground-snap behavior.
|
||||
|
||||
## Non-goals
|
||||
|
||||
- Change ADT topology, coordinate formulas, terrain mesh or renderer caches.
|
||||
- Add physics collision, slopes, water, jump/fall/swim or server movement.
|
||||
- Reuse the streaming renderer cache before its public terrain-query contract exists.
|
||||
- Extract camera or character presentation.
|
||||
- Mark M02 complete or edit its checklist/Evidence.
|
||||
|
||||
## Paths
|
||||
|
||||
- Exclusive: `src/gameplay/terrain/`, `src/tools/verify_terrain_query.gd`,
|
||||
`docs/modules/terrain-query.md`, this claim
|
||||
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
|
||||
`src/tools/verify_player_input.gd`,
|
||||
`src/tools/verify_coordinate_conversion_boundaries.gd`,
|
||||
`docs/modules/local-player-movement.md`,
|
||||
`docs/modules/README.md`
|
||||
- Generated/ignored: local `.godot`, native DLL, generated ADT resources and renderer corpus
|
||||
|
||||
## Contracts and data
|
||||
|
||||
- Public API: `TerrainQuery.sample_ground_height(GodotWorldPosition)` returning
|
||||
immutable `TerrainGroundSample`
|
||||
- Production adapter: `AdtTerrainQuery` with owned per-tile parse cache
|
||||
- Test/data-source seam: optional ADT tile loader callable at construction
|
||||
- Coordinate contract version, ADT format, renderer cache and persistence: unchanged
|
||||
- Consumers: current player scene; future movement/collision policies
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Requires: merged movement controller on master `5206c42`
|
||||
- Blocks: camera/presentation extraction from the player hotspot
|
||||
- External state: production uses existing native `ADTLoader`; synthetic tests need no proprietary data
|
||||
|
||||
## Verification
|
||||
|
||||
- Commands: synthetic height/cache/failure verifier, player input/movement
|
||||
regressions, asset-free scene, coordinate/StreamingFocus gates, renderer dry-run
|
||||
and repository gates
|
||||
- Fixtures: synthetic 145-height chunk payload and injected flat terrain query
|
||||
- Fidelity evidence: preserves existing outer-grid bilinear interpolation,
|
||||
spawn ground offset and per-tick snap formula only
|
||||
- Performance budget: one cached tile lookup and local interpolation per ground query;
|
||||
no new I/O after first tile load
|
||||
|
||||
## Documentation deliverables
|
||||
|
||||
- Inline public API docs for query, sample and ADT adapter
|
||||
- Terrain-query module spec with inputs/outputs, data-flow, cache lifecycle and sequence diagrams
|
||||
- Updated movement/coordinate consumer boundaries, source maps and module registry
|
||||
|
||||
## Simplicity and naming
|
||||
|
||||
- Important names: `TerrainQuery`, `TerrainGroundSample`, `AdtTerrainQuery`
|
||||
- Simplest approach: one narrow query contract, one typed result and one existing-format adapter
|
||||
- Rejected complexity: general collision framework, terrain service locator and renderer-cache coupling
|
||||
- Unavoidable complexity: ADT 145-height layout and chunk lookup stay isolated in adapter
|
||||
- Measured optimization evidence: existing per-tile cache retained; no new optimization
|
||||
|
||||
## Status
|
||||
|
||||
- State: ready-for-review
|
||||
- Done: typed query/sample contract, cached ADT adapter, player migration,
|
||||
synthetic interpolation/cache/failure tests, injected scene regression and documentation
|
||||
- Next: M02 integrator reviews and merges before camera-rig extraction
|
||||
- Blocked by:
|
||||
|
||||
## Handoff
|
||||
|
||||
- Commit: `a45d521`
|
||||
- Branch: `work/sindo-main-codex/m02-terrain-query`
|
||||
- Outcome: `ThirdPersonWowController` no longer loads ADTs, caches tile
|
||||
dictionaries, selects chunks or interpolates height grids. It consumes a
|
||||
replaceable typed `TerrainQuery` and retains only existing offset/snap policy.
|
||||
- Public contracts: additive immutable `TerrainGroundSample`, replaceable
|
||||
`TerrainQuery`, cached `AdtTerrainQuery` and player `set_terrain_query`.
|
||||
Coordinate contract version, ADT/native format and renderer caches are unchanged.
|
||||
- Verification: `TERRAIN_QUERY PASS contract=4 interpolation=1 cache=1
|
||||
failures=2 player_injection=1`; player-input and local-movement regressions
|
||||
passed; asset-free scene exited `0`; coordinate boundary passed with five
|
||||
required consumers and StreamingFocus passed; renderer dry-run passed eight
|
||||
pre-capture gates and seven checkpoint plans; coordination/documentation/diff gates passed.
|
||||
- Fidelity: synthetic fractional-grid fixture locks the inherited 145-height
|
||||
outer-grid bilinear result within `0.002` Godot units; injected scene locks
|
||||
spawn offset `0.05` and physics snap. This is sandbox-regression evidence,
|
||||
not build-12340 triangle/hole/collision parity.
|
||||
- Local verification inputs: 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 all contract steps returned success.
|
||||
- Rebuild/migration: none; caches are transient and existing formats remain unchanged.
|
||||
- Remaining risks: first ADT parse remains synchronous as before; unavailable
|
||||
tiles cache until query replacement; player still owns snap policy; exact
|
||||
ADT triangle choice, holes, slopes, liquids and collision remain open.
|
||||
- Documentation: inline public APIs plus `docs/modules/terrain-query.md` with
|
||||
inputs/outputs, data-flow, cache state and cross-boundary sequence diagrams,
|
||||
ownership, failure/recovery, capability status and source map. Coordinate and
|
||||
movement consumer specifications were updated.
|
||||
@@ -0,0 +1,118 @@
|
||||
# M02-RND-CAMERA-001 — Third-person camera rig boundary
|
||||
|
||||
<!-- OPENWC_CLAIM:M02-RND-CAMERA-001:sindo-main-codex:2026-07-16 -->
|
||||
|
||||
## Ownership
|
||||
|
||||
- Target: M02
|
||||
- Program: RND/GMP
|
||||
- Owner/Agent ID: sindo-main-codex
|
||||
- Branch: `work/sindo-main-codex/m02-camera-rig`
|
||||
- Lease expires UTC: 2026-07-16
|
||||
- Integrator: M02 milestone integrator
|
||||
|
||||
## Outcome
|
||||
|
||||
Move mouse capture, orbit yaw/pitch, zoom state and Camera3D transforms from
|
||||
`ThirdPersonWowController` into a reusable `ThirdPersonCameraRig`, with an
|
||||
explicit replaceable camera-collision policy that preserves the current
|
||||
no-collision sandbox baseline.
|
||||
|
||||
## Non-goals
|
||||
|
||||
- Enable a new collision/raycast behavior before build-12340 comparison.
|
||||
- Change initial yaw/pitch, zoom limits, sensitivity, FOV, far plane or camera path.
|
||||
- Implement first-person, follow lag, shoulder offsets or cinematic cameras.
|
||||
- Change movement, terrain query, character presentation or renderer streaming focus.
|
||||
- Mark M02 complete or edit its checklist/Evidence.
|
||||
|
||||
## Paths
|
||||
|
||||
- Exclusive: `src/scenes/player/third_person_camera_rig.gd`,
|
||||
`src/scenes/player/camera_collision_policy.gd`,
|
||||
`src/scenes/player/no_camera_collision_policy.gd`,
|
||||
`src/tools/verify_third_person_camera_rig.gd`,
|
||||
`docs/modules/third-person-camera.md`, this claim
|
||||
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
|
||||
runtime streaming scenes, player regression scene,
|
||||
`src/tools/verify_player_input.gd`, `docs/modules/player-input.md`,
|
||||
`docs/modules/local-player-movement.md`, `docs/modules/README.md`
|
||||
- Generated/ignored: local `.godot`, native DLL, generated resources and renderer corpus
|
||||
|
||||
## Contracts and data
|
||||
|
||||
- Public API: `ThirdPersonCameraRig.initialize_for_character`,
|
||||
`handle_camera_input`, `godot_world_flight_movement_basis`, state getters and
|
||||
`set_collision_policy`
|
||||
- Policy: `CameraCollisionPolicy.resolve_camera_distance`; default
|
||||
`NoCameraCollisionPolicy` returns requested distance unchanged
|
||||
- Scene paths and renderer camera path remain unchanged
|
||||
- Schema/cache/coordinate contracts: unchanged
|
||||
- Consumers: player composition, sandbox flight movement and renderer viewport
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Requires: merged TerrainQuery package on master `f5bb64e`
|
||||
- Blocks: character appearance/animation extraction from remaining player hotspot
|
||||
- External state: none; tests use asset-free camera/player scene
|
||||
|
||||
## Verification
|
||||
|
||||
- Commands: dedicated orbit/zoom/clamp/policy verifier, input/movement/terrain
|
||||
regressions, asset-free scene, coordinate/StreamingFocus gates, renderer dry-run
|
||||
and repository gates
|
||||
- Fixtures: initial state, remappable action events, mouse deltas and fixed-distance policy
|
||||
- Fidelity evidence: preserve current `-18°` pitch, `8` distance, `1` zoom step,
|
||||
`2..18` clamp, `0.003` sensitivity and no-collision output
|
||||
| ||||