All prototype targets now share `PrototypeTargetRegistry.SharedLockRadius` (= 6 m). Anchors moved to alpha `(-3, 0.5, -3)` and beta `(3, 0, 3)` so the two 6 m rings overlap ~3.5 m wide centered at origin, letting Tab flip between targets without locomotion. Spawn `(-5, -5)` keeps alpha in range (~2.83 m) and beta out (~11.31 m) so the existing soft-lock denial QA path at spawn still holds. `prototype_target_constants.gd` mirrors the shared radius + new anchors. The range-aware Tab picker now **skips the currently-locked id** so Tab always expresses a swap intent — if the only in-range target is already locked, the fallback picks the next cycle id and the server denies (preserves NEO-23's "Tab = visible denial when no swap possible" rule). Tests: - Server: new `PlayerTargetStateReaderTests.ComputeValidity_AtOrigin_…` asserts both targets report `Ok` at origin. Existing boundary test rewritten for the new alpha anchor. - Client: new `test_tab_from_locked_alpha_at_origin_swaps_to_beta_when_both_in_range` and `test_tab_when_only_current_lock_is_in_range_falls_back_to_cycle_for_denial`. Existing in-range/out-of-range positions updated for the new layout. Server 59/59 and client 95/95 suites pass. Plan Decision 7, review follow-up #4, manual QA section 5 (new "Tab-flip at origin" overlap sanity), and README updated. Per-target radii will return with real combat design (E5.M1) — this is a prototype stub. |
||
|---|---|---|
| .cursor | ||
| .github/workflows | ||
| .vscode | ||
| bruno/neon-sprawl-server | ||
| client | ||
| content | ||
| docs | ||
| scripts | ||
| server | ||
| .gitignore | ||
| AGENTS.md | ||
| NeonSprawl.sln | ||
| README.md | ||
| docker-compose.yml | ||
| gdlintrc | ||
| neon_sprawl_vision.plan.md | ||
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 onmain. - Code and implementation (server/client source, Godot project,
content/data, Docker/build/CI config): use a branch, then merge tomainwhen 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).