# Roadmap One milestone ≈ a chunk of working sessions. Each ends with something you can actually run and see. Timelines assume solo dev + heavy AI assistance, steady (not full-time) pace. ## M0 — World skeleton (single-player) · ~2–4 weeks **Goal:** walk around a lit, atmospheric terrain. Prove the look. - [x] Project scaffold, git repo, docs - [x] Godot installed, project opens - [x] First-person / third-person character controller (move, jump, mouse-look) - [x] One flat/heightmap terrain chunk with a material - [x] Atmospheric lighting: directional sun, sky, volumetric fog, tonemapping - [x] Place one low-poly tree + rock to set the mood - **Done when:** you load the game and walk around a Valheim-ish lit field. ### M0.5 — Scenery & world bounds (done) - [x] Mountain-rim boundary (steep cliffs + invisible wall + respawn safety net), covered by `tests/test_boundary.gd` - [x] Procedural terrain shader (grass/dirt/sand/rock strata/snow), lake + water shader - [x] 5 procedural tree types, faceted mossy rocks, cliff outcrops, bushes, logs, stumps - [x] Streamed wind-animated grass + flowers; cloud sky; swimming ## M1 — Survival loop (single-player) · ~3–5 weeks **Goal:** the core game verbs. Detailed plan in `docs/SURVIVAL_DESIGN.md` (phases M1a–M1d). - [x] Resource nodes: chop tree → wood, mine rock → stone *(M1a)* - [x] Inventory + simple hotbar UI, chests *(M1a)* - [x] Crafting (recipe: wood → tools / building pieces) *(M1a)* - [x] Pause menu, title screen, world slots, save/load, autosave *(M1a)* - [x] Health / stamina / hunger / warmth, day-night cycle, fire fuel, cooking, foraging, torches, death + grave *(M1b)* - [x] Weather (rain, storm, snow), wet/shelter *(M1c)* - [x] Snap-together building: floor/wall/door/roof/gable, resource cost, support + collapse, dismantling *(M1c)* - [x] Bed spawn point and sleeping, resource regrowth *(M1c)* - [x] Creatures (rabbit, deer, boar), hunting, club/spear/bow, butchering, cooked-food buffs, hide cloak *(M1d)* - [x] Wolves at night with a den and a 3-day grace period, wolf cloak *(M1e)* - [x] Fishing (rod, perch and trout, grilling) and a mixed diet *(M1e)* - [ ] Hide armour, more recipes, sea fishing *(later M1 polish)* - [x] Wild flax (fibre plants) *(polish)* - [x] Iron: nuggets, ore, clay, kiln, smelter, forge, iron tools and arrows, lantern, tool wear and repair *(P1)* - [x] Stone building: stonecutter, cut stone, stone floors, walls, pillars, stairs, windows, doorways, hearth; wooden stairs, windows, posts, palisade and gate *(P2)* - [x] The wolf moon and the alpha: breaks wooden doors, iron-banded doors hold, alpha pelt and cloak *(P3, part 1)* - [x] The bear: raids unattended food, palisades and closed huts keep it out, bear hide rug, bear fat *(P3, part 2)* - [x] Crows and foxes steal food left out; the barrow, its guards, the coffin and key pieces *(P3, part 3)* - [x] Hazards: food spoilage (rot speed setting), smoking rack and salt, food poisoning, harsher blizzards, hard winters, lightning on trees *(P4)* - [x] The standing stones and the Old Stag: a three-phase boss, its antler and trophy, the antler pickaxe *(P5)* - [ ] **Iron, stone building and new adversaries**: iron nuggets and ore, smelting and a forge, iron tools and durability, cut-stone building, an alpha wolf, a bear, a barrow with guards, spoilage and blizzards *(phases P1-P5, `docs/PROGRESSION_DESIGN.md`)* - [ ] **Tutorial world**: a guided first island that teaches gathering, crafting, chopping, food and the mixed diet, hunting, fishing, shelter and the night *(phases T1-T4, `docs/TUTORIAL_DESIGN.md`)* - **Done when:** gather → craft → build a tiny shelter, single-player. ## M2 — Multiplayer · ~2–4 months **Goal:** self-hosted, authoritative, 2–8 players. Detailed plan in `docs/MULTIPLAYER_PLAN.md` (hosting on UDP 24242 via Tailscale or port forwarding, player identity and names, server rules for co-op/PvP, and phases M2.0-M2.7). - [x] Server-authoritative online (single-player stays as it is, with no server) *(M2.4)* - [x] Headless dedicated server, joining, identity handshake, names, player list *(M2.1)* - [x] ENet transport, player bodies and name tags, local movement checked by the server, interpolation for others *(M2.2)* - [x] Replicate resource nodes, pickups, building, chests, fires, doors, clock *(M2.3)* - [x] Persistence: world save/load on the server *(M2.3)* - [x] Per-player inventory, stats, death, graves and saves on the server *(M2.4)* - [x] Animals, wolves, hunting, fishing and sleeping on the server *(M2.5)* - [x] Server rules (PvP, raiding, locks and friends, death penalty, difficulty, wolf grace), chat and admin commands, server console *(M2.6)* - [x] Host Game from the title screen, backups, launchd and systemd samples, hosting and Tailscale guide (`docs/HOSTING.md`) *(M2.7)* - **Done when:** a friend joins your self-hosted server and you build together. ## M3 — Addon SDK + sandbox · ~2–3 months **Goal:** the differentiator. Easy, safe mods. - [ ] Embed sandboxed Lua VM in the server - [ ] Capped API surface (events + safe world queries/commands) - [ ] Per-addon CPU/time + memory quotas - [ ] Addon manifest format (declare items/recipes/prefabs as data) - [ ] 2–3 example addons (a new craftable item; a "welcome" message on join; a custom spawn rule) - [ ] SDK docs for modders - **Done when:** a modder drops an addon folder in and it safely adds content, and a deliberately-malicious test addon is contained (can't read files, can't hang the server). ## M4 — Content & polish · ongoing - More biomes, creatures, items, building pieces - PvP / raiding rules, building damage - Better UI, settings, controls - Audio, music, weather - Packaged builds for Win/Mac/Linux (+ Mac signing/notarisation). *First cut done:* `tools/export.sh` makes a universal macOS .app (ad-hoc signed, not notarised) and a Windows x86_64 .exe + .pck (unsigned), zipped in build/. The same build runs a dedicated server (`--headless -- --server`). Still to do: notarising (Apple Developer account), Windows signing, the game icon on the .exe (rcedit), Linux, and the update check below. - **Updates**: the game (and a dedicated server) needs to notice when a new version is out, download what's needed and install it. See below. ### Updates (to design with the packaged builds) Needed because every network change bumps the protocol (12 as of P5), and an out-of-date game can't join an up-to-date server: today that means `git pull` and a restart on every machine. *Built so far (the check):* `scripts/core/updates.gd` asks the feed in Project Settings (`emberwild/updates/feed`, now the git server's `releases/latest` API; Gitea, Forgejo and GitHub answer alike) once at start-up. It reads the release's `version.json` asset (written by `tools/export.sh`: version, protocol, per-platform file, sha256 and size). The title screen shows the version bottom left and, when a newer one is out, a card with its notes and **Download** (this platform's zip, or the release page). A "Different game version" refusal now names the server's version and protocol and says whether you or the server needs updating; a dedicated server says in its log when it's behind (`check_updates` in server.json). Pause menu: **Check for updates at start**. Tests and bots never touch the network. Still to do: downloading, verifying and swapping it in (below). **To publish a release:** bump `config/version` in project.godot and the four version numbers in export_presets.cfg, run `NOTES="..." tools/export.sh`, and make a release on the git server (tag `v`) with the two zips and build/version.json attached. The repo (or at least its releases) must be readable without logging in. - **Knowing there's an update:** the game checks a small version file (version number, protocol, per-platform download URLs and checksums) at start-up and from the title screen. The server checks too. When joining a server with a newer protocol, the "different game version" refusal should offer to update instead of just saying so. - **Getting it:** download only what changed where possible (the game's `.pck` data separately from the engine binary, which rarely changes), to a staging folder, verified by checksum (and signature) before anything is replaced. - **Installing it:** swap in the new files on the next start (a tiny launcher or a restart-and-replace step), keep the previous version to roll back to if the new one fails to start. Mac: signed and notarised so Gatekeeper accepts it; Windows: signed. Worlds, profiles and server config live in user data, so they're never touched; saves stay readable by newer versions (they already load older saves). - **Servers:** a headless server can update itself at a quiet moment (nobody on, or after warning players), or an admin runs an update command; the launchd/systemd service files restart it. - **Where updates come from:** GitHub Releases is the simple start (the version file and builds attached to a release); itch.io's butler or Steam would handle it for us if the game ships there. - **Addons (M3)** will want the same: a version per addon and the server telling players which addons (and versions) it needs. ## Honest overall estimate A genuinely playable **self-hosted survival game with a working sandboxed addon SDK** is roughly **6–12 months** of steady solo work with AI help. The M0–M1 vertical slice (a few weeks) is what proves the concept and keeps you motivated.