Merge pull request 'docs/decomposition-follow-up' (#3) from docs/decomposition-follow-up into main

Reviewed-on: don/untitled-cyberpunk-mmo#3
main
don 2026-03-29 17:25:34 -04:00
commit 91bd18e69e
31 changed files with 303 additions and 18 deletions

24
.gitignore vendored 100644
View File

@ -0,0 +1,24 @@
# .NET
bin/
obj/
out/
*.user
*.suo
*.userosscache
.vs/
# Godot 4
.import/
export_presets.cfg
*.translation
# Mono build artifacts if you enable C# on the client later
client/.godot/
# OS / editor
.DS_Store
*.swp
.idea/
# Local secrets
.env
.env.*.local

27
NeonSprawl.sln 100644
View File

@ -0,0 +1,27 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "server", "server", "{8683E7E4-B4D9-4001-8E99-DA987A03A73D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NeonSprawl.Server", "server/NeonSprawl.Server/NeonSprawl.Server.csproj", "{098FCB1C-4A31-4E36-8D9C-1F1CEECDFF50}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{098FCB1C-4A31-4E36-8D9C-1F1CEECDFF50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{098FCB1C-4A31-4E36-8D9C-1F1CEECDFF50}.Debug|Any CPU.Build.0 = Debug|Any CPU
{098FCB1C-4A31-4E36-8D9C-1F1CEECDFF50}.Release|Any CPU.ActiveCfg = Release|Any CPU
{098FCB1C-4A31-4E36-8D9C-1F1CEECDFF50}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = postSolution
{098FCB1C-4A31-4E36-8D9C-1F1CEECDFF50} = {8683E7E4-B4D9-4001-8E99-DA987A03A73D}
EndGlobalSection
EndGlobal

View File

@ -1,6 +1,6 @@
# Untitled Cyberpunk MMO
# Neon Sprawl
Planning and vision for a classless, crafting-focused cyberpunk MMORPG (solo-dev scope). See [`cyberpunk_mmo_vision_86a57ef3.plan.md`](cyberpunk_mmo_vision_86a57ef3.plan.md).
**Neon Sprawl** is the working title for a classless, crafting-focused sci-fi / cyberpunk MMORPG (solo-dev scope). Product intent and phase gates: [`neon_sprawl_vision.plan.md`](neon_sprawl_vision.plan.md).
## Tech stack (locked)
@ -15,3 +15,33 @@ Full rationale and constraints: [`docs/architecture/tech_stack.md`](docs/archite
## Decomposition
Epic-level breakdown: [`docs/decomposition/README.md`](docs/decomposition/README.md).
## Repository layout (prototype scaffold)
| Path | Purpose |
|------|---------|
| [`NeonSprawl.sln`](NeonSprawl.sln) | .NET solution |
| [`server/NeonSprawl.Server/`](server/NeonSprawl.Server/) | ASP.NET Core game server |
| [`client/`](client/) | Godot 4.x project (import `project.godot`) |
| [`content/`](content/) | JSON data + JSON Schema (`skills/`, `schemas/`) |
| [`docker-compose.yml`](docker-compose.yml) | Local **PostgreSQL** (`docker compose up -d`) |
### Run the server
```bash
cd server/NeonSprawl.Server && dotnet run
```
Then open `http://localhost:5253/health` (port from `launchSettings.json`).
### Run Postgres locally
```bash
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/`](client/) folder in **Godot 4.2+** and run the main scene (see [`client/README.md`](client/README.md)).

12
client/README.md 100644
View File

@ -0,0 +1,12 @@
# Neon Sprawl — Godot client
Open this **`client/`** directory as a project in **Godot 4.2+** (4.x recommended).
- Main scene: `scenes/main.tscn` (bootstrap `scripts/main.gd`).
- Networking will use **WebSocket** or **TCP** to the C# server; authoritative logic stays on the server per [`docs/architecture/tech_stack.md`](../docs/architecture/tech_stack.md).
## First run
1. Install [Godot 4.x](https://godotengine.org/download).
2. In the project manager, **Import** and select `client/project.godot`.
3. Press **F5** to run the main scene.

4
client/icon.svg 100644
View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128">
<rect width="128" height="128" fill="#1a1a2e"/>
<rect x="24" y="40" width="80" height="48" rx="6" fill="#00f5d4" opacity="0.9"/>
</svg>

After

Width:  |  Height:  |  Size: 228 B

View File

@ -0,0 +1,20 @@
; Godot 4.x project — import this folder in the Godot project manager.
config_version=5
[application]
config/name="Neon Sprawl"
config/description="Neon Sprawl — prototype client (isometric MMO; planning docs in repo root)."
run/main_scene="res://scenes/main.tscn"
config/features=PackedStringArray("4.2", "Forward Plus")
config/icon="res://icon.svg"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
[rendering]
textures/canvas_textures/default_texture_filter=0

View File

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cyberpunkmmo_main"]
[ext_resource type="Script" path="res://scripts/main.gd" id="1_main"]
[node name="Main" type="Node3D"]
script = ExtResource("1_main")

View File

@ -0,0 +1,4 @@
extends Node3D
func _ready() -> void:
print("Neon Sprawl client bootstrap (Godot). Connect to game server TBD.")

10
content/README.md 100644
View File

@ -0,0 +1,10 @@
# Content data
Data-driven definitions (skills, items, recipes, quests) validated in CI with **JSON Schema**.
| Path | Purpose |
|------|---------|
| [`schemas/`](schemas/) | JSON Schema files (`*.schema.json`) |
| [`skills/`](skills/) | Skill catalogs and related tables |
Server load path and hot-reload policy are TBD; keep files versioned here as the source of truth.

View File

@ -0,0 +1,19 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://neon-sprawl.local/schemas/skill-def.json",
"title": "SkillDef",
"type": "object",
"additionalProperties": false,
"required": ["id", "category", "displayName"],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]*$"
},
"category": {
"type": "string",
"enum": ["gathering", "crafting", "combat", "exploration", "utility", "social"]
},
"displayName": { "type": "string", "minLength": 1 }
}
}

