Commit Graph

57 Commits (ac9818a2cdcd857f9daa889ffd8fe4988cabc992)

Author SHA1 Message Date
VinPropane 453000d721 NEON-29: fix step-climb regression (snap Y floor + step assist snap)
Two independent root causes kept the player from climbing terrace steps:

1. snap_to_server used the raw surface Y from the server (e.g. 0.6 m for a
   platform) as global_position.y directly.  With capsule total half-height
   = 0.9 m this placed the bottom at -0.3 m underground.  The stale
   is_on_floor()==true + _floor_angle_loose_ticks==0 path skipped every
   move_and_slide(), so Jolt never resolved the penetration and the capsule
   froze at an intermediate Y.
   Fix: clamp global_position.y >= CAPSULE_HALF_HEIGHT + PLAYER_CAPSULE_RADIUS
   (0.9 m) in snap_to_server; force FLOOR_ANGLE_LOOSE_TICKS_AFTER_STOP
   corrective idle ticks afterwards.

2. Each _try_walk_step_assist() lift (0.11 m) was immediately undone by
   floor_snap_length = FLOOR_SNAP_MOVING = 0.32 m snapping the capsule back
   to the lower floor, which was only 0.11 m below the lifted bottom.
   Fix: add WALK_STEP_ASSIST_SNAP = 0.09 m constant and _step_assist_active
   bool.  While climbing, floor_snap_length uses the smaller constant in
   both _after_walk_move_and_slide() and the main physics loop.  The flag
   is cleared when the capsule lands cleanly (is_on_floor && !is_on_wall),
   or when the nav goal is cleared/snapped to server.

Also: is_on_wall() now counts as support in _step_assist_has_support() so
the assist fires while the capsule is floating but pressed against a step
face; _step_assist_active cleared on arrival, snap, and goal-clear; all
temporary DBG print() statements removed.
2026-04-11 22:15:24 -04:00
VinPropane f0b7ac02eb NEON-29: document arrival-check capsule-reference fix in plan 2026-04-11 19:35:58 -04:00
VinPropane 382e662f1d NEON-29: fix step assist guard and lift for flat-faced terrace steps
_try_walk_step_assist compared goal surface Y to the capsule centre
(~0.9 m above floor) instead of the actual capsule bottom, disabling
the assist for any surface below ~0.925 m — every terrace we added.
The lift formula used offsets 0.45/0.55 instead of the full capsule
total half-height (CAPSULE_HALF_HEIGHT + PLAYER_CAPSULE_RADIUS = 0.9),
producing zero/negative lift.

Fix: guard uses actual_feet_y = pos.y - CAPSULE_HALF_HEIGHT - PLAYER_CAPSULE_RADIUS;
lift targets goal.y + total_half_height via clampf. Flat floor clicks
and cylinder bumps are unaffected (guard still disabled when goal.y is
at or below true feet level).
2026-04-11 19:21:37 -04:00
VinPropane ac75af9c73 NEON-29: remove horizontal step limit; add HorizontalStepEnabled flag
Expanded 45×45 district made the 18 m MaxHorizontalStep too restrictive
(floor diagonal ~63 m). Add HorizontalStepEnabled to MovementValidationOptions
(default false, matching DistrictBoundsEnabled pattern) so the check is
skipped unless explicitly opted in. Add test for disabled case (9 pass).
Update README and plan with the decision.
2026-04-11 18:17:32 -04:00
VinPropane 8b8296648b NEON-29: add implementation plan for district expansion
Planning doc for expanding the prototype client district to ~5×
current footprint with terraces, step geometry, and extra obstacles
for camera/nav stress QA.
2026-04-11 18:00:14 -04:00
VinPropane 398317d64f NEON-28: Dev obstacle smoke, nav reparent on hide, and docs
- Input action dev_toggle_occluder_obstacle (Ctrl+Shift+K): toggle obstacle off nav source via reparent to World, rebake NavigationRegion3D, sync NavigationAgent3D; physics/process/collision hardening unchanged intent.

