Compare commits
93 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c34e538dcf | |||
| 396be5e69d | |||
| 1792938567 | |||
| 0a09d7bc1e | |||
| 91f0ba8433 | |||
| 1b6c46870d | |||
| 2342430439 | |||
| c41e8886a6 | |||
| acb3a809bb | |||
| c13c993645 | |||
| 57ae1b8f16 | |||
| 24aef13801 | |||
| 4b90dbc1c1 | |||
| f800e11cd2 | |||
| 0d2c820ea7 | |||
| b568768866 | |||
| f36fabb8e1 | |||
| 9e69a8a95b | |||
| eb94cfc646 | |||
| aa21aafdfa | |||
| ea08b8ef51 | |||
| 630a0c131d | |||
| 10815be766 | |||
| 97480e06bb | |||
| 6617dfe74e | |||
| 61bad09a9c | |||
| 606770c525 | |||
| b73b2e74a2 | |||
| 1807c3a363 | |||
| 3c5880f190 | |||
| a7b2f9475b | |||
| a85e416cb8 | |||
| c69abd634f | |||
| cd23a62be8 | |||
| 2ee647a220 | |||
| 60f1e363c0 | |||
| cb103e1fde | |||
| d6e5b530ef | |||
| 8c46065ada | |||
| 9408d887ba | |||
| 80cb08422b | |||
| 0773de5977 | |||
| b697a896e8 | |||
| 6117e5282e | |||
| 53d84ccc8a | |||
| 7e35de7f61 | |||
| ba9f89691d | |||
| b58bf2caa6 | |||
| 52ea639d64 | |||
| a023d76eea | |||
| 7ece2abea2 | |||
| 10c5d4cc12 | |||
| e52f703da5 | |||
| 91f0724ce2 | |||
| 650d584ff0 | |||
| 643850c8ee | |||
| ad8fc41ace | |||
| d0f74f840b | |||
| 5b10288ff7 | |||
| e887c3bad5 | |||
| 0c24f96ae1 | |||
| ad0532925a | |||
| 9c3f7018fb | |||
| a100cede46 | |||
| 2466fd67d3 | |||
| 3d528e3bbf | |||
| a629bedccf | |||
| 4f566b1957 | |||
| d9c847c557 | |||
| 1bf5b526be | |||
| 9275fbe04f | |||
| eb122d52a9 | |||
| e819eeb35b | |||
| 8776a6b362 | |||
| c3094c9413 | |||
| 7d5d13f702 | |||
| 742c415885 | |||
| 8c71e46872 | |||
| ad820699bc | |||
| 97bb53f6cd | |||
| 68e6f60d90 | |||
| 02dec23c2a | |||
| 8c1cf9be36 | |||
| f5bb64e6c7 | |||
| 0ce3cae208 | |||
| a45d521567 | |||
| 5206c42cf0 | |||
| d2d6df3655 | |||
| 435e1c95d2 | |||
| 14dead194b | |||
| e794764269 | |||
| 6bd2e84048 | |||
| 62eece991c |
@@ -25,7 +25,8 @@ Paired run 2026-07-11 подтвердил крупный coordinate/placement g
|
|||||||
|
|
||||||
## Основные файлы
|
## Основные файлы
|
||||||
|
|
||||||
- `src/scenes/streaming/streaming_world_loader.gd` - главный runtime streamer мира.
|
- `src/render/world_render_facade.gd` - стабильная граница runtime/tools для focus и metrics.
|
||||||
|
- `src/scenes/streaming/streaming_world_loader.gd` - внутренний runtime streamer мира.
|
||||||
- `src/scenes/streaming/eastern_kingdoms_streaming.tscn` - текущая сцена для проверки Azeroth/Eastern Kingdoms.
|
- `src/scenes/streaming/eastern_kingdoms_streaming.tscn` - текущая сцена для проверки Azeroth/Eastern Kingdoms.
|
||||||
- `addons/mpq_extractor/loaders/adt_builder.gd` - сборка ADT terrain, control splat материалов и MH2O liquids.
|
- `addons/mpq_extractor/loaders/adt_builder.gd` - сборка ADT terrain, control splat материалов и MH2O liquids.
|
||||||
- `addons/mpq_extractor/loaders/m2_builder.gd` - сборка статического M2 mesh/material.
|
- `addons/mpq_extractor/loaders/m2_builder.gd` - сборка статического M2 mesh/material.
|
||||||
@@ -873,6 +874,176 @@ $exe = Join-Path $env:TEMP 'godot-4.6.1-openwc\Godot_v4.6.1-stable_win64.exe'
|
|||||||
- This closes a coordinate/renderer integration criterion only. It does not
|
- This closes a coordinate/renderer integration criterion only. It does not
|
||||||
claim TrinityCore row equivalence or visual parity with the original client.
|
claim TrinityCore row equivalence or visual parity with the original client.
|
||||||
|
|
||||||
|
## 2026-07-15 WorldRenderFacade First Seam
|
||||||
|
|
||||||
|
- Runtime streaming scenes, checkpoint capture and renderer probes now submit
|
||||||
|
typed focus through `WorldRenderFacade`; those callers no longer call the
|
||||||
|
monolithic streamer's focus methods or configure its focus source directly.
|
||||||
|
- Baseline capture reads queue/cache/activity counts through
|
||||||
|
`renderer_metrics_snapshot()`. The facade returns a deep copy, so diagnostics
|
||||||
|
cannot mutate renderer-owned state.
|
||||||
|
- `StreamingWorldLoader` remains the internal implementation and still owns all
|
||||||
|
queues, tasks, caches, nodes and RIDs. The facade adds no parallel state or
|
||||||
|
replacement scheduler.
|
||||||
|
- This package does not alter targets, budgets, cache versions, placement,
|
||||||
|
visibility, materials or animation. Environment, entity visuals and ground
|
||||||
|
query remain explicit follow-up facade contracts in M03.
|
||||||
|
|
||||||
|
## 2026-07-15 StreamingTargetPlanner Extraction
|
||||||
|
|
||||||
|
- Runtime and editor wanted/retained ADT set calculation now lives in the
|
||||||
|
scene-free `StreamingTargetPlanner`.
|
||||||
|
- `StreamingTargetPolicy` preserves existing chunk/tile radii, warm/prewarm/
|
||||||
|
retain margins and the clamped boundary-prefetch threshold.
|
||||||
|
- `StreamingTargetPlan` freezes its focus/wanted/retained result; the streamer
|
||||||
|
still owns available paths, load-queue distance sorting, loaded-tile LOD/detail
|
||||||
|
state, async work, caches, nodes and RIDs.
|
||||||
|
- Asset-free fixtures cover center, edge/corner prefetch, catalog filtering,
|
||||||
|
clamp and editor behavior plus bounded High-like iteration timing.
|
||||||
|
- Cache versions, quality profiles, queue priority and visible rendering rules
|
||||||
|
are unchanged by the extraction.
|
||||||
|
|
||||||
|
## 2026-07-16 RenderBudgetScheduler Extraction
|
||||||
|
|
||||||
|
- The scene-free `RenderBudgetScheduler` now owns the per-frame counters for 16
|
||||||
|
named renderer operation lanes. It owns no queue, task, cache, Node or RID.
|
||||||
|
- `StreamingWorldLoader` snapshots its existing exported limits once per process
|
||||||
|
frame and asks for a boolean permit immediately before each historically
|
||||||
|
budgeted operation.
|
||||||
|
- Chunk removals and creations intentionally share one `chunk_geometry` lane;
|
||||||
|
the existing removal-first drain order and combined limit are preserved.
|
||||||
|
- Loader teardown cancels permit issuance before waiting for asynchronous work.
|
||||||
|
Existing worker/result staleness checks and resource cleanup remain unchanged.
|
||||||
|
- Asset-free contracts cover exact bounds, independent/shared lanes, frame reset,
|
||||||
|
invalid inputs, terminal cancellation, detached diagnostics and hot-path timing.
|
||||||
|
- Defaults, quality presets, queue order, cache versions and visible rendering
|
||||||
|
rules are unchanged. Asset-backed p95/p99 comparison remains required.
|
||||||
|
|
||||||
|
## 2026-07-16 Streamer Internal Access Gate
|
||||||
|
|
||||||
|
- `verify_renderer_internal_access.gd` derives private queue, task, cache and
|
||||||
|
tile-state field names from `StreamingWorldLoader` declarations and rejects
|
||||||
|
external member/reflection access in gameplay and Godot `EditorPlugin` package sources.
|
||||||
|
- The gate follows the implementation inventory instead of duplicating a manual
|
||||||
|
list, so a newly named private renderer field is covered automatically when it
|
||||||
|
matches those ownership categories.
|
||||||
|
- Scene composition may still reference the loader script and the facade's
|
||||||
|
implementation path; those are composition details, not mutable queue access.
|
||||||
|
- Renderer diagnostic probes are added explicitly as their facade contracts land.
|
||||||
|
- This is a source-only boundary check and changes no renderer behavior or fidelity.
|
||||||
|
|
||||||
|
## 2026-07-16 Rendered Ground Query Facade
|
||||||
|
|
||||||
|
- `WorldRenderFacade.sample_ground_height()` accepts `GodotWorldPosition` and
|
||||||
|
returns renderer-owned immutable `RenderedGroundSample` from already loaded
|
||||||
|
quality/tile-LOD render meshes, avoiding a render-to-gameplay dependency.
|
||||||
|
- Its factories load the predeclared Script path instead of relying on a warm
|
||||||
|
global-class cache; a dedicated cold-start verifier covers this bootstrap path.
|
||||||
|
- `renderer_ground_query_snapshot()` preserves the terrain probe's tile readiness,
|
||||||
|
queue position, mesh bounds and nearby seam-fallback diagnostics as a detached
|
||||||
|
Dictionary; callers receive no queue, tile-state, Mesh or Node reference.
|
||||||
|
- `probe_render_terrain_height.gd` now uses this facade snapshot and no longer reads
|
||||||
|
`_tile_states`, `_tile_load_queue`, `_tile_loading_tasks` or `_available_tiles`.
|
||||||
|
- Gameplay continues using the independently composed M02 `TerrainQuery`/
|
||||||
|
`AdtTerrainQuery`. Loaded render meshes are diagnostic and are not authoritative
|
||||||
|
movement collision.
|
||||||
|
- The ray height, 3x3 tile search and `2/5/10/20/40`-unit nearby fallback are
|
||||||
|
preserved. No terrain geometry, cache, streaming or visual behavior changed.
|
||||||
|
|
||||||
|
## 2026-07-16 Terrain Chunk LOD Planner Extraction
|
||||||
|
|
||||||
|
- `TerrainChunkLodPlanner` now owns the pure mapping from populated parsed ADT
|
||||||
|
chunk indices to desired terrain LOD 0/1/2.
|
||||||
|
- `TerrainChunkLodPolicy` snapshots the existing enabled flag, three raw chunk
|
||||||
|
radii and chunk size once per streaming-target application.
|
||||||
|
- Horizontal XZ distance to the chunk center, inclusive squared thresholds,
|
||||||
|
sparse-index omission and historical negative-radius squaring are unchanged.
|
||||||
|
- `StreamingWorldLoader` still owns tile/chunk state, queues, operation budgets,
|
||||||
|
creation/removal, Mesh/Node/RID finalization and tile-LOD fallback.
|
||||||
|
- Cache formats, quality presets and visible behavior are unchanged. The
|
||||||
|
scene-free contract is formula evidence only; asset-backed p95/p99 and visual
|
||||||
|
acceptance remain required.
|
||||||
|
|
||||||
|
## 2026-07-16 Terrain Chunk Geometry Queue Planner Extraction
|
||||||
|
|
||||||
|
- `TerrainChunkGeometryQueuePlanner` now compares current and desired chunk state
|
||||||
|
and returns fresh chunk create/remove request arrays.
|
||||||
|
- LOD mismatches and absent chunks retain the existing request shape; creates
|
||||||
|
remain sorted by horizontal distance from chunk origin to streaming focus.
|
||||||
|
- Desired tile LOD still removes every current chunk, while sparse parsed chunk
|
||||||
|
records retain the existing tile-origin distance fallback.
|
||||||
|
- `StreamingWorldLoader` still owns queue storage/drains, removal-first execution,
|
||||||
|
the shared `chunk_geometry` budget lane and every Mesh/Node/RID side effect.
|
||||||
|
- Cache formats, quality profiles and visual rules are unchanged. Asset-backed
|
||||||
|
p95/p99 and visual acceptance remain required.
|
||||||
|
|
||||||
|
## 2026-07-16 M2 Unique Placement Registry Extraction
|
||||||
|
|
||||||
|
- `M2UniquePlacementRegistry` now owns positive ADT `MDDF.uniqueId` reservations
|
||||||
|
across streamed tiles using the existing `uid:<decimal>` keys.
|
||||||
|
- Missing/zero/negative IDs remain untracked; duplicates inside one reservation
|
||||||
|
call are suppressed and another tile records one skipped key until owner release.
|
||||||
|
- Owner release still lets the loader find eligible waiting tiles and enqueue the
|
||||||
|
existing detail retry path. First ownership remains tile-processing-order based.
|
||||||
|
- `StreamingWorldLoader` still owns tile state, retry queues, grouping/build tasks,
|
||||||
|
M2 caches, MultiMesh/Node/Mesh/material/RID creation and all operation budgets.
|
||||||
|
- M2/ADT cache formats, transforms, profiles and visible rules are unchanged.
|
||||||
|
Asset-backed cross-boundary p95/p99 and visual acceptance remain required.
|
||||||
|
|
||||||
|
## 2026-07-16 M2 Placement Transform Resolver Extraction
|
||||||
|
|
||||||
|
- `M2PlacementTransformResolver` now owns the pure ADT M2 basis and local
|
||||||
|
origin-compensation formulas used by worker grouping, placeholders and direct
|
||||||
|
instance creation.
|
||||||
|
- Regular models retain `Basis.from_euler`; `ElwynnCliffRock01/02` retain their
|
||||||
|
narrow shell correction; `NewWaterfall` and `ElwynnTallWaterfall01` retain
|
||||||
|
calibrated world yaw, local fall-axis twist and tall-sheet anchor compensation.
|
||||||
|
- Path separator/case/MDX handling, constants and caller-specific final scale
|
||||||
|
clamps are unchanged. The resolver owns no Node, task, cache or RID.
|
||||||
|
- Cache formats, placement positions and visible rules are unchanged by the
|
||||||
|
extraction. Asset-backed visual recheck and general placement parity remain gaps.
|
||||||
|
|
||||||
|
## 2026-07-16 World Environment Snapshot Facade
|
||||||
|
|
||||||
|
- `WorldEnvironmentSnapshot` carries one immutable finite time-of-day value,
|
||||||
|
normalized to `[0, 24)` hours; invalid non-finite input is explicit.
|
||||||
|
- `WorldRenderFacade.apply_environment_snapshot()` delegates the snapshot to the
|
||||||
|
scene-owned `WowSkyController`. The facade owns no `Environment`, sun, skybox,
|
||||||
|
shader global or DBC sampling state.
|
||||||
|
- Checkpoint capture now submits its manifest time through the facade instead of
|
||||||
|
locating `WowSkyController` and mutating `use_system_time`, `time_speed` and
|
||||||
|
`fixed_time_hours` directly.
|
||||||
|
- Applying a snapshot performs the same three fixed-clock assignments as the old
|
||||||
|
capture path. Light/Area/Skybox DBC lookup, interpolation, fog, sun and shader
|
||||||
|
behavior remain unchanged; weather and indoor environment state are follow-up work.
|
||||||
|
|
||||||
|
## 2026-07-16 World Entity Presentation Facade
|
||||||
|
|
||||||
|
- `EntityPresentationSnapshot` contract version 1 combines session `EntityId`,
|
||||||
|
typed Godot world position, visual PackedScene path, finite yaw/scale and visibility.
|
||||||
|
- `WorldRenderFacade.present_entity()` and `remove_entity()` delegate to an explicit
|
||||||
|
scene-owned `WorldEntityPresenter`; both runtime scenes compose that service.
|
||||||
|
- The presenter owns only visual subtrees. Same-path snapshots update transform/
|
||||||
|
visibility, changed paths replace after successful instantiation, and removal
|
||||||
|
detaches plus queues the owned root for deletion.
|
||||||
|
- The local player, authoritative state, GUID mapping and asset/display selection
|
||||||
|
remain outside this service. Runtime emits no entity commands yet, so baseline
|
||||||
|
output is unchanged.
|
||||||
|
- PackedScene loading is currently synchronous on create/replace and is a documented
|
||||||
|
prototype limitation, not an accepted network-scale frame-critical path.
|
||||||
|
|
||||||
|
## 2026-07-16 Terrain Quality Mesh Cache Extraction
|
||||||
|
|
||||||
|
- `TerrainQualityMeshCache` now owns full-quality terrain revisit Mesh references,
|
||||||
|
tile-key LRU order and source admission outside `StreamingWorldLoader`.
|
||||||
|
- The historical rules are unchanged: successful restore touches newest; store
|
||||||
|
trims oldest to `terrain_quality_mesh_cache_limit`; zero/negative capacity keeps
|
||||||
|
no entries; control-splat/splat sources are never retained in this revisit cache.
|
||||||
|
- The loader keeps three narrow adapters: restore into tile state, store after a
|
||||||
|
full-quality result and clear during existing world reset/shutdown.
|
||||||
|
- ADT parsing, quality tasks/results, tile state, cache format versions, material/
|
||||||
|
Node/RID finalization, budgets and visible terrain behavior remain loader-owned.
|
||||||
|
|
||||||
## Practical Rule For Future Work
|
## Practical Rule For Future Work
|
||||||
|
|
||||||
If something improves quality but creates visible hitch, it is not done. Move it to bake/cache/background work, split finalization over frames, or prewarm it before the player can see it.
|
If something improves quality but creates visible hitch, it is not done. Move it to bake/cache/background work, split finalization over frames, or prewarm it before the player can see it.
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
# 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 -->
|
||||||
|
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-INPUT-001:14dead1 -->
|
||||||
|
|
||||||
|
## 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,136 @@
|
|||||||
|
# M02-GMP-INPUT-PROFILE-335-001 — WoW 3.3.5a input profile
|
||||||
|
|
||||||
|
<!-- OPENWC_CLAIM:M02-GMP-INPUT-PROFILE-335-001:sindo-main-codex:2026-07-17 -->
|
||||||
|
|
||||||
|
## Ownership
|
||||||
|
|
||||||
|
- Target: M02
|
||||||
|
- Program: GMP/QAR
|
||||||
|
- Owner/Agent ID: sindo-main-codex
|
||||||
|
- Branch: `work/sindo-main-codex/m02-input-profile-335`
|
||||||
|
- Lease expires UTC: 2026-07-17
|
||||||
|
- Integrator: M02 milestone integrator
|
||||||
|
|
||||||
|
## Outcome
|
||||||
|
|
||||||
|
Add a profile-aware, remappable `Blizzlike335` input path whose default movement
|
||||||
|
bindings match the extracted build-12340 binding table while preserving the
|
||||||
|
existing `RenderSandbox` controls. Add deterministic turn intent and keyboard
|
||||||
|
turn consumption at the server-contract default turn rate.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Implement jump/fall/swim, network prediction or server reconciliation.
|
||||||
|
- Claim complete movement or camera parity from binding and turn-rate evidence.
|
||||||
|
- Persist user keybindings or build keybinding UI.
|
||||||
|
- Commit proprietary extracted client files.
|
||||||
|
- Mark M02 complete or edit its checklist/Evidence.
|
||||||
|
|
||||||
|
## Paths
|
||||||
|
|
||||||
|
- Exclusive: `src/tests/fixtures/player_input_profile_335.json`, this claim
|
||||||
|
- Shared/hotspots: `project.godot`, `src/domain/input/move_intent.gd`,
|
||||||
|
`src/gameplay/input/player_input_actions.gd`,
|
||||||
|
`src/gameplay/input/player_input_source.gd`,
|
||||||
|
`src/gameplay/movement/local_player_movement_controller.gd`,
|
||||||
|
`src/scenes/player/third_person_wow_controller.gd`,
|
||||||
|
`src/scenes/player/third_person_camera_rig.gd`, player/movement verifiers
|
||||||
|
and regression scene, `docs/modules/player-input.md`,
|
||||||
|
`docs/modules/local-player-movement.md`, `docs/modules/third-person-camera.md`
|
||||||
|
- Generated/ignored: local `.godot`, native DLL and proprietary extracted corpus
|
||||||
|
|
||||||
|
## Contracts and data
|
||||||
|
|
||||||
|
- `MoveIntent` gains an immutable, clamped signed turn axis.
|
||||||
|
- `PlayerInputSource` selects explicit sandbox or compatibility action sets at
|
||||||
|
construction and routes compatibility A/D to strafe while camera rotation is held.
|
||||||
|
- `LocalPlayerMovementController` converts turn intent into a deterministic yaw
|
||||||
|
delta without reading engine input or owning a scene transform.
|
||||||
|
- A sanitized JSON fixture records selected binding facts, source hashes and the
|
||||||
|
pinned TrinityCore 3.3.5 server-contract commit.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
- Requires: merged sandbox capability package on master `c3094c9`.
|
||||||
|
- Blocks: final M02 integration audit and milestone closeout.
|
||||||
|
- External state: local extracted build-12340 binding files are evidence inputs
|
||||||
|
only; committed tests are reproducible without them.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- Fixture schema/provenance and selected default-binding regression.
|
||||||
|
- Pure profile composition, A/D turn, Q/E strafe and camera-held A/D strafe cases.
|
||||||
|
- Deterministic turn-rate and controller integration regression.
|
||||||
|
- Existing M02 and repository gates remain required.
|
||||||
|
|
||||||
|
## Documentation deliverables
|
||||||
|
|
||||||
|
- Updated input/movement public API, profile matrix, data flow, sequence,
|
||||||
|
failure/recovery, fidelity provenance and source maps.
|
||||||
|
|
||||||
|
## Simplicity and naming
|
||||||
|
|
||||||
|
- Important names: `turn_axis`, `BLIZZLIKE_STRAFE_LEFT`, `TURN_LEFT`.
|
||||||
|
- Simplest approach: one profile selection at composition plus one scalar intent.
|
||||||
|
- Rejected complexity: input-context framework, command bus and persisted binding store.
|
||||||
|
- Unavoidable complexity: compatibility A/D behavior depends on camera-rotate state.
|
||||||
|
- Measured optimization evidence: not applicable.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
- State: ready-for-review
|
||||||
|
- Done: added distinct remappable profiles, signed turn intent/controller path,
|
||||||
|
camera-yaw synchronization, sanitized provenance fixture, regression coverage
|
||||||
|
and updated module specifications
|
||||||
|
- Next: milestone integrator reviews and merges `8776a6b`
|
||||||
|
- Blocked by:
|
||||||
|
|
||||||
|
<!-- OPENWC_HANDOFF:READY:M02-GMP-INPUT-PROFILE-335-001:8776a6b -->
|
||||||
|
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-INPUT-PROFILE-335-001:eb122d5 -->
|
||||||
|
|
||||||
|
## Handoff
|
||||||
|
|
||||||
|
- Branch/commit: `work/sindo-main-codex/m02-input-profile-335` at `8776a6b`.
|
||||||
|
- Outcome: `RenderSandbox` retains A/D strafe and debug E/Q/Space/Shift behavior;
|
||||||
|
`Blizzlike335` now samples W/S and Up/Down forward/back, Q/E strafe, A/D and
|
||||||
|
Left/Right turn, with A/D routed to strafe while right-mouse rotation is active.
|
||||||
|
- Public contracts: `MoveIntent.turn_axis`; profile-selecting
|
||||||
|
`PlayerInputSource.new(profile_id)`; pure compatibility composition;
|
||||||
|
`LocalPlayerMovementController.calculate_yaw_delta_radians(...)`; camera yaw
|
||||||
|
synchronization after keyboard turn. Unknown input profiles fail closed to
|
||||||
|
`Blizzlike335`.
|
||||||
|
- Project configuration: four additive compatibility actions; existing action
|
||||||
|
names and sandbox mappings remain valid. W/S also gain the original Up/Down
|
||||||
|
secondary defaults.
|
||||||
|
- Verification: player input `actions=16 intent_cases=9 profiles=3 fixture=1
|
||||||
|
controller=1 regression_scene=3`; movement `cases=15 state_transitions=2`;
|
||||||
|
capabilities `profiles=3 sprint=2 flight=2 scenes=2`; terrain
|
||||||
|
`contract=4 interpolation=1 cache=1 failures=2`; camera
|
||||||
|
`state_cases=12 policy_cases=3`; presentation `appearance_cases=9
|
||||||
|
animation_cases=10`; coordinate boundaries `files=101`; StreamingFocus
|
||||||
|
`runtime_scenes=2 capture_tools=3`.
|
||||||
|
- Renderer: unified dry-run passed project/material/dedupe/cache/manifest/
|
||||||
|
calibration/coordinate/server-spawn gates and planned all seven checkpoints;
|
||||||
|
coordinate gate reported `files=103`. Missing proprietary GLB/DBC/ADT inputs
|
||||||
|
produced the expected diagnostics only.
|
||||||
|
- Repository gates: documentation `module_specs=8`; coordination
|
||||||
|
`fallback_claims=31`, with the same five unrelated expired M00 warnings.
|
||||||
|
- Fidelity: local build-12340 `DefaultBindings.wtf` SHA-256
|
||||||
|
`35FFA0E4E2356A13A0633A848F9E57ABE7DF9D8A16C2245E15D33013AD2F56A5`
|
||||||
|
and `Bindings.xml` SHA-256
|
||||||
|
`2E01276AFB7462F1417710F13B4BF1A456341F7F28CC8AE0D6D9C7442D7F6793`
|
||||||
|
were rechecked and selected facts sanitized into the committed fixture.
|
||||||
|
TrinityCore revision `2853a621d6af91a803787a2b8a509f4ce3e0300d` supplies the
|
||||||
|
3.141594 rad/s player server-contract turn rate. WoWee revision
|
||||||
|
`626243e937fb93965fa583a6507ed5a1aa7dda4b` supports right-mouse A/D routing.
|
||||||
|
- Fidelity limits: server turn rate and public reference routing are not direct
|
||||||
|
original-client timing/behavior proof. Jump, autorun and left-button
|
||||||
|
camera/select defaults are recorded but not implemented. This package does
|
||||||
|
not claim complete input, movement or camera parity.
|
||||||
|
- Migration/cache: no persisted settings or cache schema. Future saved bindings
|
||||||
|
must migrate stable action names; current project users receive additive actions.
|
||||||
|
- Documentation: updated input, movement and camera APIs, inputs/outputs, data
|
||||||
|
flow, sequence, ownership, failure/recovery, configuration, fidelity and source maps.
|
||||||
|
- Recommended merge order: merge after sandbox capabilities (already on master),
|
||||||
|
then run the final M02 integration/evidence audit without marking the target
|
||||||
|
done solely from this package.
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
# 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.
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
# M02-GMP-SANDBOX-CAPABILITIES-001 — Debug movement capability gate
|
||||||
|
|
||||||
|
<!-- OPENWC_CLAIM:M02-GMP-SANDBOX-CAPABILITIES-001:sindo-main-codex:2026-07-16 -->
|
||||||
|
|
||||||
|
## Ownership
|
||||||
|
|
||||||
|
- Target: M02
|
||||||
|
- Program: GMP/FND
|
||||||
|
- Owner/Agent ID: sindo-main-codex
|
||||||
|
- Branch: `work/sindo-main-codex/m02-sandbox-capabilities`
|
||||||
|
- Lease expires UTC: 2026-07-16
|
||||||
|
- Integrator: M02 milestone integrator
|
||||||
|
|
||||||
|
## Outcome
|
||||||
|
|
||||||
|
Introduce an immutable local-player movement capability contract and require it
|
||||||
|
at the movement boundary so debug sprint and free flight execute only in the
|
||||||
|
explicit `RenderSandbox` profile and are rejected by `Blizzlike335`.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- Claim that current movement values or `Blizzlike335` locomotion are 1:1.
|
||||||
|
- Build a global application/profile framework before the application shell exists.
|
||||||
|
- Remove debug Input Map actions or change their current sandbox bindings.
|
||||||
|
- Implement jump, fall, swim, collision, server authority or reconciliation.
|
||||||
|
- Mark M02 complete or edit its checklist/Evidence.
|
||||||
|
|
||||||
|
## Paths
|
||||||
|
|
||||||
|
- Exclusive: `src/gameplay/movement/player_movement_capabilities.gd`,
|
||||||
|
`src/tools/verify_player_movement_capabilities.gd`, this claim
|
||||||
|
- Shared/hotspots: `src/gameplay/movement/local_player_movement_controller.gd`,
|
||||||
|
`src/scenes/player/third_person_wow_controller.gd`, movement/input verifiers,
|
||||||
|
player regression scene, `docs/modules/local-player-movement.md`,
|
||||||
|
`docs/modules/player-input.md`
|
||||||
|
- Generated/ignored: local `.godot`, native DLL, generated resources and renderer corpus
|
||||||
|
|
||||||
|
## Contracts and data
|
||||||
|
|
||||||
|
- `PlayerMovementCapabilities` owns immutable profile ID plus explicit debug
|
||||||
|
sprint/flight booleans and safe named factories.
|
||||||
|
- `LocalPlayerMovementController` requires the capability value; missing input
|
||||||
|
falls back to `Blizzlike335`, never sandbox.
|
||||||
|
- Player scene maps its exported profile selection once at the composition boundary.
|
||||||
|
- Input actions and `MoveIntent` remain unchanged; rejected debug requests have no effect.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
- Requires: merged character presentation package on master `8c71e46`.
|
||||||
|
- Blocks: final M02 integration audit and milestone closeout.
|
||||||
|
- External state: none; verification is asset-free.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- Pure profile factory/default and immutability regression.
|
||||||
|
- Sprint accepted in RenderSandbox and ignored in Blizzlike335.
|
||||||
|
- Flight toggle/vertical basis accepted in RenderSandbox and rejected in Blizzlike335.
|
||||||
|
- Real regression scene verifies both profile compositions.
|
||||||
|
- Existing input/movement/terrain/camera/presentation and renderer gates remain required.
|
||||||
|
- Fidelity evidence: negative proof that debug capabilities cannot affect the
|
||||||
|
compatibility profile; no positive movement parity claim.
|
||||||
|
|
||||||
|
## Documentation deliverables
|
||||||
|
|
||||||
|
- Inline public API and profile semantics on the capability/controller boundary.
|
||||||
|
- Updated movement and input specs: API, inputs/outputs, data flow, lifecycle,
|
||||||
|
failure/recovery, capability matrix and source map.
|
||||||
|
|
||||||
|
## Simplicity and naming
|
||||||
|
|
||||||
|
- Important name: `PlayerMovementCapabilities`.
|
||||||
|
- Simplest approach: one immutable value injected into the existing controller.
|
||||||
|
- Rejected complexity: autoload singleton, generic feature-flag service and global profile registry.
|
||||||
|
- Unavoidable complexity: one profile-to-capability mapping at scene composition.
|
||||||
|
- Measured optimization evidence: not applicable.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
- State: ready-for-review
|
||||||
|
- Done: added immutable capability contract, gated sprint/free-flight, covered
|
||||||
|
pure and real-scene profiles and updated movement/input specifications
|
||||||
|
- Next: milestone integrator reviews and merges `742c415`
|
||||||
|
- Blocked by:
|
||||||
|
|
||||||
|
<!-- OPENWC_HANDOFF:READY:M02-GMP-SANDBOX-CAPABILITIES-001:742c415 -->
|
||||||
|
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-SANDBOX-CAPABILITIES-001:c3094c9 -->
|
||||||
|
|
||||||
|
## Handoff
|
||||||
|
|
||||||
|
- Branch/commit: `work/sindo-main-codex/m02-sandbox-capabilities` at `742c415`.
|
||||||
|
- Outcome: debug sprint and free flight now require explicit
|
||||||
|
`PlayerMovementCapabilities.render_sandbox()`; `Blizzlike335`, unknown and
|
||||||
|
null capability inputs reject both effects.
|
||||||
|
- Public contract: immutable profile ID plus `allows_debug_sprint` and
|
||||||
|
`allows_debug_free_flight`; named factories map configuration once at the
|
||||||
|
composition boundary. The movement controller exposes its effective profile ID.
|
||||||
|
- Runtime composition: `ThirdPersonWowController.movement_profile_id` defaults
|
||||||
|
to `RenderSandbox`, preserving renderer-scene behavior. Selecting
|
||||||
|
`Blizzlike335` keeps ordinary movement while ignoring Shift/Space/E/Q effects.
|
||||||
|
- Verification: capability `profiles=3 sprint=2 flight=2 scenes=2 boundary=1`,
|
||||||
|
movement `cases=12 state_transitions=2`, input `actions=12 intent_cases=6`,
|
||||||
|
terrain `contract=4 interpolation=1 cache=1 failures=2`, camera
|
||||||
|
`state_cases=12 policy_cases=3`, presentation
|
||||||
|
`appearance_cases=9 animation_cases=10`, coordinate boundaries
|
||||||
|
`files=101 consumers=5`, and StreamingFocus `runtime_scenes=2 capture_tools=3` passed.
|
||||||
|
- Renderer: dry-run passed project/material/dedupe/cache/manifest/calibration/
|
||||||
|
|||||||