diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8aa6685 --- /dev/null +++ b/.gitignore @@ -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 diff --git a/NeonSprawl.sln b/NeonSprawl.sln new file mode 100644 index 0000000..1ae92d7 --- /dev/null +++ b/NeonSprawl.sln @@ -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 diff --git a/README.md b/README.md index 1cfb03b..46c3cac 100644 --- a/README.md +++ b/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)). diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..4e8e4a5 --- /dev/null +++ b/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. diff --git a/client/icon.svg b/client/icon.svg new file mode 100644 index 0000000..da3561f --- /dev/null +++ b/client/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/project.godot b/client/project.godot new file mode 100644 index 0000000..7d439a8 --- /dev/null +++ b/client/project.godot @@ -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 diff --git a/client/scenes/main.tscn b/client/scenes/main.tscn new file mode 100644 index 0000000..39b869a --- /dev/null +++ b/client/scenes/main.tscn @@ -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") diff --git a/client/scripts/main.gd b/client/scripts/main.gd new file mode 100644 index 0000000..e45a4d4 --- /dev/null +++ b/client/scripts/main.gd @@ -0,0 +1,4 @@ +extends Node3D + +func _ready() -> void: + print("Neon Sprawl client bootstrap (Godot). Connect to game server TBD.") diff --git a/content/README.md b/content/README.md new file mode 100644 index 0000000..a16b047 --- /dev/null +++ b/content/README.md @@ -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. diff --git a/content/schemas/skill-def.schema.json b/content/schemas/skill-def.schema.json new file mode 100644 index 0000000..9a21a8d --- /dev/null +++ b/content/schemas/skill-def.schema.json @@ -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 } + } +} diff --git a/content/skills/prototype_skills.json b/content/skills/prototype_skills.json new file mode 100644 index 0000000..bf55cbc --- /dev/null +++ b/content/skills/prototype_skills.json @@ -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" + } + ] +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d060f15 --- /dev/null +++ b/docker-compose.yml @@ -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: diff --git a/docs/architecture/tech_stack.md b/docs/architecture/tech_stack.md index fd5a0e7..3507571 100644 --- a/docs/architecture/tech_stack.md +++ b/docs/architecture/tech_stack.md @@ -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 diff --git a/docs/decomposition/README.md b/docs/decomposition/README.md index f0af86d..612574b 100644 --- a/docs/decomposition/README.md +++ b/docs/decomposition/README.md @@ -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) diff --git a/docs/decomposition/epics/_epic_template.md b/docs/decomposition/epics/_epic_template.md index 889497f..d8f0f3a 100644 --- a/docs/decomposition/epics/_epic_template.md +++ b/docs/decomposition/epics/_epic_template.md @@ -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: `` ## Objective diff --git a/docs/decomposition/epics/epic_01_core_player_runtime.md b/docs/decomposition/epics/epic_01_core_player_runtime.md index e4e3877..a77e67e 100644 --- a/docs/decomposition/epics/epic_01_core_player_runtime.md +++ b/docs/decomposition/epics/epic_01_core_player_runtime.md @@ -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) diff --git a/docs/decomposition/epics/epic_02_classless_progression.md b/docs/decomposition/epics/epic_02_classless_progression.md index 36442d3..372a71b 100644 --- a/docs/decomposition/epics/epic_02_classless_progression.md +++ b/docs/decomposition/epics/epic_02_classless_progression.md @@ -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) diff --git a/docs/decomposition/epics/epic_03_crafting_economy.md b/docs/decomposition/epics/epic_03_crafting_economy.md index 4c68350..2fc18c3 100644 --- a/docs/decomposition/epics/epic_03_crafting_economy.md +++ b/docs/decomposition/epics/epic_03_crafting_economy.md @@ -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) diff --git a/docs/decomposition/epics/epic_04_world_topology.md b/docs/decomposition/epics/epic_04_world_topology.md index 356f137..f72db9d 100644 --- a/docs/decomposition/epics/epic_04_world_topology.md +++ b/docs/decomposition/epics/epic_04_world_topology.md @@ -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) diff --git a/docs/decomposition/epics/epic_05_pve_combat.md b/docs/decomposition/epics/epic_05_pve_combat.md index 93e288e..26962a8 100644 --- a/docs/decomposition/epics/epic_05_pve_combat.md +++ b/docs/decomposition/epics/epic_05_pve_combat.md @@ -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) diff --git a/docs/decomposition/epics/epic_06_pvp_security.md b/docs/decomposition/epics/epic_06_pvp_security.md index 5d6ce5a..928a110 100644 --- a/docs/decomposition/epics/epic_06_pvp_security.md +++ b/docs/decomposition/epics/epic_06_pvp_security.md @@ -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) diff --git a/docs/decomposition/epics/epic_07_quest_faction.md b/docs/decomposition/epics/epic_07_quest_faction.md index aa0b6b2..9791736 100644 --- a/docs/decomposition/epics/epic_07_quest_faction.md +++ b/docs/decomposition/epics/epic_07_quest_faction.md @@ -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) diff --git a/docs/decomposition/epics/epic_08_social_guild.md b/docs/decomposition/epics/epic_08_social_guild.md index 2796408..16d8bf9 100644 --- a/docs/decomposition/epics/epic_08_social_guild.md +++ b/docs/decomposition/epics/epic_08_social_guild.md @@ -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) diff --git a/docs/decomposition/epics/epic_09_liveops_integrity.md b/docs/decomposition/epics/epic_09_liveops_integrity.md index 82d9786..c4a450c 100644 --- a/docs/decomposition/epics/epic_09_liveops_integrity.md +++ b/docs/decomposition/epics/epic_09_liveops_integrity.md @@ -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) diff --git a/cyberpunk_mmo_vision_86a57ef3.plan.md b/neon_sprawl_vision.plan.md similarity index 98% rename from cyberpunk_mmo_vision_86a57ef3.plan.md rename to neon_sprawl_vision.plan.md index bd753a8..9a8e8c8 100644 --- a/cyberpunk_mmo_vision_86a57ef3.plan.md +++ b/neon_sprawl_vision.plan.md @@ -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) diff --git a/server/NeonSprawl.Server/NeonSprawl.Server.csproj b/server/NeonSprawl.Server/NeonSprawl.Server.csproj new file mode 100644 index 0000000..87441a4 --- /dev/null +++ b/server/NeonSprawl.Server/NeonSprawl.Server.csproj @@ -0,0 +1,11 @@ + + + + net8.0 + enable + enable + NeonSprawl.Server + NeonSprawl.Server + + + diff --git a/server/NeonSprawl.Server/Program.cs b/server/NeonSprawl.Server/Program.cs new file mode 100644 index 0000000..ddbd094 --- /dev/null +++ b/server/NeonSprawl.Server/Program.cs @@ -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(); diff --git a/server/NeonSprawl.Server/Properties/launchSettings.json b/server/NeonSprawl.Server/Properties/launchSettings.json new file mode 100644 index 0000000..0d1b63a --- /dev/null +++ b/server/NeonSprawl.Server/Properties/launchSettings.json @@ -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" + } + } + } +} diff --git a/server/NeonSprawl.Server/appsettings.Development.json b/server/NeonSprawl.Server/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/server/NeonSprawl.Server/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/server/NeonSprawl.Server/appsettings.json b/server/NeonSprawl.Server/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/server/NeonSprawl.Server/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..8a756ac --- /dev/null +++ b/server/README.md @@ -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`