- Occluder dictionary keys by instance id; related client fixes and README/project input note.

- Plan and review: PARSED_GEOMETRY_BOTH / runtime geometry removal lesson for future mechanics.
2026-04-10 23:55:50 -04:00
VinPropane 1ab3fc1dca NEON-28: fix F9 nav rebake coroutine + resync agent goal 2026-04-10 23:13:00 -04:00
VinPropane bb39a64ebd NEON-28: rebake nav after F9 obstacle removal (dev smoke) 2026-04-10 23:11:01 -04:00
VinPropane b702b14be4 NEON-28: drop freed occluder keys without material restore 2026-04-10 23:09:12 -04:00
VinPropane e225f1c550 NEON-28: sync plan with review (physics tick, occluder handoff) 2026-04-10 22:53:36 -04:00
VinPropane 6340693b46 NEON-28: run follow camera in physics after Player (fix jitter) 2026-04-10 22:23:50 -04:00
VinPropane 15d304fa2c NEON-28: camera contracts, E6.M2 adjacency, occluder purge 2026-04-10 22:11:40 -04:00
VinPropane 7e674c3710 NEON-28: reconcile plan with Jira (MCP sync) 2026-04-10 21:59:35 -04:00
VinPropane 92104b0b53 NEON-28: add implementation plan for camera hardening 2026-04-10 21:56:44 -04:00
VinPropane 1f5c1e7619 NEON-16: harden idle jitter follow-up
Harden idle settling so flat ground, obstacle contacts, and rare bump-edge cases stop drifting instead of looping corrective nudges. Also resolves the saved review follow-up items and syncs the runtime docs to the final feet-height and idle-anchor behavior.
2026-04-10 00:46:53 -04:00
VinPropane 1f8c0d04d1 NEON-30: address review — check AC boxes, add manual-check section to README 2026-04-09 23:03:17 -04:00
VinPropane 0fa2c0f93b NEON-30: skip occluder bodies in ground-pick raycast loop
ground_pick.gd now checks _collider_is_occluder before the walkable
break: when the ray hits a body in the "occluder" group it advances
OCCLUDER_PICK_THROUGH past the hit point and continues, unconditionally
and regardless of OcclusionPolicy fade state.  Non-occluder click
targeting is unchanged.

Three unit tests added to ground_pick_test.gd covering occluder ancestry
detection.  Plan open questions and module doc updated.
2026-04-09 22:51:22 -04:00
VinPropane 71232c36ef NEON-27: address review suggestions — doc alignment pass
- Plan: reconcile null-material prose in "Material override strategy"
  to match implementation (null → new StandardMaterial3D, not skipped)
- module_dependency_register.md: E1.M2 note updated — occlusion shipped,
  only integration hardening (NEON-28) remains
- documentation_and_implementation_alignment.md: add E1.M2 tracking row
  (NEON-25–27 shipped, NEON-28 open)
- Review: strike through both suggestions as Done
2026-04-08 23:52:46 -04:00
VinPropane 8bc2efb854 NEON-27: check off all acceptance criteria; record PR screenshots
Before/after evidence: obstacle fades to ~25% alpha when occluding the
player; restores on clear. All three ACs satisfied.
2026-04-08 23:42:31 -04:00
VinPropane 15d405261f NEON-27: implement OcclusionPolicy — RayCast-based material fade
Adds OcclusionPolicy resource and wires it into IsometricFollowCamera.
Each _process frame, iterative rays from the camera eye to the player
focus detect bodies tagged "occluder"; their MeshInstance3D surfaces are
overridden with a transparent StandardMaterial3D (fade_alpha=0.25, instant).
Materials restore when the body clears the ray. Null-material surfaces
(e.g. the prototype Obstacle with no material assigned) receive a plain
transparent StandardMaterial3D so they fade correctly.

- client/scripts/occlusion_policy.gd — new Resource (enabled, fade_alpha,
  occluder_group, occluder_collision_mask, max_occluder_cast_depth,
  occluder_count_log_threshold, is_valid)