View File

@ -0,0 +1,20 @@
{
"schemaVersion": 1,
"skills": [
{
"id": "gathering_scrap",
"category": "gathering",
"displayName": "Scrap Salvaging"
},
{
"id": "crafting_engineering",
"category": "crafting",
"displayName": "Street Engineering"
},
{
"id": "combat_ballistics",
"category": "combat",
"displayName": "Ballistics"
}
]
}

21
docker-compose.yml 100644
View File

@ -0,0 +1,21 @@
# Local PostgreSQL for prototype / dev. Start: docker compose up -d
services:
postgres:
image: postgres:16-alpine
container_name: neon-sprawl-postgres
environment:
POSTGRES_USER: neon_sprawl
POSTGRES_PASSWORD: neon_sprawl_dev
POSTGRES_DB: neon_sprawl
ports:
- "5432:5432"
volumes:
- neon_sprawl_pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U neon_sprawl -d neon_sprawl"]
interval: 5s
timeout: 5s
retries: 5
volumes:
neon_sprawl_pgdata:

View File

@ -105,5 +105,5 @@ Revisit this document if:
## Related docs
- [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../cyberpunk_mmo_vision_86a57ef3.plan.md) — product locks and phase gates
- [`neon_sprawl_vision.plan.md`](../neon_sprawl_vision.plan.md) — product locks and phase gates
- [`docs/decomposition/README.md`](../decomposition/README.md) — epic/module decomposition

View File

