170 lines
11 KiB
Markdown
170 lines
11 KiB
Markdown
# 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. *Done so far:* volume sliders, tips and
|
||
update settings in the pause menu; `Q` drops items; `K`/`M` put any bag row
|
||
on the 1-8 keys (0.3.0); the map on `N`, filling in as you explore, and a
|
||
compass along the top (0.4.0, Gitea issue #1).
|
||
- More places: the worldlets and the journey (`docs/WORLDLETS_DESIGN.md`).
|
||
*Done (0.4.0):* W0-W3 and J1, the Cove reached down the cliff tunnel
|
||
(single-player). *(0.5.0):* J3, the journey on a server: a server per
|
||
land, players in different lands at once, chat, the player list, admin
|
||
and sleep across lands. *(0.6.0, a playtest):* the Cove's own: the wreck,
|
||
a treasure dig for each player and its drowned crew, crabs, gulls, and a
|
||
rowing boat moored at the pier; Report a bug in the pause menu. Next J2,
|
||
then J4 (the Highlands by sail).
|
||
- Audio, music, weather. *Done (0.2.0-0.2.1):* mood music (calm, night,
|
||
storm, danger, boss) that crossfades with what's happening, ambience (CC0
|
||
birdsong, crickets, owls, fire), sound effects for every action (Kenney
|
||
CC0 plus synthesised), creature voices, Old Tam's spoken lines (Kokoro).
|
||
Sources and licences: `assets/audio/CREDITS.md`; tools in `tools/audio/`
|
||
and `tools/voice/`.
|
||
- Help: the player guide on the download site (`tools/site/`), written
|
||
sections plus item, recipe, creature, fish and server-setting tables made
|
||
from the game's own data each build. The trailer (`tools/trailer/`).
|
||
- 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 (`cinderwild/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<version>`) 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.
|