- client/resources/isometric_occlusion_policy.tres — default instance
- client/scripts/isometric_follow_camera.gd — occlusion_policy export,
  _update_occlusion pipeline, _apply_occluder_fade/_restore_occluder helpers,
  static occlusion_policy_is_valid guard, _exit_tree cleanup
- client/scenes/main.tscn — Obstacle tagged "occluder", policy assigned
- client/test/occlusion_policy_test.gd — new GdUnit4 unit tests
- client/test/isometric_follow_camera_test.gd — policy guard static tests
- docs/decomposition/modules/E1_M2_IsometricCameraController.md — NEON-27
  snapshot + readability demo gate note
- docs/plans/NEON-27-implementation-plan.md — null-material decision recorded
2026-04-08 23:34:00 -04:00
VinPropane b2d2500e6a NEON-27: record planning decisions in implementation plan
Occluder ID: explicit group tag. Fade: instant (no Tween). Non-StandardMaterial3D
surfaces: skip + push_warning. Rationale documented in Decisions table.
2026-04-08 23:28:02 -04:00
VinPropane 185af5a7f6 NEON-27: add implementation plan for OcclusionPolicy
Documents RayCast-based material-fade approach, files to add/modify,
GdUnit4 test coverage, and readability risk gate note.
2026-04-08 23:21:51 -04:00
VinPropane ff830813c7 NEON-26: address code review follow-ups (zoom validation, docs) 2026-04-08 22:58:28 -04:00
VinPropane 753ce84861 NEON-26: ZoomBandConfig, discrete zoom input, CameraState sync 2026-04-08 22:32:45 -04:00
VinPropane f4a30b1b9d NEON-26: add implementation plan for zoom bands 2026-04-08 22:17:36 -04:00
VinPropane e000da20ee NEON-15: address review nits (shutdown token, plan verification note) 2026-04-08 22:09:12 -04:00
VinPropane 8c3e8c0a03 NEON-15: apply code review doc suggestions (E1.M1 pointers, PR notes) 2026-04-08 21:59:53 -04:00
VinPropane 62ff210830 NEON-15: log plan decisions; require docs sync for planning/implementation 2026-04-08 21:49:56 -04:00
VinPropane abffd29299 NEON-15: add implementation plan for NpgsqlDataSource shutdown 2026-04-08 21:16:50 -04:00
VinPropane 4930fd89a6 NEON-25: isometric follow camera, CameraState, tests, and docs 2026-04-07 23:46:04 -04:00
VinPropane 644bfc8c3d NEON-25: lock low-controversy camera defaults in implementation plan 2026-04-07 23:34:20 -04:00
VinPropane 00c2c4520e NEON-25: add implementation plan for isometric follow camera 2026-04-07 23:27:44 -04:00
VinPropane fa19ab7337 chore: migrate Jira references from NS-* to NEON-* in docs and rules
Rename implementation plans and dated reviews to NEON issue numbers per
Atlassian project re-key. Update browse URLs, cross-links, module docs,
client/server READMEs, and Cursor rules (project key NEON).
2026-04-07 00:15:06 -04:00
VinPropane 791c7dad1b
Merge branch 'main' into NS-21-gdscript-unit-testing 2026-04-06 22:22:16 -04:00
VinPropane 7b11d4e238 NS-24: Eliminate idle jitter and movement QA bumps (Godot client)
Physics: Jolt 3D; physics_interpolation off; 120 TPS. CharacterBody3D idle
path uses dual floor_max_angle, rim/straddle and ridged-contact handling,
rim settle and random-floor-bump lip/wall escape, floor_block_on_wall,
NavigationAgent3D avoidance off, per-node interp off. No global_transform in
_process (avoid render/physics ghosting).

QA geometry: random_floor_bumps.gd (load from main.gd); each bump on its own
StaticBody3D under NavigationRegion3D; random_floor_bump_collision_constants.gd
for collider fudge and RANDOM_FLOOR_BUMP_MESH_GROUP.