@ -2,7 +2,7 @@
This workspace contains detailed planning artifacts derived from the finalized master plan:
- Source of truth: `cyberpunk_mmo_vision_86a57ef3.plan.md`
- Source of truth: [`neon_sprawl_vision.plan.md`](../neon_sprawl_vision.plan.md)
- Tech stack baseline: [`docs/architecture/tech_stack.md`](../architecture/tech_stack.md)
- Scope here: executable decomposition (epics, modules, milestones)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: `cyberpunk_mmo_vision_86a57ef3.plan.md`
- Master epic reference: `neon_sprawl_vision.plan.md`
- Related modules: `<E#.M# list>`
## Objective

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 1
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 1
- Related modules: E1.M1, E1.M2, E1.M3, E1.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 2
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 2
- Related modules: E2.M1, E2.M2, E2.M3, E2.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 3
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 3
- Related modules: E3.M1, E3.M2, E3.M3, E3.M4, E3.M5
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 4
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 4
- Related modules: E4.M1, E4.M2, E4.M3, E4.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 5
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 5
- Related modules: E5.M1, E5.M2, E5.M3, E5.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 6
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 6
- Related modules: E6.M1, E6.M2, E6.M3, E6.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 7
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 7
- Related modules: E7.M1, E7.M2, E7.M3, E7.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 8
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 8
- Related modules: E8.M1, E8.M2, E8.M3, E8.M4
## Ownership and success (Level 1)

View File

@ -2,7 +2,7 @@
## Source Anchors
- Master epic reference: [`cyberpunk_mmo_vision_86a57ef3.plan.md`](../../../cyberpunk_mmo_vision_86a57ef3.plan.md) — Core Epic Map, System Modules Epic 9
- Master epic reference: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, System Modules Epic 9
- Related modules: E9.M1, E9.M2, E9.M3, E9.M4
## Ownership and success (Level 1)

View File

@ -1,6 +1,6 @@
---
name: Cyberpunk MMO Vision
overview: Create a 50,000-foot planning document for a sci-fi/cyberpunk MMORPG inspired by RuneScape, focused on classless progression and deep crafting, with optional PvP and questing.
name: Neon Sprawl Vision
overview: Create a 50,000-foot planning document for Neon Sprawl, a sci-fi/cyberpunk MMORPG inspired by RuneScape, focused on classless progression and deep crafting, with optional PvP and questing.
todos:
- id: lock-critical-decisions
content: Combat model and world topology are locked; remaining decision is progression pace.
@ -20,11 +20,11 @@ todos:
isProject: false
---
# Cyberpunk MMORPG 50,000-Foot Plan
# Neon Sprawl — 50,000-Foot Plan
## Vision and Product Intent
Build a long-lived online world that captures the freedom and progression depth of RuneScape while delivering a distinct sci-fi/cyberpunk identity. The core player fantasy is to start as a low-tier citizen of a mega-city ecosystem and grow into a high-impact operator through any combination of skills, professions, social play, and questlines.
**Neon Sprawl** is a long-lived online world that captures the freedom and progression depth of RuneScape while delivering a distinct sci-fi/cyberpunk identity. The core player fantasy is to start as a low-tier citizen of a mega-city ecosystem and grow into a high-impact operator through any combination of skills, professions, social play, and questlines.
## Delivery Model Constraint (Locked)

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>NeonSprawl.Server</RootNamespace>
<AssemblyName>NeonSprawl.Server</AssemblyName>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,14 @@
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => Results.Text(
"Neon Sprawl game server — GET /health for JSON status.",
"text/plain"));
app.MapGet("/health", () => Results.Json(new
{
status = "ok",
service = "NeonSprawl.Server",
}));
app.Run();

View File

@ -0,0 +1,29 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:45900",
"sslPort": 0
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5253",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

17
server/README.md 100644
View File

@ -0,0 +1,17 @@
# Game server (`NeonSprawl.Server`)
ASP.NET Core **.NET 8** host for authoritative simulation (prototype: HTTP + health only).
## Run
```bash
cd server/NeonSprawl.Server
dotnet run
```
- Default URL is printed by Kestrel (see `Properties/launchSettings.json`, typically `http://localhost:5253`).
- Check `GET /health` for a JSON heartbeat.
## Solution
From repo root: `dotnet build NeonSprawl.sln`