# 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`](neon_sprawl_vision.plan.md). **Design axioms:** it must be **fun**, and it must stay **distinctly cyberpunk** in theme (see [Design axioms](neon_sprawl_vision.plan.md#design-axioms-governing) 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`](docs/architecture/tech_stack.md). Optional **local LLM in Cursor** (MLX on Apple Silicon): [`docs/dev/local-mlx-cursor.md`](docs/dev/local-mlx-cursor.md). ## Decomposition Epic-level breakdown: [`docs/decomposition/README.md`](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`](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.6** and run the main scene (see [`client/README.md`](client/README.md)). ### Git hooks and GDScript lint (recommended) Once per clone, from the repo root: ```bash ./scripts/install-git-hooks.sh python3 -m venv .venv-gd .venv-gd/bin/pip install "gdtoolkit==4.5.0" ``` This sets **`core.hooksPath=scripts/git-hooks`**. On push, when **`client/scripts/*.gd`** or **`client/test/*.gd`** changed in the commits being pushed, **pre-push** runs **`gdlint`** and **`gdformat --check`** on those trees (same as [`.github/workflows/gdscript.yml`](.github/workflows/gdscript.yml)). Install **gdtoolkit** in **`.venv-gd`** (gitignored) or globally so the hook can run; otherwise pushes with GDScript changes are blocked. Windows (PowerShell): `pwsh -File scripts/install-git-hooks.ps1`, then create `.venv-gd` and `pip install "gdtoolkit==4.5.0"` the same way. More detail: [`client/README.md`](client/README.md) (Git hooks section).