Scene: player safe_margin and mesh Y lift; MoveRejectPedestal / MoveRejectFarPad
renamed from NS19*; Mat_player_capsule without polygon_offset (per follow-up).

Docs: NS-24 plan + resolution, client/README manual steps, code review
2026-04-05-NS-24.md; server/README bump height note. Code/scene identifiers
avoid ticket-based ns19_* naming.
2026-04-06 00:32:41 -04:00
VinPropane a02e54da2d NS-21: fold test CI into gdscript.yml; document test-with-scripts policy 2026-04-05 21:21:58 -04:00
VinPropane 6ff0c77da5 NS-21: add implementation plan for GDScript unit testing 2026-04-05 21:03:12 -04:00
VinPropane d22d252b59 docs: Link NS-24 for idle jitter (plan + client README) 2026-04-05 15:04:09 -04:00
VinPropane 14a6813985 NS-23: Document movement tradeoff — no required obstacle auto-nav
Align plan, client/server README, E1.M1 snapshot, and code review note with
the chosen design: descend bypass favors smooth stepped surfaces; multi-click
around obstacles is OK. NS-24 remains for idle jitter.
2026-04-05 14:56:52 -04:00
VinPropane 0ac059fa3b NS-23: NavigationAgent3D path-follow with server move authority 2026-04-05 00:23:03 -04:00
VinPropane 1f4e3c49f6 NS-23: Resolve agent tuning and nav sync risks in implementation plan 2026-04-05 00:14:37 -04:00
VinPropane ec3c0ee4fe NS-23: Add implementation plan and E1.M1 snapshot for path-follow kickoff 2026-04-05 00:10:11 -04:00
VinPropane 32d2153acb NS-19: server move validation, client rejection UX, scene QA props 2026-04-04 23:39:40 -04:00
VinPropane 7f81378361 NS-19: plan walkable bumps and tall pedestal for manual validation 2026-04-04 23:17:16 -04:00
VinPropane 8e421d09c1 NS-19: add files to add/modify and tests sections to plan 2026-04-04 23:14:47 -04:00
VinPropane 95f770d8ea NS-19: lock move validation plan to reject policy 2026-04-04 23:13:10 -04:00
VinPropane b043e8ac45 NS-18: InteractionRequest, client prototype, Postgres test UX
Server: POST /game/players/{id}/interact, HorizontalReach, prototype registry, DTOs, tests; default spawn (-5,0.9,-5); dev HttpLogging.

Client: terminal, radius glow preview, interaction_request_client (interact/E), main wiring; obstacle moved off center.

Tests: postgres.runsettings, launchSettings, Docker compose auto-start/teardown harness, async-safe init.

Docs: plan AC, E1.M1 snapshot, alignment table, server/client README, code review 2026-04-04.
2026-04-04 20:19:33 -04:00
VinPropane 06f9ce8647 NS-18: add implementation plan for InteractionRequest range check 2026-04-04 18:55:13 -04:00
VinPropane d11641159d chore: Epic 2 E2.M1 stub, content CI validation, doc follow-ups
- epic_02: expand E2.M1 module breakdown (non-combat SkillDef, allowedXpSourceKinds)
- PR gate: Python jsonschema validate content/skills vs skill-def.schema.json
- Add scripts/validate_content.py, requirements-content.txt; ignore .venv-content
- CT.M1, E2.M1, internal-content-authoring, content README: document CI spine
- Update 2026-04-03 branch review (suggestions 2–3 done)
2026-04-03 21:27:52 -04:00
VinPropane 107eda77d8 chore: add CT content-tooling track and vision plan tooling epic
- Add docs/decomposition/tooling/internal_authoring.md and CT.M1–M3 module stubs
- Register CT modules and cross-cutting section in decomposition README
- Add internal-content-authoring execution plan
- Extend neon_sprawl_vision.plan.md with Tooling epic (CT) in Core Epic Map and modules
2026-03-30 23:18:40 -04:00