Merge pull request 'docs/decomposition-follow-up' (#3) from docs/decomposition-follow-up into main
Reviewed-on: don/untitled-cyberpunk-mmo#3main
commit
91bd18e69e
|
|
@ -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
|
||||
|
|
@ -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
|
||||
34
README.md
34
README.md
|
|
@ -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)).
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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 |
|
|
@ -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
|
||||
|
|
@ -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")
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
extends Node3D
|
||||
|
||||
func _ready() -> void:
|
||||
print("Neon Sprawl client bootstrap (Godot). Connect to game server TBD.")
|
||||
|
|
@ -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.
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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:
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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>
|
||||
|
|
@ -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();
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
|
|
@ -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`
|
||||
Loading…
Reference in New Issue