# Orbit > A procedurally generated space RPG in the spirit of *Privateer*, in > top-down 2D. Built with **Phaser 4** as plain **ES6 modules** — no build > step, no package managers required to run. ## Run it Any static file server works (Python, Node, Caddy, nginx, …): ```sh cd orbit python3 -m http.server 8080 # → http://localhost:8080 ``` > Must be served over **http(s)** — opening `index.html` via `file://` won't > work, because the game uses ES modules and `fetch`es its JSON config. ## Current state — v0.1 foundation - Main menu with a **New Game** button - Game screen with a basic top-down ship: **click anywhere to fly there** in infinite, unbounded space (borders/sectors come later) - Camera gently trails the ship; the **parallax starfield** streams past while it flies and the view slowly recenters (≈1.5 s) once the ship comes to rest - Config-driven setup: every tunable value lives in `data/*.json` ## Project layout ``` orbit/ ├── index.html # boots the game ├── data/ # ← ALL tunable config (edit these freely) │ ├── manifest.json # which config files exist │ ├── game.json # dimensions, colors, starfield, … │ ├── menu.json # menu text, colors, button layout │ └── ship.json # ship feel: thrust, drag, maxSpeed, … ├── lib/ # vendored third-party libs (Phaser 4.2.1) ├── js/ │ ├── main.js # entry point: load config → boot Phaser │ ├── config/ # Config singleton, ConfigLoader, game config │ ├── scenes/ # MenuScene, GameScene (thin, orchestration) │ ├── entities/ # Ship (own behavior) │ ├── ui/ # MenuButton (reusable) │ ├── visuals/ # Starfield (decorative) │ ├── utils/ # small helpers (Color) │ └── vendor/ # shim to the vendored Phaser └── docs/PROJECT_NOTES.md # ← project conventions: read this ``` ## Conventions (short version) - **Config in JSON.** If a value might change, it goes in `data/`, not code. Add a file = one line in `data/manifest.json`. - **One class per file**, ES modules, scenes stay thin, entities own their behavior. Details in [`docs/PROJECT_NOTES.md`](docs/PROJECT_NOTES.md). - Phaser is imported only via `js/vendor/phaser.js` (one-file version swap). ## Dev tools ```sh node dev/ship-behavior.test.mjs # runs the real Ship.update() loop in Node node dev/starfield.test.mjs # runs the real Starfield.create() in Node ``` `dev/test-game.html` boots straight into the GameScene (no menu click), handy for manual testing of the flight feel. ## Phaser Phaser 4.2.1 is vendored at `lib/phaser.min.js` (UMD build, MIT license — see `lib/PHASER_LICENSE.md`). No internet or npm needed at runtime.