Go to file
VinPropane e31cd2df68 NEO-24: freshen server position before target-select + surface divergence on HUD
Fix "Tab says denied even though I'm in range of beta": root cause is the
race between the 20 Hz move-stream sampler and the target-select POST. A
Tab press right after the capsule stops can be validated against the
server's last sampled position, which trails the visible capsule by
several meters.

Client-side fixes (server contract unchanged):

- TargetSelectionClient.set_freshness_kick(authority, player): before each
  POST /target/select, submit a move-stream with the current player
  position so the server's stored snapshot is as fresh as possible when
  the range check runs. Wired in main.gd; optional so tests without the
  wiring still pass (regression-covered).
- PlayerPositionLabel now shows a "srv: (x,y,z) Δ=<d>m age=<ms>" line
  populated from PositionAuthorityClient.authoritative_ack, so any
  residual client/server divergence is visible in the HUD and future
  reports can point at it directly.
- Two new tests: select POST kicks exactly one freshness stream with the
  current player position before POSTing, and the kick is a no-op when
  the wiring is absent.

Docs: plan Decision 5, review follow-up #2, manual QA section 5 and
section 1, and client README updated to describe the new behaviors.
2026-04-21 23:21:16 -04:00
.cursor chore: require manual QA checklist per story in planning-implementation-docs rule 2026-04-21 22:21:44 -04:00
.github/workflows NS-21: fail CI if Godot logs SCRIPT ERROR during GdUnit discovery 2026-04-06 22:34:43 -04:00
.vscode chore: refine combat progression mechanics for clarity and balance 2026-04-03 19:07:15 -04:00
bruno/neon-sprawl-server chore: add Bruno API collection and testing-expectations for HTTP 2026-04-18 19:49:22 -04:00
client NEO-24: freshen server position before target-select + surface divergence on HUD 2026-04-21 23:21:16 -04:00
content chore: CI check for decomposition hybrid vocabulary (suggestion 4) 2026-04-03 21:29:28 -04:00
docs NEO-24: freshen server position before target-select + surface divergence on HUD 2026-04-21 23:21:16 -04:00
scripts chore: Fix gdlint/gdformat and harden pre-push on Windows 2026-04-11 00:01:25 -04:00
server NEO-23: code review follow-up (E1.M3 docs, GET 404 test, radius bounds) 2026-04-17 21:14:43 -04:00
.gitignore chore: gitignore VS Code machine-local settings.json 2026-04-08 22:11:31 -04:00
AGENTS.md chore: require manual QA checklist per story in planning-implementation-docs rule 2026-04-21 22:21:44 -04:00
NeonSprawl.sln NS-15 implement position state api 2026-03-29 23:08:17 -04:00
README.md chore: document governing design axioms (fun, cyberpunk theme) 2026-04-04 18:46:55 -04:00
docker-compose.yml Update README and documentation to reflect project rebranding to "Neon Sprawl". Revise links to vision plan and adjust references in tech stack and decomposition documents. Enhance README with repository layout and instructions for running the server and client. 2026-03-29 17:23:00 -04:00
gdlintrc NEO-22: Extract WASD locomotion for gdlint max-file-lines 2026-04-17 20:13:36 -04:00
neon_sprawl_vision.plan.md chore: document governing design axioms (fun, cyberpunk theme) 2026-04-04 18:46:55 -04:00

README.md

Neon Sprawl

Neon Sprawl is the working title for a crafting-focused sci-fi / cyberpunk MMORPG with gigs (combat roles) and open non-combat skills (solo-dev scope). Product intent and phase gates: neon_sprawl_vision.plan.md. Design axioms: it must be fun, and it must stay distinctly cyberpunk in theme (see Design axioms in the vision plan).

Tech stack (locked)

Area Choice
Client Godot 4.x (GDScript)
Game server C# / .NET 10 (ASP.NET Core), PostgreSQL, Protobuf (JSON OK for earliest spike)
Content JSON/YAML + JSON Schema in CI

Full rationale and constraints: docs/architecture/tech_stack.md.

Decomposition

Epic-level breakdown: docs/decomposition/README.md.

Git workflow

  • Documentation (Markdown under docs/, README files, neon_sprawl_vision.plan.md): work and commit directly on main.
  • Code and implementation (server/client source, Godot project, content/ data, Docker/build/CI config): use a branch, then merge to main when ready. Mixed doc + code changes follow the branch rule.

Repository layout (prototype scaffold)

Path Purpose
NeonSprawl.sln .NET solution
server/NeonSprawl.Server/ ASP.NET Core game server
client/ Godot 4.x project (import project.godot)
content/ JSON data + JSON Schema (skills/, schemas/)
docker-compose.yml Local PostgreSQL (docker compose up -d)

Run the server

cd server/NeonSprawl.Server && dotnet run

Then open http://localhost:5253/health (port from launchSettings.json).

Run Postgres locally

docker compose up -d

Connection (dev): host localhost, port 5432, database neon_sprawl, user neon_sprawl, password neon_sprawl_dev.

Run the client

Open the client/ folder in Godot 4.6 and run the main scene (see client/README.md).