Changelog - Beyond the Horizon
All notable changes to this project are documented here. The format follows Keep a Changelog; versions follow the milestone tags defined in specs/ROADMAP.md.
Workflow rule (see specs/00-architecture.md §13.1): every completed major step adds an entry here, places screenshots in docs/screenshots/, and lands as a conventional commit.
[0.43.1-alpha] - 2026-06-19
Added
- Free-build tool: structures and props can be built on top of dock tiles, treating a dock out on the water as if it were land - so you can raise huts and decorate piers off the shore.
[0.43.0-alpha] - 2026-06-19
Added
- Free-build tool: a configurable island size (8×8 to 16×16 tiles) via a picker in the tool; resizing rebuilds the island and keeps your build. The sand beach ring is now buildable too.
- Free-build tool: a "Docks (on water)" block category. Dock platforms can be placed out on the water around the island, so you can run piers and jetties off the shore.
Changed
- Popout panels can now be shrunk as well as grown by the lower-right grip - the panel (and the free-build 3D view inside it) resizes down to a compact window, with the palette and toolbars reflowing to fit. (Previously the grip could only enlarge the box.)
[0.42.13-alpha] - 2026-06-19
Changed
- Free-build attack simulator: the "Crumble" toggle now sheds the OUTER shell first. As the structure's hit points drain it knocks down the blocks farthest from the building's centre, so the outer layers collapse inward toward the core (previously it peeled from the top down).
[0.42.12-alpha] - 2026-06-18
Fixed
- Free-build tool: doors now sit flush against a structure face like sidings. The castle door and gate were rotated 90° (standing edge-on to the wall) because they face along a different axis than the panel sidings; each face-snapped piece is now laid flat by its own thin axis. The window (which was also edge-on) lies flat too. Doors additionally snap to siding pieces, not just structure blocks, sitting flush against them.
[0.42.11-alpha] - 2026-06-18
Added
- Popout panels (the free-build tool, Worker Time budget) can now be resized by dragging a grip in their lower-right corner. The box stays fully on-screen while resizing, and shrinks to fit if the game window itself gets smaller. The free-build island view reflows to the new size.
[0.42.10-alpha] - 2026-06-18
Fixed
- Free-build tool: sidings now clad the whole side of a structure block. Each siding (and the window) is stretched to span one cell wide and one course tall, and snaps flush to a structure face. Fixed a stacking bug where a siding would jump to the top of the block (leaving a gap below) on certain faces: sidings now ride a dedicated face lane and stack gap-free up a wall, and the oversized "Castle wall" / "Window" pieces are slimmed to proper cladding panels.
[0.42.9-alpha] - 2026-06-18
Added
- Free-build tool: a "Lights & Torches" palette category. A hand-built wall torch plus graveyard-kit lamp posts (single and double), a brazier and a glass lantern. Each light casts a warm yellow omni light that switches on with the night toggle and fades out over roughly six tiles, so a lamp-lit keep glows after dark. A toppled light goes dark when the attack simulator knocks it down.
[0.42.8-alpha] - 2026-06-17
Added
- Landing page: a "watch it built" video in the Free-build section - a scripted screen recording with an animated pointer that picks blocks from the palette and clicks them onto the island, raising a little flag-topped cottage piece by piece.
[0.42.7-alpha] - 2026-06-17
Changed
- Free-build crumble: knocked-off pieces now smoulder, fade and burn away to ash instead of piling up as rubble that sits forever.
- Free-build island is smaller (a tighter sandbox) so besieging ships circle it in open water at a distance; the siege fleet is now five ships.
Added
- Landing page: combat-sim videos - a "keep under siege" clip in the hero carousel, and a looping day-siege video embedded in the Free-build "attack simulator" panel.
[0.42.6-alpha] - 2026-06-17
Added
- Free-build Attack simulator: a button sends a ring of pirate ships to circle and bombard your build. The build's own cannon blocks fire back within a fortress level-1 cannon's range (14 tiles, one volley / 2 s); the structure has pooled hit points and collapses into rubble at zero. A Crumble toggle sheds pieces off one by one as the HP drains (instead of all at once). When the siege ends (toggle off, defenders win, or the keep falls) the demo resets to exactly the pre-battle build.
- Landing page: the Free-build section now showcases the attack simulator (a third "Will it hold against the pirates?" panel with a siege screenshot).
- Free-build day/night toggle - preview a build under warm daylight or a moonlit night (a soft warm fill keeps the night cosy).
- Free-build: castle wall segments (wall, half, narrow, corner) added as structure components, scaled to the 0.5 build grid.
Changed
- Free-build: shrank the oversized container props - crates, barrels, the bottle crate, the chest and the pirate flag now sit proportionate to a structure block (the survival barrel/boxes too, for consistency).
- Free-build: hedges repaint a dark lush green (the kit swatch read blueish).
[0.42.5-alpha] - 2026-06-17
Added
- Landing page: a Free-build spotlight section - kitbash buildings from the game's own kit of parts, then trade your creations with friends as compact share codes (with screenshots of the studio and the export/share dialog), plus a Free-build feature card and nav link.
Changed
- Free-build demo composite is now a little flag-topped keep - centred on the island and framed by the camera - used for the website capture.
- Landing page: the showcase screenshots (story + free-build rows) now pop out full-size in a lightbox on click - close with the ✕, a click on the backdrop, or Esc.
- Landing page: a Nights showcase ("When the lanterns come out") with two cosy after-dark screenshots, plus two new night clips in the hero carousel (a lantern-lit harbour, a town aglow) - showing off the warm night lights and day/night cycle.
[0.42.4-alpha] - 2026-06-17
Added
- Free-build tool on the main menu - a "Free-Build Tool" button on the title screen opens the kitbashing studio over the menu's living diorama (the menu tucks away while it's open, returns when you close it); no longer dev-console-only.
- Free-build clearer model name - the save/load name field is now labelled "Model name:" with a live "→ <name>.json" hint of the file it writes, and Save confirms "Saved as <file>".
Changed
- Free-build pauses its 3D island render while the panel is closed, so a hosting scene (e.g. the main menu, which runs its own diorama) isn't rendering two worlds at once.
[0.42.3-alpha] - 2026-06-17
Added
- Free-build Export / Import: copy a build out as shareable text, or paste one in. Three formats - Compressed (gzip+base64
bthz1:code, shortest for pasting online), Minified (compact JSON) and Raw JSON (readable). Import auto-detects the format; both fields are fully copy/paste-able.
Fixed
- Free-build: placing a block reset its transform to unit scale, so cannons (block scale 0.26) rendered at full size (~2 tiles). Placement now preserves each block's own scale; a cannon is one structure block.
Added (free-build tool, 0.42.1)
- Free-build tool (dev authoring, open with F or the
freebuildconsole command) - an in-game kitbashing sandbox for designing composite building models toward the 0.42 remodelling work. A sleek draggable popout with a thumbnail block palette (kit parts + colour variants), a shored 10×10 hex island you orbit like the main game, click-to-place with stacking on the kit's 0.5 grid, 45° rotation, face-flush siding/door snapping, cannon-on-roof/tower snapping, a ⌫ erase cursor, a live structure-cost calculator, and JSON save/load with a preview-thumbnail load list. - Sleeker game popout panels - a reusable bordered-box panel base (large title, hairline divider, ✕, draggable + clamped on-screen); the Worker Time panel re-skinned onto it.
[0.42.0-alpha] - unreleased
_The rebalancing arc._ Minor bumped to 0.42 to open a broad economy/balance overhaul - by convention, a big overhaul or refactor starts a fresh minor version. Rebalancing entries land here as they ship.
[0.41.27-alpha] - 2026-06-17
Changed
- Deeper, rounder palm fronds. The palm leaves now grade to a darker tropical green and carry a soft rim highlight, so the fronds catch the sun on their edges and read with volume instead of blending into one flat slab (palm-only; pines and temperate foliage are untouched).
Added
- "Worn-in roads" primer. The first time foot traffic packs a tile into a torch-lit stone road, a one-time callout explains the desire-path payoff - the worn road, the tiki torches, the speed boost, and the reassurance of a known route.
- "Known path" security buff. Walking a worn road now grants a worker a second reward alongside the speed boost: for the next in-game hour their security need is lifted by +40 - the comfort of a road they know. Persists across saves; stacks under the quest cheer floor.
Fixed
- Storyline dirt mounds never strand. A mound dropped by the storyline now always lands on a reachable surface-land tile - never on or under a building or resource, and never on a cut-off islet or across a cliff where no digger can walk to it (the placement snaps to the nearest tile the player's diggers can actually reach).
Tested
test_economy408 checks (+4 known-path),test_dig(+2 reachability),test_roads,test_storyline- all green, 0 failures.
[0.41.26-alpha] - 2026-06-17
Added
- Quest-completion cheer buff - finishing any storyline quest lifts entertainment and security across every player-owned house and worker for 12 in-game hours, with a new cheer badge floating over the buffed buildings and crew.
free:storyline action - a building's next single purchase is on the house, whether that's a fresh construction or a level-up (whichever the player reaches for first). Acceptsfree: well,free: [market, bank], orfree: { building: cottage, count: 2 }. Stacks with the built-in FREE_FIRST courtesy; gifts persist across saves. Documented indocs/storyline-scripting.md§3.- "On the House" quest (
storyline/04-on-the-house.yaml) - the worked example of thefree:action. It waits until the cove becomes a Hamlet, then teaches the founder's courtesies (claim the free first cottage / warehouse / guard tower / harbour), stands the player a free Market Stall, and finally a free upgrade of it - proving the gift covers a level-up too. - Build-menu gift indicator - a gifted card reads "✦ Free - on the house!" (distinct from FREE_FIRST's "your first one!"), and its storage-shortfall check is waived so it stays enabled even when broke.
- Two onboarding primers - Read your ledgers (introduces the Workers / Needs / Treasury popdowns and the Time panel once the cove has a few souls) and Sharing the work (explains the daily worker rotation the first time there are more posts than free hands - a genuine worker shortage).
free <id> [n]debug console command (and--free=<id>build-menu QA flag) - the console twin of the storylinefree:action.
Tested
test_economy404 checks, 0 failures -grant_free/is_story_free, a gifted build raising for free (no items spent), a gifted level-up viatry_upgrade, gift consumption, and the quest cheer buff (fun + security held to a floor, the cheer badge surfaces).test_storylinegreen - the new quest validates and loads (4 scripts).
[0.41.25-alpha] - 2026-06-16
Added
- Worker Time Budget panel (top-bar Time button / T key): a stacked-area chart of how the cove's workers actually spend their time - working, transporting, walking, seeking needs, resting, or idle - averaged over the last two in-game weeks, with a live legend (work_budget_panel.gd, worker_time_budget.gd).
- Clickable top-bar popdowns. Click the Workers, Needs or Treasury readout for a detail panel: the full workforce breakdown (working / idle / hauling / building); per-need average, highest and lowest - click an extreme to jump to that citizen; and the treasury's income & expense drill-down plus a balance-trend line (popdown_panel.gd, top_panel.gd).
Changed
- Workers rotate jobs daily. When an island has spare hands, each in-game day they staff the buildings that sat empty yesterday first (and production/resource buildings before defence), so the cove keeps making a little of everything instead of the same one or two yards running while others stand idle (economy.gd
_tick_daily_rotation).
[0.41.24-alpha] - 2026-06-16
Added
- A free leg-up on your first essentials. The first cottage, warehouse, guard tower, and harbour you build are free - a one-time boost per type (persisted in the save) so a fresh cove gets a home, storage, a guard, and a landing on the board without scraping for coin. The build menu marks them "✦ Free - your first one!" (economy.gd
FREE_FIRST/is_free_first, build_menu.gd).
Changed
- The harbour is an immigration gateway from level 1. It now carries crew bunks (housing 2 → 5 by level), so building a harbour makes room for newcomers to sail in right away - no upgrade required - helping the early storyline advance (building_catalog.gd).
[0.41.23-alpha] - 2026-06-16
Changed
- Readable main-menu text over the diorama. The title, the intro tagline, the New Game option labels, and the build/version footer all sit over the bright living-island backdrop, where the old light gold/parchment text washed out. They now use a dark fill with a soft cream halo (legible on bright water and darker isles alike) and are a touch larger. Menu buttons keep their dark wooden backing (main_menu.gd).
[0.41.22-alpha] - 2026-06-16
Changed
- Greener palm & temperate foliage. Palm fronds and the temperate broadleaf trees graded too yellow - most visibly in the web build, whose tonemap reads warmer than desktop - so their leaves are now pulled ~80% of the way to the deep conifer green. Trunks keep their warm brown; pine is unchanged (terrain_renderer.gd
_grade).
[0.41.21-alpha] - 2026-06-16
Changed
- Every tree is a new model now. Each climate grows its own authored tree set - palms on tropic isles, three mixed broadleaf trees across temperate coasts, and snowy-green pines in the cold - replacing the old placeholder kit trees. They run through a new Blender 5.x import pipeline (scaled to height, based on the ground,
+Yup, 512px embedded textures, no sidecars). Palm fronds were pulled back from yellow toward a natural green with a deeper trunk, and conifer foliage is pinned to a true forest green so it reads right against snow (world_generator.gd, terrain_renderer.gd, import-tree-model.sh). - A balanced day/night cycle. Day and night are now equal twelve-hour arcs with long, golden dawn and dusk twilights, and the midday sun is softer and a touch warmer - no more harsh white noon (day_night_cycle.gd).
[0.41.20-alpha] - 2026-06-16
Fixed
- Mounds of dirt only spawn on clear dry land. Dig-for-treasure mounds no longer appear in the water, at the waterline, below the surface, or on top of a tree, rock, or building. The runtime spawn snaps the requested spot to the closest tile that is genuinely clear and on the surface - above sea level, off the shoreline, sand/grass, and unoccupied; if no clear dry land is within reach, nothing is placed (never a sunken/buried mound). The occupancy check now counts a live tree or rock even while it's hidden by fog, and respects a building's whole footprint, not just its anchor tile (dig_system.gd).
Added
- Console
moundcommand - bury a diggable mound of dirt at the cursor (random treasure odds + amount) to exercise the dig-for-treasure loop. - Feature previews on the landing page. Feature branches can be built and linked from a "Feature previews" section so players can try a change before it merges to main, separate from the stable release (
tools/publish-preview.sh; see docs/PUBLISHING.md).
[0.41.19-alpha] - 2026-06-16
Added
- New voyages open on the open sea. A fresh game now spawns the dinghy out on open water with no land anywhere inside its visibility - the crew must take the tiller and sail before any shore breaks the mist. Best-effort ("always try"): the spawn searches outward from the home shore for the nearest sea tile clear of land within the dinghy's fog circle, and the opening camera frames the dinghy itself rather than the (still-fogged) home beach (vehicles.gd
_open_water_spawn, island_demo.gd). - "Land, ho!" - a getting-ashore primer. The first time land enters the dinghy's sight, the first-voyage storyline pops a one-shot primer teaching the [E] key: select your dinghy and press E to send the crew over the side to swim ashore. It holds until the heroes actually make landfall, then the tale carries on to the escort. Driven by two new once-ever world events -
land_sightedandcrew_ashore- that the engine fires off the dinghy's vision and the crew's footing (storyline/01-first-voyage.yaml, island_demo.gd_watch_getting_ashore). - Embarked heroes ferry themselves to a build site. When a building is awaiting construction but no worker characters exist yet, an embarked unique hero is now ferried on its own ship to the optimal landing coast, disembarks, and walks the last leg to build - reusing the worker-ferry crossing→disembark→build pipeline from its mid-point (no harbour required). Stands down the moment any worker exists (economy.gd
_try_start_hero_ferry).
Tests
_test_hero_ferry(economy suite, +10 checks → 378/0): a zero-worker site pulls an embarked unique across on its own vehicle, lands it, and joins it to the build crew; the fallback stands down once a worker exists.--ashoreqa: a headless end-to-end probe of the opening - surrounded-by-water spawn →land_sighted+ "Land, ho!" primer → disembark →crew_ashore→ storyline resumes.
[0.41.18-alpha] - 2026-06-16
Changed
- Combat now aims at the nearest point of a target, not its centre. Gunners (ship cannon and shore batteries) range, stand off, and aim at the point of a target's physical extent closest to them - so they fire from the hull/wall edge instead of having to close to point-blank (and ram the model). Ships and buildings expose a
combat_radius()(a building's is its horizontal structural extent - the floodlight beam, nameplate and ring are excluded so a tall keep doesn't shove ships out to sea); range/standoff/aim route through it (naval_combat.gd). Fixes pirate ships sailing into the Fortress to attack it.
Added
- Hostile ships besiege coastal buildings. With no enemy ship to fight, a pirate crew presses an attack on the nearest sea-reachable enemy building (a fort, a shore battery) within sight - standing off the walls and bombarding them, while the building's own cannon answer back.
- Stone shrugs off naval shot. Buildings take ~22% of a cannonball's damage (vs full damage to wooden hulls), so a fortress holds the line under bombardment instead of crumbling in seconds - coastal defences are meaningful, raids are a slow grind.
- The landing's "fortress holds the line" and battle hero clips were re-recorded with the new combat (no collisions; pirates shelling the walls from the sea).
[0.41.17-alpha] - 2026-06-15
Added
- New building - the Sea Fortress. The Fortress's seafaring cousin: a shore-placed harbour stronghold built from the castle kit - a lighthouse-keep and battlemented bastions on a stone mole, a 6-gun battery trained seaward, a timber gun-deck/pier with a moored boat (and a moored pirate warship at the top level). A lighthouse beacon sweeps the approaches (floodlight). Guns fire at +50% rate like the land Fortress; vision 18, range 16, security 80 within 42 tiles. Grandeur (heavier guns, banners, a second pier, the warship) piles on per level. New menu card rendered; suites green.
- A proper Downloads page + version archive. download/ is now a styled page (matching the site) listing every release with its size, a sized download button and a changelog summary. Older builds are kept in a public archive (
/game/dist/archive, surfaced into the served tree) so previous versions stay downloadable;publish.sharchives older binaries and regenerates the page on every release. The landing page links to it.
Changed
- Fortress banners now hang flush against their walls instead of slicing through them. The castle banner's cloth faces +X at yaw 0, so each banner is now yawed to its wall's outward normal (270=front, 90=back, 0=right, 180=left) and lies flat on the stone.
- The land Fortress fires 50% faster (volleys every 2.0s instead of 3.0s), via a new flat
fire_rate_multdef field (level-independent, unlikefire_rate_per_level).
Notes
- Cannon fire / splash / hit sounds were requested but are already fully wired - both ship and building (Fortress) cannons play
cannon_fireon launch,splashon a miss andcannon_hiton a hit (naval_combat.gd); all three.oggassets are present. No change needed.
[0.41.16-alpha] - 2026-06-15
Changed
- Fortress: a walled courtyard, cannons on the corners, banners by the book, and 30% more presence. Following on from the rebuild, the Fortress is now a proper 5×5 castle - a curtain of battlemented corner towers, side walls and a front gatehouse enclosing an open courtyard around a tall central keep. Per request:
- A cannon crowns each of the four corner towers (fire outward over their corner), up from a scattered three.
- Banners are placed by rule - over the gate door or just below a tower roof - each hung with its flat face laid along the wall it decorates.
- 30% larger build area on the same height. A new
footprint_xz_multdef field broadens the fitted footprint in XZ only (the silhouette/height is untouched); the Fortress sprawls 30% wider. Its sightlines and gun range grow 30% too (vision 12→16, cannon range 11→14, security reach 36→47). - Higher levels gain richer inner buildings. The courtyard fills in per level - a barracks blockhouse, storehouse and well at L1; a forge, market stall and inner watch-post at L2; a steepled great hall, a second stall and more storage at L3.
- Verified in the building viewer (L1-L3, top-down) and against the catalog/economy suite (368 checks green).
- A "now playing" toast announces each soundtrack change. When a new track starts, a toast names the song and credits the composer - e.g. ♪ Now playing - Harbour of Pockets, by Kristopher Traquair. Track filenames (lowercase,
_/-separated) are normalised back into proper titles (minor words like of/the/in kept lowercase mid-title). The current track is also announced as you enter the game.
[0.41.15-alpha] - 2026-06-15
Changed
- Rebuilt the Fortress from the Castle Kit. The old fortress stacked its towers with a 0.30-unit gap (the shared
_towersteps 1.31 though the base segment is only 1.01 tall) and used no walls - it read all wrong. The Fortress is now composed on the kit's 1-unit grid from tower + wall + gate + door pieces: a tall central keep in a walled courtyard, four battlemented corner towers mounting cannon, curtain walls and an arched gatehouse - with grandeur (banners, pennants, torches, lookout turrets) piling on per level (parts_by_levelis cumulative). Added_fort_tower, a correctly-flush square-tower stacker (base h1.01 + N mids h1.01 + a crown), so segments sit gapless. Verified in the building viewer (L1-L3) and in-game; all suites green.
[0.41.14-alpha] - 2026-06-15
Fixed
- Web build showed "tofu" boxes for many UI symbols (the primer/help close button
✕, the quest✔/❢, the⚓/⚑/⚠markers, the needs↑/↓arrows, etc.). The project uses Godot's built-in default font, which lacks those glyphs; on desktop the engine fills them from OS system fonts automatically, but the web export has no system fonts to fall back to, so they rendered as missing-glyph boxes in the browser. Added a bundled fallback font (DejaVu Sans) registered onThemeDB.fallback_fontat startup via a newUIFontsautoload (ui_fonts.gd) - this resolves all 11 affected symbol glyphs on web (and makes them render identically on desktop). The three emoji that no text font covers (🔊/🔈on the menu sound button,🔥on the burning-ship status) were swapped for a covered music note♪and plain coloured text respectively. Verified in a browser: the menu sound button shows♪ Enable Soundand the in-game close buttons show a proper✕, with no tofu. DejaVu Sans is bundled under its permissive licence (assets/fonts/DejaVuSans.LICENSE.txt). - The F1 Captain's Almanac left ghost text on screen. Switching tabs (e.g. to Buildings) parked the previous page under a plain
Node; aControlparented under a plainNodeattaches to the root canvas instead of the almanac'sCanvasLayer, so the parked page kept rendering - overlapping the active tab and persisting on screen even after the almanac (layer 75) was closed. The page stash is now a hiddenControl, so only the active tab draws. - The storyline primer overlapped the quest pop-up. The quest pop-up (which pauses the world while open) now rides its own high
CanvasLayer(72) so it is always front-most - above the HUD, the side menus and the primer callout. The primer callout now hides while a blocking menu is open over the world (a quest pop-up or the almanac, both modal; or the build menu), unless the primer points at that very menu. AddsTimePanel.is_modal_paused()/UiTargets.is_open().
Added
- A "Build (B)" button in the top bar. The build menu previously opened only via the unhinted
Bkey; it now has a visible top-bar button and is documented in the almanac (Handy keys + the "Building & upgrading" guide). Rewrote the landing-page hero copy to tell Oloaf & the Acorn's story.
Build & deploy
- Relocated the build/deploy tooling to the devbox VM. Everything now lives under
/game(the network volume).tools/_common.shcentralises the disk locations (all env-overridable): internal snapshotsBEYOND_VERSIONS=/game/beyond-versions, published webrootBEYOND_DIST=/game/dist/beyond.tools/snapshot-branch.shandtools/deploy-web.shwere updated accordingly;/x1/…paths were swept to/game/…across the specs/primers/README. - New
tools/publish.sh- one command builds and lays out the whole live site under/game/dist/beyond/(served athttps://devbox.berryarcade.net/beyond/): the in-browser web build (web/), the Linux desktop download (download/, versioned + a stable "latest"), and a rendered landing page (index.html+media/). Publishing is a local copy to the network volume - no more SSH/rsync toberryarcade.net. - Professional landing page at the site root (
tools/landing/index.html.tmpl, rendered with the version/commit/date baked in). Single self-contained file, zero external resources (inline SVG icons - no tofu-glyph risk), responsive, accessible. - Portable cross-origin isolation for the threaded web build:
tools/web/coi-serviceworker.jsis bundled and injected into the export soSharedArrayBufferworks on any static host, plus a belt-and-suspenders.htaccess. (The public host already sends COOP/COEP + thewasmMIME.) - Verified on the VM's GTX 1080: the web build boots to the menu in-browser with
crossOriginIsolated, hardware WebGL2 (ANGLE/NVIDIA), and no JS errors.
[0.41.13-alpha] - 2026-06-15
Fixed
- Web build was still silent (or played a few seconds then died) - the real cause was the browser
Sampleplayback path, now forced toStream. Godot 4.3+ defaults web audio toPLAYBACK_TYPE_SAMPLE(hands the buffer to the browser's Web Audio API instead of CPU-mixing it). OurAudioStreamPlayers never setplayback_type, so they inherited Sample, and long/looping streams hit the Sample-path regressions (godot#102911 freezes the wasm app on stop, #101111 breaks looping) - the soundtrack and ambient loops came out silent or stopped after ~5-10 s. The music and ambient players now setplayback_type = AudioServer.PLAYBACK_TYPE_STREAMso Godot mixes them itself (off the main thread on this threaded export); short one-shot SFX keep the low-latency Sample default. Harmless on desktop (Stream is already the default there). Verified by recording the browser tab's audio output to WAV: after the unlock gesture the soundtrack plays continuously at a steady ~-21 dB RMS / -6 dB peak with no drop-off (before this fix the recorded output was -91 dB silence or a brief burst then silence). This supersedes the v0.41.12 sync-load change as the actual fix; the sync web load is kept as well.
[0.41.12-alpha] - 2026-06-15
Fixed
- Web build had no music - the soundtrack's threaded load never completed in the browser.
_request_track()issuedResourceLoader.load_threaded_request()for each track, but in the web export the request sticks atTHREAD_LOAD_IN_PROGRESSforever, so_poll_music()never reaches_music.play()and the music bus stays silent (this is the actual cause behind "no sound in the browser" - SFX/ambient already use the synchronousload()path and were unaffected). On the web the soundtrack now loads synchronously (load(path)straight into_play_track(); the OGG files are small and read from the in-memory pack); desktop keeps the async threaded path to avoid a load hitch. Verified in-browser (headful Chromium + a real audio sink): the track loads,AudioStreamPlayer.playing == true, and the tab produces an active audio output stream - and with no AudioWorklet errors once a real audio device is present.
[0.41.11-alpha] - 2026-06-15
Fixed
- Web build hung at "Charting islands…" and had no sound - switched to a THREADED export. The game runs worldgen, resource loads (
load_threaded_request) and the AudioWorklet on real threads; the single-threaded (nothreads) web build couldn't, so new-game generation deadlocked and audio never started. The live host already serves the cross-origin-isolation headers (Cross-Origin-Opener-Policy: same-origin+Cross-Origin-Embedder-Policy: require-corp), soSharedArrayBufferis available - flipped the Web preset tovariant/thread_support=true. The web build now threads like the desktop build: worldgen completes and (after the Enable-Sound gesture) the soundtrack plays. Requires a cross-origin-isolated host (the deploy target is one).
[0.41.10-alpha] - 2026-06-15
Fixed
- Web audio (browser autoplay policy). Browsers block all sound until a user gesture, and the soundtrack was started on load (into a suspended audio context), so the web build was silent. Audio is now deferred on the web until the first gesture: the main menu shows an "🔊 Enable Sound" button (and any first interaction also unlocks it, so heading straight to New Game works too), which starts the soundtrack and lets the browser resume the context. Desktop is unchanged (audio plays on launch).
GameAudio.unlock()/is_web_locked();OS.has_feature("web")-gated.
[0.41.9-alpha] - 2026-06-15
Added
- Web (HTML5 / WASM) build target. A
Webexport preset (single-threaded -variant/thread_support=false- so it loads from any plain static host with no COOP/COEP headers) plus a web-only Compatibility-renderer override (rendering_method.web="gl_compatibility"; desktop stays Forward+, since browsers have no Vulkan). Exported to/game/beyond-versions/feat/web/(index.html+.js/.wasm/.pck); the 19 MB pack carries every asset (1528 GLB refs, 960 textures, the storyline YAMLs, icons, bakedbuild_info.json). Build command:godot --headless --path game --export-release "Web" <out>/index.html(run--importfirst). One-shot build + deploy viatools/deploy-web.sh, which exports and rsyncs toroot@berryarcade.net:/var/www/berryarcade/beyond/web/- live at https://berryarcade.net/beyond/web/. Verified end-to-end in Chromium: the engine boots, WebGL2/Compatibility initialises, all assets load, and the main menu renders over the biome diorama.
[0.41.8-alpha] - 2026-06-15
Added
- The Captain's Almanac - a full in-game help page (F1). A cozy, full-screen documentation overlay opened by F1, a book button on the top bar, or the pause menu (Esc closes it; the world pauses while you read). Four tabs:
- Guide - a walkthrough of the mechanics (needs & happiness, building & upgrading, production chains, treasure, money & tiers, handy keys) with little flowcharts of the gameplay loop and sample production chains.
- Glossary - the terms a new captain meets (tier, staffing, hauling, auras, well-rested, fog of war, treasury, …).
- Buildings - every building, grouped by category, each with a rendered thumbnail and a per-level stat table (cost, HP, workers, housing, storage, cannons/range/accuracy, auras, sight) plus its recipe.
- Units - every vessel and creature, grouped into fleets, with a thumbnail, stats, and the warship leveling chain.
Preview thumbnails are pre-baked (tools/building_viewer --thumbs and the new tools/ship_viewer --thumbs) into res://assets/help/. New HelpPage (CanvasLayer, layer 75) + a top-bar book button + a pause-menu entry; a headless test_help suite checks every tab builds and every building/unit has a thumbnail.
[0.41.7-alpha] - 2026-06-15
Added
- Production buildings show a floating input→output icon row. Every building that runs a recipe now carries a gently bobbing row of item icons above it - the inputs it needs, a flow arrow, then the outputs it makes (gatherers, with no item inputs, show just their output). An input icon glows red while the building is short of it, and a sustained shortage is logged (a toast fires once the building has waited ~3 in-game hours for an item, and again if it runs out later). To make room, a production building's nameplate and buff/debuff badge are lifted so the icon row sits clearly underneath, above the model.
[0.41.6-alpha] - 2026-06-15
Added
- Treasure-hunting primer (
buried_treasurestoryline). The first tent your cove finishes raises a new one-shotfirst_tentworld event; the storyline answers it by burying a mound of dirt near the cove with a guaranteed chest of 3 gold inside, then showing a primer that teaches digging (right-click a hero onto a mound). Reinforces the dig-for-treasure mechanic right when the cove takes root. New scripting support:spawn_mound:gained agold:/treasure:key that buries a certain chest of that worth in each mound (its dig always turns one up, overriding the random chance);DigSystem.spawn_mound(tile, value)tags the mound and_finish_dighonours it (a respawned mound reverts to an ordinary one).StorylineSystem.fire_event(key)raises a silent once-ever world event (no engine callout) so the storyline owns the primer. Seeres://storyline/03-buried-treasure.yamlanddocs/storyline-scripting.md.
[0.41.5-alpha] - 2026-06-15
Fixed
- The main-menu version footer was stuck at
v0.15.0-alpha.project.godot'sconfig/versionhadn't been bumped since v0.15 (the audio engine), and the footer reads it verbatim, so every build since showed the wrong version. Bumped it to the current version and, so it can never drift again, the version is now single-sourced fromdocs/CHANGELOG.md:tools/snapshot-branch.shreads the changelog's top entry, bakes it into the exportedbuild_info.json, and syncs the pack'sconfig/versionto match;BuildInfoprefers that baked version (source/dev runs still useconfig/version). The snapshot/export pipeline was otherwise working correctly - it writes to/game/beyond-versions/<branch>/beyond-the-horizon.x86_64as intended.
[0.41.4-alpha] - 2026-06-15
Added
- Building status effects in the info box. A building's buffs and debuffs now appear in its selection info box as labelled status effects - each with its icon, a coloured title (amber for a debuff, green for a buff) and a one-line description. Two are wired up so far: Inadequate security (a home not covered by a manned guard tower/fortress - happiness suffers) and Well-rested crew (workers who rested in a fine home work faster here, showing the live percentage). The floating badge over a building now reflects whichever effect is active (it is no longer homes-only), and
Building.status_effects()is the single source both the badge and the info box read from.
[0.41.3-alpha] - 2026-06-15
Changed
- Building nameplates sit a touch higher (model top + 0.60), and the security debuff badge now tucks right under the nameplate (model top + 0.42) - clearly below the plate while still clear of the building roof.
[0.41.2-alpha] - 2026-06-15
Added
- The map-overlay box can be closed from the UI - a ✕ button in its header hides it, and the O key still toggles it. When closed, a small "Overlays (O)" pill stays in the corner to reopen it by mouse (active heat layers keep running).
[0.41.1-alpha] - 2026-06-15
Fixed
- Building nameplates and the security debuff badge no longer float far above buildings.
Building._nameplate_top()measured_merged_aabb(self), which includes the attached lights (lanterns/glows/floodlight -VisualInstance3Ds whose ranges balloon the box), so on any recompose (upgrade/restore/construction) the plate drifted 3-6× too high with a big empty gap. It now measures the visible model PARTS only, so the nameplate and badge sit just above the structure. Also set_plate_yon first placement (the initial_composeran before the plate existed, leaving it at a stale default).
[0.41.0-alpha] - 2026-06-15
Added
- Map overlay toggles (
MapOverlays) - a cozy top-right panel (under the top bar, open/closed with theOkey) switches on semi-translucent heat layers over the map: Security (defense-building coverage, a gradient that fades toward each tower's edge), Fun (venue coverage for nearby houses), and Firing range (the area every friendly armed building AND vehicle can shoot). Each is a MultiMesh of flat hex cells, rebuilt on a throttle so it tracks new buildings, upgrades and moving ships. - Inadequate-security debuff badge - a home whose security need is unmet floats a small shield-down badge above it (cosmetic; no gameplay effect), toggled by the economy. The badge is text-sized and hugs just above the building's visible model (like a torch).
Changed
- Guard-tower security now peters out with distance - full output at the tower base, falling linearly to 65% at the edge of its radius (
SECURITY_EDGE). The guard tower's base radius grew +30% (18 → 23 tiles).
[0.40.0-alpha] - 2026-06-15
Changed
- The Well is now a big rum barrel - a chunky wooden barrel topped with a blue water puddle, wooden mugs on the rim, and an oversize, colourfully-fringed cocktail umbrella standing in the drink (the cove's laws of physics, napping again). Built from a kit barrel + primitives.
- The Frosted Chips Orchard is fenced - the teal hedgerows are gone, replaced by a cozy wooden picket fence all the way around with a front gate, framing the chip bushes, flower beds and night-glowing frost blooms.
- Citizen security is now a DWELLING need (spec 13 §R.3a). A citizen's
secfulfilment is set by the type of home it belongs to, met by the defense aura covering that home: tent needs 0 at Camp/Hamlet/Town and 40 above; cottage 45; house 65 (half-met at 40); manor 80 (half-met at 50). Defense auras now stack (sum, capped 100) like fun auras, so steep needs are reachable by overlapping towers; an unguarded fine home leaves its folk "uneasy". - "Frosted Berries" → "Frosted Chips" (display rename; the item id is unchanged) and the orchard's frost-kissed blooms now sparkle faintly at night (a new
glowpart flag driven by NightLights).
Added
- The well-rested buff (spec 13 §R.3b). A worker who rests in a fine home walks AND works faster for a full in-game day after - cottage +15%, house +30%, manor +45% (a tent gives none). Non-stacking, expiry-accurate (effect ends with its icon), persisted across saves; a building's production pace scales by its crew's average buff; a "well-rested" skill icon shows on the worker's nameplate.
Fixed
- The main-menu diorama now reveals reliably - the loading cover is drained to its scrim each frame from
_processonce the island is built, instead of a fire-and-forget tween that could leave the menu a flat brown.
[0.39.0-alpha] - 2026-06-15
Added
- A living main-menu backdrop (
MenuDiorama, spec 03). A small non-playable 32×32 island drifts behind the menu, built from the real renderers and unit components: a little settlement (harbour, homes, lighthouse, warehouse, market, well), Oloaf + The Acorn and worker citizens strolling the land, and a few ships sailing autonomously around the isle, under a slow orbiting camera. One scene per biome, cycled each launch (Tropic → Temperate → Cold → Desert, persisted touser://menu_state.cfg). A cover fades to a soft scrim once the island is up so the title stays legible; a failed build just leaves the plain backdrop.
Changed
- The game's tagline is now "A cozy pirate paradise city builder where even the laws of physics take a nap under a palm tree now and then."
[0.38.0-alpha] - 2026-06-15
Added
- Stockpile targets for storage buildings. Warehouses and harbours can now set a per-item target in their inventory matrix (a small field beside each item's accept/reject toggle): a number makes the store actively haul that item in and caps what it keeps at that count; blank leaves it as passive surplus storage. Banks gain the matrix too - a single currency row with a vault limit set in gold (blank fills to the vault's full capacity). New
BuildingStorage.stockpile(persisted) +stockpile_limit/set_stockpile/ stockpile_room; the economy's_want/_scan_jobs/surplus sweep all respect it.
[0.37.0-alpha] - 2026-06-15
Changed
- A level-1 harbour now costs just 5 wood (a cheap first landing) and doubles as a small dockside treasury - its coins count toward the city treasury, capped at 50 silver at level 1, scaling to 2 gold at the largest harbour (new
BuildingDef.treasury_cap; a treasury that's also a store keeps stocking goods too).
Added
- Onboarding primers that get the player growing their first settlement: how to attract settlers (build homes + keep folk happy), a nudge when the homes are full, and one when morale is too low for newcomers to arrive.
[0.36.0-alpha] - 2026-06-15
Added
- Unit/building nameplates now have a semi-opaque backing board behind the text (auto-sized to wrap the name/faction/HP/stats) so titles read clearly against any scenery.
- A dev-console
heroescommand respawns any missing unique characters (Oloaf, The Acorn) at the spawn beach - a recovery tool.
[0.35.0-alpha] - 2026-06-15
Changed
- A defensive tower's floodlight now emanates from its cannon (the searchlight rides the gun) instead of the top-centre of the model.
- Oloaf stands level on the ground - the rolled-loaf model is lifted so it no longer clips through the terrain (a general grounding fix for any below-origin model).
Added
- Oloaf is the cove's captain: he wears a black-and-gold pirate tricorn and carries a small toucan on his shoulder (both built from primitives, as no such kit assets exist).
[0.34.0-alpha] - 2026-06-15
Changed
- UI boxes wear a thinner (~2/3), darker, muted-bronze border with proper inner padding so the frame never overlaps the text (the title stays bright).
- Defensive floodlights now glow RED and show the whole cone as a translucent, mist-like red shaft (a faint additive cone volume), not just a pool of light where it lands.
- Every building light is now the small guard-tower torch (a dark handle + flame bowl) - doors, corners, the lighthouse, and battlements share one torch.
- Markets sell only finished goods and fine foods - never raw or construction materials - and keep a sell log (what they've traded + the takings), shown in the market's info box.
- Neutral merchant vessels inbound to a player harbour are visible through fog and lift the fog around them (they add to the player's visibility en route).
[0.33.0-alpha] - 2026-06-15
Added - import / export office
- A new harbour side building, the Import / Export Office, buildable only beside a harbour (new
BuildingDef.adjacent_toplacement rule). Select it to buy from a dynamic catalogue of common and rare goods at dynamic prices (paid from the treasury). - Purchases are delivered by a neutral merchant ship that calls at most once every 2 in-game days, sails the goods into the adjacent harbour's stores - and can be sunk by pirates, losing its cargo (the coins are still spent).
- A first-delivery primer points out where imports land.
[0.32.0-alpha] - 2026-06-15
Changed - workers cross water via the harbour ferry
- A worker that must reach a place only by sea now uses the harbour ferry for ANY crossing (not just construction sites) - staffing a sea-cut post pulls a worker across too. The ferry is gated on a harbour within 75 tiles of the worker (
HARBOUR_FERRY_RANGE); with no harbour in reach, the crossing is refused (the harbour-ferry law). A ferried worker is set ashore on the destination's island and the normal job logic claims it.
[0.31.0-alpha] - 2026-06-15
Fixed
- Citizens no longer vanish when their ship is sunk. A boarded character was a child of the vehicle, so a pirate sinking it freed the riders too (the "disappearing hero" bug). Riders now leap clear when their ship goes down - reparenting back into the world and swimming for shore - and a castaway with no land within reach now heads for the spawn beach instead of treading water forever. Heroes truly cannot be lost.
- Building nameplates (guard tower, fortress, …) sat too high - the height was taken from the full model AABB, which a tall flag pennant inflated. It now uses the building's major mass (thin props like flags/cannons excluded).
Changed
- Friendly nameplate titles are navy blue with a white border (was green).
[0.30.1-alpha] - 2026-06-15
Fixed
- Hardening from an adversarial review: the static
StorylineSystem.prime_onceentries now guard withis_instance_valid(I)(no use-after-free if the handle ever dangles);PirateUIbrass-bevel math floors the divisor (no div-by-zero if the frame width is ever set to 1); the info-box rebuild null-checks its title label before writing it.
[0.30.0-alpha] - 2026-06-15
Changed - cozy pirate UI skin
- The major menu boxes now wear a professional 3D cozy-pirate skin: a new
PirateUIhelper builds a procedural wooden 9-patch panel with a beveled brass frame + corner rivets, and titles render as a wooden plaque with embossed brass letters (bright fill, dark outline, soft drop shadow). Applied to the selection info box, build menu, inventory, settings, pause menu, the storyline primer callout, and the selected-units panel. - The unit info box (lower-left) leads with the selection's name on its brass title plaque.
- The build menu is fixed to the left edge; while it's open, the overlapping corner panels (the info box and the hero roster) slide to its right instead of hiding behind it, and snap back when it closes.
[0.29.0-alpha] - 2026-06-15
Added - first-time event primers
- The game now shows a one-shot tutorial primer the first time each milestone happens, pointing at what's going on: a worker stocking a warehouse/harbour, a harbour ferrying goods or ferrying a worker across the sea, a unit boarding/leaving each vehicle type (once per type), supplies running low (food/water/happiness), the city reaching a new tier, and a new settler arriving. Each fires once ever and the seen-set is saved (never repeats on reload).
- These reuse the storyline primer system, and stories can react to the same moments with a new
when: eventtrigger (name: first_tier_up, …). Engine systems raise them via null-safeStorylineSystem.prime_once/prime_once_at.
[0.28.3-alpha] - 2026-06-15
Changed
- The warehouse/harbour matrix is a touch wider, with a small margin on either side of the scrollbar (a
MarginContainerinside the scroll) so the columns and scrollbar aren't flush against the panel edges.
[0.28.2-alpha] - 2026-06-15
Changed
- The warehouse/harbour inventory matrix now lays out three item cells per row (a 3-column grid instead of one item per line), so the whole roster fits in far less vertical space. Long item names ellipsize with a full-name tooltip.
[0.28.1-alpha] - 2026-06-15
Changed
- The warehouse/harbour inventory-matrix icons are much smaller - they now follow the row text height (a touch larger), capped at 2vw, instead of ballooning to the texture's native resolution (
TextureRect.EXPAND_IGNORE_SIZE).
[0.28.0-alpha] - 2026-06-15
Added - targeting floodlights
- Guard towers and fortresses now mount a swivelling floodlight. A cool searchlight cone, dark until an enemy ship enters the tower's visibility range, that swivels fast to acquire then hones in slowly to follow its mark for as long as it stays in sight.
- While the cone is locked on a target, friendly fire against it lands +15% - tower cannons and ship volleys alike (
NavalCombatfloodlit registry, applied incompute_hit_chanceand_tick_cannons).
Changed - guard-tower cannon on a plinth
- The guard tower's cannon now sits on a small central plinth so it rides above the parapet and swivels a full circle without clipping the battlement wall.
[0.27.0-alpha] - 2026-06-15
Changed - citizens drink by resting at home
- Water is now replenished by resting at home. When a free citizen's water need drops to 60 it walks to the nearest home (with water in its pantry) it can reach, parks there in a new RESTING state, and sips the home's water (+50 a cup) until refreshed (95), then clocks back in.
- Builders, haulers and ferriers finish their task first; a staffed citizen clocks off its post for the water break, and a resting citizen is held off the work rosters until it's done.
- Water is no longer foraged on the spot from any nearby storage - homes are where the cove slakes its thirst (food is still eaten on the spot). With no watered home in reach a citizen simply stays parched (needs never kill - the Cozy Guarantee).
[0.26.1-alpha] - 2026-06-15
Changed
- The guard tower's cannon and flag now sit on the battlement floor instead of floating above it, and the tower lights itself with a torch on the battlement (a
torch-flagged part, lit at night) rather than the generic corner lantern - so the flame rests on the geometry, not at an AABB corner. - The guard tower gained a doorway set into its base (a dark recess flush with the wall).
- The single-building model viewer (
tools/building_viewer.gd) now frames by the model's full height, so tall slim buildings are no longer cropped.
[0.26.0-alpha] - 2026-06-15
Changed
- The top inventory bar always shows the construction staples - wood, planks, stone, clay, brick - even at zero stock.
- The guard tower is reshaped: a slim, round, tapering stone watchtower (base widest → narrowest top), ~40% slimmer footprint while keeping almost the same height. New per-building
fill_multslims a model within its plot. - Building lanterns are now torch-like flames - a small dark sconce topped by a warm-yellow flame that glows at night (no more lantern model).
[0.25.1-alpha] - 2026-06-15
Changed
- The warehouse/harbour item matrix is denser: one item per row with a much smaller icon, the item name, and the count (≈8 rows visible, scroll for more).
- Escape now clears any selection (a selected building deselects) before it opens the pause menu.
[0.25.0-alpha] - 2026-06-15
Added - friendly ship repair at ports
- Damaged friendly ships now mend while docked at a player navy shipyard or harbour, at 50% of max HP per in-game day.
- A ship below 25% HP and within 100 tiles of a port limps there when idle to be repaired.
Changed - guard towers scale with level
- Higher-level guard towers see farther (vision 12 / 16 / 20), shoot farther (9 / 12 / 15 tiles) and fire faster (a volley every 3.0 / 2.1 / 1.2 s), but cost more to upgrade (steeper than the default tier scaling).
[0.24.0-alpha] - 2026-06-15
Added - harbour storage hub + inter-harbour ferry
- Harbours now hold cargo like a warehouse (same 120/180/270/405 caps) and count as stores for hauling.
- Sea cargo now pools harbour-to-harbour: a need across water routes to the destination's local harbour (hub) when there is one - its transport dingies carry the goods, and a toast announces each shipment.
Added - placement preview shows the gather range
- Placing a resource gatherer (woodcutter, quarry, mine, fiber shed, dye maker) now gold-glows the matching resource objects within its gather range, and the spot is not buildable when no matching resource is in range ("no … in range").
Added - warehouse/harbour item matrix (accept / reject)
- The warehouse and harbour info box shows a matrix of every item with the count held and an accept/reject checkbox each. A rejected item is never deposited or hauled there. The reject set persists in saves.
Changed
- Guard tower (6→18) and fortress (12→36) security radius tripled.
[0.23.0-alpha] - 2026-06-15
Added - harbour transport dingies + off-shoot piers
- The harbour pier is larger and grows perpendicular off-shoot fingers - one at the lower levels, a second from L3 (a busier marina) - instead of decorative rowboats baked into the model.
- The merchant rowboats are now real player-owned ships, the
transport_dingy(an unarmed cargo boat). A harbour fits one out per staffed worker (busier harbour → more dingies), each moored at its own water tile by the pier. - The worker ferry (e.g. crews sent to cut-off build sites across water) now prefers the harbour's transport dingies over other friendly ships.
- Goods by sea. A building that needs an item only available across water (no land haul) now gets a dingy cargo run: a free transport dingy sails to the source coast, loads the goods, crosses, and unloads at the destination coast. Land hauls now skip sea-cut sources (they were silently stalling).
[0.22.0-alpha] - 2026-06-15
Changed - build menu UX
- Opening the build menu now drops the bottom-left selection info box behind it (it returns to the front on close).
- Selecting a unit (ship or character) or pressing Escape now closes the build menu. (
UnitSelection.unit_selectedsignal;BuildMenu.open/close.)
Changed - harbour: four levels + a proper pier
- The harbour now has four levels: an immediately-available "landing" (city tier 0), then three that act like the old levels 1-3 (max level 4).
- The pier is a long plank deck on pilings - 2 wide × 4 long (well past the 3-long × 2-wide minimum) - and the harbour grows busier each level, mooring more merchant rowboats (and gaining its dock shed, cargo and beacon flag).
[0.21.0-alpha] - 2026-06-14
Changed - lighthouse redesign + rotating beam
- The lighthouse now reads as a classic round red-white lighthouse: a slimmer banded tower (code-built cylinder bands), a glowing lantern room under a red dome, and a little keeper's house at the base.
- A rotating warm-orange beam sweeps from the lantern room - a single narrow cone, angled 30° below horizontal, turning around the tower top as its origin. It lights any ship (and the sea) the cone falls on, for as long as it shines on them. (
Building._attach_beacon_beam, spun in_process.) - NOTE: the build-menu thumbnail (
assets/ui/buildings/lighthouse.png) is stale - regenerate withbuilding_viewer --thumbs=<dir>on a GPU machine.
[0.20.0-alpha] - 2026-06-14
Added - ship mast lanterns (a beacon in the fog)
- Every ship now carries a warm lantern on its mast. The lantern is a separate beacon (parented to the fleet, not the hull) so fog can't hide it: a building or unit spots the lantern at twice its own vision range - you see there's a ship there long before you can tell friend from foe. The hull, nameplate and selection still obey normal fog: the ship can't be selected until it's actually visible. New
FogOfWar.is_seen_within;Vehicle.lantern_anchor.
Changed - lighting placement
- Road tiki torches now sit on the side of the path tile (off the walked centre), offset perpendicular to the road's run so a straight stretch lines its torches up evenly along one side.
- Building lanterns: housing buildings now carry one too (at the door), alongside the defensive line and the lighthouse (one lantern at a corner of the building's tallest visible major component). Every other building type carries none. Each lantern is mounted at a uniform height (0.4), and glows slightly brighter for low-visibility buildings (their radius - 80% of vision - is smaller).
Changed - road revert hysteresis
- Roads now pave and revert on separate thresholds: a tile still hardens once crossings exceed
visit_threshold(4), but only reverts once they fall to the newrevert_threshold(2) or below - between the two it holds. Roads are stickier and stop flickering.revert_thresholdis tunable indifficulty.yamlunderroads:.
Added - cozy night lighting (road torches + building lanterns)
- Roadside tiki torches. Well-paved road tiles grow a little worker-height tiki torch (built in code: bamboo pole + bowl + flame), dotted along the path (spaced so no two are adjacent, capped for perf). Its flame lights a warm yellow-orange glow at night and goes dark by day; it is pulled up if the road fades back to grass.
- Building lanterns. Every live building hangs one or more cozy lanterns (
fantasy/lantern.glb) on its sidings, each casting a warm yellow glow whose light radius is 80% of the building's vision range (so it grows with upgrades). Previews/thumbnails get none. - NightLights driver. A single throttled node fades every flame (torches + lanterns) in at night / out by day from
DayNightCycle.day_amount, with a gentle per-flame flicker - hundreds of mood lights for one sweep, shadows off. - New
NightLightscomponent +test_lighting(17 checks).
[0.19.0-alpha] - 2026-06-14
Added - emergent roads (desire paths)
- Land tiles now count how many times a worker has crossed them in the last 12 in-game hours; cross a tile more than
visit_thresholdtimes (default 4) and it gradually hardens into a stone road that speeds all units across it. Drop below the threshold and it reverts to its original surface - three times more slowly than it paved. LandNavroutes by travel time (tile weight = 1/speed), so the fastest course bends onto the stone and heavy transport corridors pave themselves into roads, which then attract still more traffic. A translucent stone-hex overlay fades in with the wear. NewRoadSystemcomponent +test_roads(18 checks).- Tunable from
difficulty.yamlunderroads:- visit threshold, window, pave time, and stone speed. Dev consoleroads [wear]/--roadseedseed a demo road for tuning. Seedocs/roads-desire-paths.md.
[0.18.0-alpha] - 2026-06-14
Added - difficulty.yaml tuning preload (QA)
- A single
difficulty.yaml(shippedres://, plus an optionaluser://override deep-merged on top) is read at boot and applied over the catalogs, so QA can fine-tune mechanics without code. Grouped by component, each value keyed by its entity slug (seedocs/difficulty-config.md): production_cycles- global cycle multiplier, per-level speed-up, refined/high-refinement multipliers, and the base cycle of every production building.item_costs- market value (copper) of every item.unit_stats- hit points / damage / cannons of every vehicle.building_costs- build + per-level upgrade material & coin costs.building_tiers- city tier to build, and to reach each upgrade level (the upgrade tier is now an explicit, overridableupgrade_tiersinstead of a hard-codedmin_tier + levelformula).- The shipped file is generated from the live defaults (
Difficulty.default_yaml), so it always lists the real current values. NewDifficultyclass +test_difficulty.
[0.17.0-alpha] - 2026-06-14
Changed - longer, refinement-scaled production cycles
- A production recipe yields its output once per cycle (game-minutes), advanced by
Δ × game-speed × worker-countand shortened ~20 %/36 % at building level 2/3 (cycle_at). - Cycles are now 4× longer overall (
BuildingDef.PRODUCTION_CYCLE_MULT, a single tuning knob) so production isn't too fast. - On top of that, the cycle scales with how refined the product is: raw gathering ×1, a refined good/food (made from raw) ×2, high refinement (made from an already-refined item) ×4 - deeper conversions take proportionally longer (
EconomyItems.refinement/cycle_factor, applied inBuilding._tick_recipes).
Changed - buildings 2× larger
- Building models now render at 2× their fitted size (
Building.MODEL_SCALE) so they read at the same scale as ships, characters and resource objects. They overflow their plots - a deliberate demo of the new proportion.
Added - UI size setting + build-menu category headers
- UI size slider in Settings → Video (70 %-160 %): scales every font, box and icon via the root window's
content_scale_factorfor legibility; the 3D view is unaffected. Persisted; live-applied. - The build menu category sections are now distinct icon-led header bars (a tinted, gold-bordered bar with the category's icon - house / windmill / cart / town / church / tower / gazebo from the Avatar Icons Megapack - plus a count), so the player can scan to a category at a glance.
Changed - inventory & HUD overhaul (icons everywhere)
- The top bar and inventory now use icons (sourced from
/gamedata/icons): one PNG per economy item plus HUD icons for workers, the reserve pool, housing and the four needs. A centralIconsregistry caches them;EconomyItemsgained per-item categories (raw / construction / goods / food / misc) andicon_path. - Worker count split into two figures: worker slots (filled / total production slots, tools icon - red when understaffed) and the reserve pool (idle / reserved workers, watch icon) beside its slider.
- Housing now shows the surplus (green
+Nspare beds) or shortage (red-N) plus the population, instead of a bare pop/cap. - Needs show all four sub-categories - food, water, fun, security - each with its icon and a 0-100 value (green/amber/red), and a drill-down tooltip that itemises each need with a trend arrow (↑/↓/→).
- The inventory quick view splits into the five categories (icon chips per item, divided by category).
- New Inventory & Logistics panel (click the quick view or press I): every item summed with icon, count and worth, grouped by category, with category filter buttons and a per-warehouse drill-down toggle.
[0.16.0-alpha] - 2026-06-14
Fixed - mound material + ferry course
- The mound of dirt (pirate
hole) no longer reads as an untextured flat brown blob - it wears the same world-space procedural sand surface as the beach sand patches (matchingpatch-sand's colour space). - Worker ferries now plot the course that gets the worker to the build site at the earliest time, not the coast geometrically nearest the site. The drop shore is chosen by minimising sail time (pickup → coast) + walk time (coast → site), evaluated over every landing coast and weighted by the actual ship and worker speeds - and it only ever picks a coast that's reachable by sea from the pickup (a site whose nearest coast is sea-cut still ferries, to a reachable near-pickup shore). New
test_economycase (+3).
Added - storyline control of the dig-for-treasure mechanic
- New story actions (
docs/storyline-scripting.md§3):spawn_mound:drops one or more mounds of dirt at a position (count:spirals them onto dry land), anddig:reconfigures the dig economy at runtime -chance(per-dig odds of a chest) andvalue_min/value_max(the chest's copper-value range; its bronze/silver/gold wood follows where the value lands). The dig chance and value are now instance vars onDigSystem(defaults unchanged), andTerrainRenderer.spawn_resourcespawns a resource node at runtime. Covered bytest_dig(+5) and atest_storylineintegration case (+3).
Added - textile industry (fiber → fabric → fine clothes, + dye)
- Four new production buildings: Fiber Collector's Shed (cuts raw fiber from wild grass - a gatherer that harvests scattered pirate-kit grass tufts), Weaver's Mill (fiber → fabric, with a spinning wheel), Dye Maker's Hut (gathers dye from flowers), and Tailor's Shop (fabric + dye → fine clothes, a high-value good). Four new items (fiber/dye/fabric/clothes) and pre-rendered build-menu cards for each.
- Worldgen now scatters pirate-kit grass tufts (
grass-patch/patch-grass/grass-plant) across grass as the fiber resource (&"fiber"), and the existing flower flora became the dye resource (&"flower").
Added - mounds of dirt + dig-for-treasure
- A new world resource, the mound of dirt (pirate
hole, tinted dirt-brown): capped at 15 at any time, only on sand/grass tiles, and respawning 2 in-game days after being dug, on a fresh random sand/grass tile. - A unique hero, selected and right-clicking a mound, performs a "dig for treasure" action - walks there and digs for 6 in-game hours. 15% of digs turn up a treasure chest (survival-kit chest, its wood painted bronze / silver / gold by value, 15 silver to 75 gold). The digger then hauls the chest to the nearest finance building (bank / governor's mansion), where its coins join the treasury. New
DigSystemcomponent +test_digsuite.
Removed - the old treasure-chest system
- The wandering
pirate/chesttreasures (land + deep-sea) and the worker auto-crack logic are gone, replaced by the dig-for-treasure mechanic above. Decorative chests on the bank/mansion became barrels.
Changed - carried goods, time, camera, foliage
- Carried goods now ride as a Platformer-Kit crate whose model scales with the load: a small crate-item (1-4), a full crate (5-9), or a big reinforced crate (10+), tinted crate-wood.
- In-game time runs 3× faster (clock + day/night cycle;
CLOCK_RATE5 → 15) - a full day in ~1.6 real minutes at Normal speed. - Camera zooms out much farther (max 90 → 170) and in a touch closer; the scroll/pan speed is configurable in Settings → Camera (
camera_pan_speed_mult, default 2× the old base). - The grass-blade nubs on
patch-sand-foliagenow render green (a height-and-normal-aware shader) while the sand base stays sandy.
Changed - sand/grass patches read as textured ground
- The
patch-*kit models looked untextured. Diagnosis: their colormap was imported and bound correctly - but the renderer deliberately repainted them a flat colour (terrain dressing viaPALETTE_OVERRIDES, building props via the_ptflat-tint path), and the kit's own colormap is a flat palette with no grain anyway. So nothing visible was ever going to come from "the texture". - Fix: the sand/grass patches now wear the world-space procedural surface shaders (the same leafy-grass and sandy-beach grain as the terrain) instead of a flat repaint, so they read as real textured ground that blends with the beach/landscape. Applied in both render paths (
_grass_material/_sand_materialare now shared static helpers used by the terrain dressing and the building props - clay pit, toboggan workshop). survival/patch-grassandpatch-grass-largewere orphaned (placed nowhere). They are now scattered sparsely on flat inland grass tiles (a_dress_grasspass, the leafy counterpart to the beach sand dressing, capped at 240), so all four patch models appear in-world with proper surfaces.
Performance - physics hot-path profiling + throttles
- Profiled the per-frame simulation cost with a new uncapped tight-loop probe (
--cpubench, paired with a heavy-colony fixture--stress=N). On a 10x, 31-building / 48-citizen colony with one storm the hot paths were storms 1.66 ms/frame and the fog-of-war rebuild 2.84 ms/recompute - together ~4.5 ms/frame. By contrast worker logic was cheap and not a per-frame cost: characters 43 µs/frame (≈0.9 µs each), and the economy decision scan is already game-time throttled (SCAN_MIN), so it never runs per frame. - The headless
--fpsprobeis frame-capped at ~145 fps and so cannot reveal sub-cap CPU;--cpubenchis the accurate per-subsystem measure. - Storms: the per-puff terrain-clearance recompute (a
world_to_hex+ elevation lookup for every lobe of every cloud) ran every physics frame even though clouds creep at ~1.1 tiles/s. Throttled to ~20 Hz real-time (PUFF_DT): storm cost 1.66 ms → 0.53 ms/frame (-68%), visually identical. - Fog of war: the
O(chunks × sources)visibility rebuild fired whenever any vision source changed tile - i.e. nearly every frame in a busy world. Capped at ~15 Hz real-time (RECOMPUTE_DT); the mist still reveals promptly. Amortised cost 2.84 ms → 0.69 ms/frame (-76%). - Combined: ~3.3 ms/frame reclaimed when a storm overlaps an active colony.
- Configurable worker-logic floor: new
GameSettings.worker_logic_ms(default 100, range 0-1000, persisted under[perf]) adds a real-time minimum between worker decision scans on top of the game-time gate, so the scan rate is capped independent of game speed and can be tuned by eye. 0 = game-time gate only.
Changed - textured leafy grass + sandy beach tiles
- Grass and sand tiles now use world-space procedural surface shaders instead of the flat glassy colormap. Grass is a darker, matte, leafy green whose density varies smoothly across the world (world-space fbm, so neighbouring tiles blend seamlessly) with a fine blade speckle - no clearcoat / translucency, a soft leafy sheen rather than a glassy one. Sand is a golden beach grain with gentle ripples. Submerged sand keeps its plain underwater-graded matte.
Added - unique-hero roster (top-left, live 3D portraits)
- A top-left strip shows every unique hero (Oloaf, The Acorn) as a live 3D portrait - the hero's actual model slowly turning in its own little viewport - over a gold nameplate.
- Clicking a portrait selects that hero and glides the camera to them. The strip rebuilds itself as heroes appear (they are story-spawned over the voyage). The quest log shifts down to sit beneath the roster.
Added - selection info box (single building / character / ship)
- Selecting a single entity now opens a permanent bottom-left info panel (until deselected). Buildings are now click-selectable (a click on bare land picks the building on that tile) and show their nameplate while selected.
- Building: name, level/tier, blurb, HP, workers, live status, in/out inventory, current + next-level benefit and cost - with live Upgrade and Demolish (two-step confirm) buttons.
- Character: name, hero/citizen role, state, speed/vision, and a hero's pack inventory.
- Ship: name, level, HP, cannons. Groups (multi-select) still use the right-side panel.
Changed - terrain elevation: taller, hex-edge steps (overhaul, round 1)
- Each elevation level is now one hex side tall (
ELEVATION_STEP=HEX_EDGE≈ 0.577, up from 0.5) - height differences read more prominently, while the wide even-level plateaus (≥48% of land in one flat patch) keep the ground buildable. The renderer's column heights and the worldgen test were madeELEVATION_STEP-relative. - (Next rounds of the terrain overhaul: rendered walkable slope ramps at single-step changes, and worldgen-generated tall mountains that are inaccessible on foot.)
Added - ships ferry workers to cut-off construction sites
- A construction site no worker can walk to (across water), but within 100 tiles of a worker and reachable by sea, now gets a worker shipped across instead of being left unbuilt. The nearest friendly ship that can plot a course sails to the shore nearest the worker; the worker walks there and boards when both meet at the shoreline; the ship crosses to the shore from which the site is quickest to reach on foot; the worker disembarks, walks in, and builds.
- Workers now only flock to sites they can actually walk to; ferrying workers are held off production slots and hauling while in transit (
Economy._ferries/_advance_ferries). Economy gains aVehiclesComponentreference + the ocean nav for sea routing.
Added - faster days + an animated day/night cycle
- The in-game clock runs 5× faster (a full 24-hour day elapses in ~4.8 real minutes at Normal speed, 1/5th of before) via
TimePanel.CLOCK_RATE. The clock drives display + the day/night cycle only; the simulation keeps its balanced pace. - New
DayNightCycleanimates the sun (sweeping east→west and dipping below the horizon), ambient, sky and fog off the clock - 16 hours of daylight, 8 of night (night is half the day), with a warm dawn/dusk twilight and a dark, moonlit night.
Changed - worker logistics: carry capacity, production-first, reserve slider
- Workers now carry 5 of an item per trip (was 4), and more to/from upgraded warehouses - 5 / 10 / 15 at a level 1 / 2 / 3 warehouse (
Economy._carry_cap). - Workers favour production slots: staffing now runs before construction/hauling each tick, so non-reserved workers fill building job-slots first; the leftover pool builds and hauls.
- New ⚒ Reserve slider in the top bar sets how many workers are held back for construction + hauling. Reserved hands never take production slots; the rest staff buildings. Defaults to auto (a third of the workforce) until you move it.
Added - tree-density setting + Esc/Space pause keys
- New World tab in the settings menu with a Tree density slider (0.5×-3×) that scales overall forest cover on new / regenerated worlds (≈157 → 440 trees on a medium island). Default 1.0× is byte-identical to before (worldgen determinism intact).
- Esc now reliably exits the open in-game menu (pause menu or settings overlay) as well as opening it - routed through an always-processing key catcher so it works even though the world tree is paused; the settings overlay closes itself on Esc.
- Space toggles a soft pause: it freezes the simulation if running, or resumes to the previous speed setting if already paused (the hard Esc menu and quest modals take precedence).
Added - comprehensive video & audio settings menu
- New
SettingsMenuoverlay (gold-parchment styling) with Video and Audio tabs, opened from the main menu and the in-game pause menu (works while paused). - Video: display mode (windowed / borderless-fullscreen / borderless window), resolution, V-Sync, frame-rate cap, MSAA, FXAA, 3D render scale, fog-of-war.
- Audio: Master / Music / Ambience / SFX / Interface volume sliders + Mute, applied live to the audio buses. Plus a Reset-to-defaults.
- All options apply immediately and persist to
user://settings.cfg.GameSettingsis now the single owner of that file; Session's boot-time apply delegates to it, replacing the old three-option inline settings in the menus.
Added - audio engine (music, ambience, event SFX)
- New
GameAudioautoload drives four bus layers under Master - Music, Ambient, SFX, UI - reached through a null-safe static API so the gameplay hooks stay inert in the headless suites. - Soundtrack: the four
/gamedata/music/tracks (converted to streamed OGG) are async-loaded and shuffle-played, advancing track to track. - Proximity ambience: looping ocean waves, wind-in-the-trees, flowing water, fire, and storm layers whose volume eases up as the camera nears the relevant source (water/shore, trees, inland water, burning/collapsing things, storms).
- Event SFX (positional): cannon fire (ship + shore), cannonball hit vs. splash-miss, wood-chopping and stone-breaking at gatherers, lightning thunder, building collapse, and a UI notice on toasts/quests.
- All clips are royalty-free CC0 / Public-Domain (one CC-BY thunderclap, credited) - see
assets/audio/CREDITS.md. Swappable by replacing the files. - New
GameSettings(pure-static,user://settings.cfg) holds video + audio options.
Changed - rocks come in big bundled boulder fields
- Island rocks are no longer lone scatter. A seed tile now grows a tight BUNDLE of large rocks across its near neighbours (dense adjacent ring, sparse outer ring), so outcrops sit clustered the way real boulder fields do. Per medium island this roughly doubles the rock count (~16 → ~32), packs them into ~6 bundles of 5-8 (0% lone), and enlarges them (scale ~1.0 → ~2.0 avg, up to ~3.0). Deterministic per seed; one node per tile still holds. (
WorldGeneratorROCK_CLUSTER_CHANCE/ROCK_BUNDLE_MIN/VAR.)
Changed - grass tiles are translucent emerald glass
- Land tiles are now slightly TRANSLUCENT (alpha 0.74, depth-draw kept) on top of the glassy clearcoat, and the grass colour was deepened/cooled to a saturated emerald - so grass reads as a deep green gem rather than a flat, jarring bright green.
Added - navy shipyards build a leveling friendly fleet (spec 16 §R)
- Navy shipyards now lay a fresh level-1 warship every 2 in-game days, managing up to 2 / 3 / 5 ships at once by shipyard level (a sunk ship frees a slot). New warship line: Cutter (1 cannon, depth-vision 2) → Corvette → Frigate.
- Friendly ships gain XP by sinking enemies and level up: level 2 swaps to the medium hull with +50% HP, a 2nd cannon and depth-vision 3; level 3 to the large hull with +50% more HP, a 3rd cannon and depth-vision 4; fog vision grows each level. (
NavalCombatcredits the killing shot,VehiclesComponent.award_killpromotes,Vehicle.promoteswaps the def + rebuilds the hull and re-fits to full HP.)
Changed - towers larger, mounted cannons smaller in proportion
- Bumped the Castle-tower scales (lighthouse, guard tower, fortress keep/turrets, civic and manor towers) and shrank the mounted pirate cannons, so towers read big and the guns sit proportionally on top.
[0.13.0-alpha] - 2026-06-13
Fixed/Changed - cannon aim, tower flag, cartoony flowers, glassy land (review round 6)
- Guard-tower (and all building) cannons aimed 180° away from their target - flipped the barrel-forward offset so they point AT the enemy.
- Added a flag flying from the top of the guard tower.
- Cartoony flowers: replaced the dim nature-kit flower meshes with bright, code-built primitive flowers (green stem + two leaves + a flattened bloom with a yellow centre, a touch of emission) in a Link's-Awakening-style palette (red/white/pink/yellow/blue/ orange) - they read vivid from any angle. New
primpart type +Building._make_prim. - Glassier landscape: land tiles keep a smooth glassy base + full clearcoat for colour depth, but the clearcoat sheen is broadened so the sun reads as a deep, voluminous glassy bloom across the tile rather than a harsh white pinpoint.
Fixed - metal sidings keep their screwed-metal texture (multiply, not flat repaint)
- Cladding was flat-repainting panels one solid colour, erasing the corrugation, rivets and rust-streaks. It now uses the screwed
metal-panel-screwsmodel everywhere and MULTIPLIES the paint colour over the kept colormap, so the texture survives and only the paint recolours - level-1 patchwork and level-2/3 two-tone both keep the detail.
Fixed - Castle towers now read as textured sandstone
- The
_towerhelper was flat-repainting the Castle-Kit towers one solid colour, wiping out their colormap. Towers now MULTIPLY a warm sandstone tint over the kept colormap texture (newmulgrade path, matte not glossy) so they read as detailed sandstone - tan base course, cream body with window slits, slate-blue turret roofs. Applies to the lighthouse, guard tower, fortress keep/turrets and the civic/manor towers.
Changed - painted-metal sidings & windmill (spec 12 §R.14, review round 4)
- Building walls are now corrugated metal panels on every tier. Level 1 wears a patchwork of mismatched painted panels (blue/green/red/yellow/black/white/bare metal - the scrap-built look); levels 2-3 settle into a clean two-tone (primary + secondary accent). Wooden palisade retired from walls (kept as the garden fence).
- The windmill is now a tall mill tower with its sail-wheel on a short axle held clear of the walls, turning slowly -
spinvector magnitude is the turn speed, so the windmill (0.45 rad/s) and sawmill waterwheel (0.6) idle gently. - Bigger housing gardens; manor + governor's mansion gain a taller central block (real floor variation); flowers render true (green stems) and grounded banners.
Added - building sight & combat (spec 12 §R.13)
- Buildings emit fog-of-war vision like vehicles. Defensive buildings see twice as far (12 vs the base 6 tiles); the lighthouse climbs 15 / 30 / 45 tiles by level.
- Defensive cannons: guard tower (1), fortress (3-cannon battery), navy shipyard (1) mount swivelling pirate-kit cannons that aim at and fire on the nearest enemy ship in range (one ball per cannon every 3 s, reusing the naval ball flight). Hit chance rises with level, and guard-tower upgrades also raise max HP (150 / 200 / 250).
- Lighthouse buffs: friendly ships within a lighthouse's reveal radius gain +speed and +accuracy, more each level (best lighthouse wins; no stacking).
Changed - building overhaul follow-up: hip roofs, canvas tents, true-colour flowers
- Roofs rebuilt as hip roofs from multiple natural-scale pieces sloping up to the centre (never stretched); colourful
structure-canvasmarket tents restored; grand civic halls wear solid timber hip roofs. Garden flowers keep their green stems/leaves and are smaller; wooden palisade siding doubled into a solid stockade.
[0.12.0-alpha] - 2026-06-13
Changed - building overhaul: the Survival-Kit fortified visual language (spec 12 §R.12)
- A complete from-scratch visual rework of all 37 buildings on every tier. Every non-tower building is now a shell of
survival/structure(an open post-and-beam frame module) on a 0.5-unit grid, clad on its outer faces with siding, capped by asurvival/floordeck and a roof module - authored via newBuildingCataloghelpers_shell/_clad/_deck/_roof_tiles/_box/_garden_rect/_tower. - Siding tells an industrialisation story: level 1 wears the wooden
fence-fortifiedpalisade (doubled into a solid stockade); levels 2+ ADD metal-clad boxes (metal-panel/metal-panel-screws) - wings, upper works, towers - so the wooden core stays visible beneath the new metal as the settlement grows. - Roofs:
structure-roof(wood gable) at L1,structure-metal-roofon metal L3 additions,structure-canvastinted yellow/red/blue/green for flat roofs and market tents. Floors:flooron land,structure-floor(raised pilings) for over-water shore decks. Doors =fence-doorway. Towers (lighthouse, guard tower) and the fortress/civic turrets use Castle Kit segments; props come from Fantasy Town / Castle / Pirate / Nature. Housing keeps a rectangular half-height fence garden with many-coloured flowers. - The gameplay contract is unchanged - only
parts_by_leveland the sourced kits changed. The Castle Kit and the full Survival Kit were synced intogame/assets/kits/; build-menu thumbnails regenerated. Removed the old_hut/_garden/_fence_ringhelpers. All 521 suite checks stay green. Journal:docs/journal/2026-06-13-building-overhaul.md.
[0.11.2-alpha] - 2026-06-12
Changed - unique heroes favour construction & defer to idle workers (spec 12 §R.9)
- A unique hero now always prefers building over production work: it leaves any production post (or idleness) for the nearest REACHABLE construction site within 50 tiles (
HERO_BUILD_RANGE, a land route required). - A hero only works a production post when no worker is idle anywhere - the moment any worker is idle, every staffing hero steps aside to idle and its post passes to a worker. (Construction still wins: a build-bound hero is pulled to its site first.)
- New
EconomyComponent._reachable(LandNav path check);test_economy+8 (hero abandons production for a nearby site, returns when it's built, idles while a worker is idle, reachability gate). All 8 suites green (521).
[0.11.1-alpha] - 2026-06-12
Changed - placement shows the whole reserved plot (spec 12 §R.8)
- The build placer now lights up the building's entire reserved hex plot - footprint AND buffer zone - as a yellow ghost box of tiles on the ground (red where blocked, brighter on the centre tile), replacing the single edge ring, so the player sees exactly how much land a building (at any future level) will claim. The
building_viewer --plotoverlay matches the same yellow for a clean preview.
[0.11.0-alpha] - 2026-06-12
Changed - building footprints, level-scaled plots & richer models (spec 12 §R)
- Hex-plot footprints + buffer zone: a building now reserves a centered hexagon of
plot_radiusrings (GridSystem.hex_area_axial- radius 1 = 7 tiles, radius 2 = 19 for the grandest). The whole plot is reserved from level 1; the empty buffer ring(s) hold room for the building's fully-grown model so neighbours keep their distance.BuildingDef.largeis now aplot_radius >= 2getter; the placer ghost ring and the marine/occupancy rules follow the plot. - Models grow into their plot with level:
Building._fit_bodyauto-fits the composed model tomodel_fill(level)(0.42 → 0.92 of the plot's inscribed radius) with gentle height growth - so higher levels visibly take up more land while the reserved area and hex snapping never change. No per-model re-authoring needed. - House gardens (user law): tents, cottages, town houses and manors get a small fenced flower garden (
_garden/_fence_ring+ bright nature-kit flowers); parks, plazas, the town hall and governor's mansion get flowerbeds (_flowerbed). Tinted parts now build a fresh material so the nature flowers' baked vertex-colours can't dim the tint to black; a few flags lowered to sit on their roofs. - Marine placement relaxed for multi-tile plots (a pier may span land + water; the "level beach" rule is gone). Construction-crew caps and the menu read
plot_radius. test_economy+14 (hex-area counts, plot/buffer reservation, model-grows-with-level); all 8 suites green (513). Building viewer gains a--plotfootprint overlay.
[0.10.0-alpha] - 2026-06-12
Added - storyline objectives & building unlocks (spec 17 §R)
- Objective counting for quests and triggers: a small flow-map names one metric with an implicit "at least" goal - buildings by id (
{building:, min_level:, count:}) or category ({category:, count:}), item stockpiles,population,happiness, averagefood/water/fun/security,treasury/wealth(currency string or copper), citytier(id or index), and the cumulative talliesships_sunk/treasures_opened. One pure evaluator (Objectives) backs both forms; AND by default,match: anyfor OR; typos and unknown ids are load-time errors. - Quest
requires:- a quest that suspends, shows live▸ a/b · c/dprogress, and auto-completes (then continues, orgoto:) when its goals are met. Reuses the existing suspend marker, so save/restore stays exact. when: objectivetrigger - races objectives against timers and other triggers without suspending on a quest.unlock:/lock:actions open (or re-lock) buildings for construction.unlock:bypasses the city-tier requirement; alockedbuilding is gated entirely behind the story. The build menu,try_build, and tooltips all honor it; unlocks persist in the save.GameStatscumulative counters (ships_sunk,treasures_opened) in a newstatssave slot.ships_sunkticks on hostile (non-wildlife) sinks; a minimal treasure-opening mechanic lets an adjacent citizen crack a land chest for coins + the tally.- Showcase storyline
02-the-growing-cove.yaml; consoleunlock/lockverbs; docs/storyline-scripting.md §7-§8. Suites: test_economy 177, test_storyline 75 (8 suites green).
Fixed
yaml_lite: a flow-collection sequence item (- {k: v}/- [a, b]) was mis-parsed as a block mapping; now read as a flow value (benefits the whole scripting language).
[0.9.1-alpha] - 2026-06-12
Changed - wider even-level plateaus & forests scaled to island size (spec 05 §4.4/§4.7)
- Wider building terraces: trimmed the per-island vertical range (
_max_half_steps8→6 big, 5→4 mid - the 2-half-step terrace step is fixed by the walk law, so fewer steps = fewer, wider terraces) and added a plateau-widening pass (_widen_plateaus, majority-vote edge erosion with a cliff guard, sequential + deterministic) that dissolves thin bands and single-tile bumps/dips into the big slabs. MEDIUM even-level share of land 0.85-0.88 → 0.91-0.93; largest contiguous flat patch up ~7-13 % (now ≈ 35-40 % of land); foot reachability stays 1.000. - Denser, bigger forests on bigger islands: grove count
1 + area/900(cap 4) →1 + area/450(cap 9), radius 2-4 →3 + area/2200(3-7), and two-thirds of groves now cluster beside an earlier one to knit broad woods. Trees per MEDIUM world +~40 %, per LARGE +~52 % (5 309 → 8 051); densest 5×5 window 23-25. test_worldgenthresholds tightened to lock the gains (even ≥ 0.88, new largest-flat ≥ 20 % of land, densest 5×5 ≥ 20);measure_terracesbaselines refreshed. All eight suites green (worldgen 34 + economy 142 + vehicles 114 + characters 53 + storyline 61 + fog 12 + session 11 + storms 23).
[0.9.0-alpha] - 2026-06-12
Added - even-plateau terrain & dense forest groves (spec 05 §4.4/§4.7)
- The even-plateau law: after terracing/flats, every odd land tile snaps down one half-step so EVEN levels form wide contiguous building terraces; the rim of every higher plateau becomes a thin ODD stair band (full hex neighborhood, snapshot-simultaneous), preserving the citizens' |Δe| ≤ 1 walk law everywhere plateaus meet. Measured on MEDIUM seeds: even-level share 0.67-0.74 → 0.85-0.88, largest contiguous flat +38-61 %, sea-level walk reachability 0.92-0.99 → 1.000 (the stairs also fixed a latent gap where mega-terrace snapping left plateaus unreachable on foot).
- Dense forest groves: islands ≥ 700 tiles grow 1-4 round groves (radius 2-4, interior-seeded) where trees pack trunk-to-trunk at density 0.85 (palm oases 0.60 on deserts) - the densest 5×5 window jumps 6-7 → 23-25 trees; total trees +~25 %. Woodcutters finally have forests worth parking next to.
- HUGE (1024²) generation cost unchanged within noise (~6.6 s on the dev VM, +40 ms vs baseline). New
tools/measure_terraces.gdprobe;test_worldgengrew to 33 checks (even share ≥ 0.78, reachability ≥ 0.99, grove density ≥ 15); worldhash changed by design (new passes).
[0.8.0-alpha] - 2026-06-12
Added - hero packs, marine placement & worker-built construction
- Hero packs: unique characters carry personal storage that counts toward the city inventory and wealth (never the treasury). Oloaf and Acorn each land with 15 wood, 15 silver, 5 stone, 5 water, 5 pastries, 5 frosted sugar - the kit that affords the first tents. Construction costs can draw from packs (buildings first, packs last); saves keep pack contents without re-granting the starter kit.
- The bulldoze law: resource objects no longer block placement - raising a building destroys whatever stood on the footprint (same end state as a storm kill, so saves and the respawn machinery agree).
- The marine law: land buildings refuse water, but marine buildings (fishing dock, harbour, lighthouse, navy shipyard) may stand on the shoreline or ON the water itself - piers float at sea level, mixed footprints need a level beach, and open ocean is too far from shore.
- The scaffold law: paid builds (build menu) no longer finish instantly - scaffolding (poles, plank deck, materials pile) stands first, then the model rises component by component, ground-up, while builders work it. A small standard building takes 15 s at 1× with one builder (scales by importance: tent ≈ 9 s, fortress 60 s); every builder present multiplies the pace (crews cap 3 small / 5 large). Sites must be built by idle workers - construction outranks staffing and hauling - or by a nearby idling hero when no worker is free; builders shoulder a hammer and only hands within 2 tiles count. Half-built sites save/restore exactly; demolition mid-build tumbles only the raised components plus the scaffold. Console
buildstays instant (QA path). - QA:
--constructqa(paid cottage rises on camera); suite grew to 142 checks; all eight suites = 446.
[0.7.0-alpha] - 2026-06-12
Added - staffed buildings & the build menu (specs 12 §R.8-9 / 13 §R.2)
- The staffing law: buildings with worker slots only work while manned - production, market sales, the pub, and defense/fun auras all gate on staff; each filled slot is one pair of hands (cycles advance staffed× per tick). Slots per level pinned in
BuildingDef.jobs(gatherers 1/2/3, farms 2/3/4, light refiners 1/2/2, heavy industry & grand civic up to 2/3/4 - upgrades add slots); housing, wells, warehouses and parks stay passive. - Auto-assignment: idle workers take the nearest understaffed post (every building gets one pair of hands before any gets two) while ~⅓ of the workforce stays free to haul; staff walk to their building, drift back on a leash, and are released by demolition or being commanded far away. Idling unique heroes (Oloaf/Acorn) cover buildings that would otherwise stand empty and step aside the moment a worker frees up. Tooltip shows
Workers n/m; unmanned buildings read "no workers". - Build menu (B): every tier-available building grouped by category - each card carries a pre-rendered preview (
assets/ui/buildings/, 37 cards), name, function details (recipes/housing/auras/slots/shore/plot size) and the build cost in items + coins; unaffordable cards are disabled with the shortfall named. Cards start ghost placement: translucent preview on the cursor hex, green/red ground ring with the reason on a floating label, T rotates 60°, LMB pays (items from storage; coins treasury-first, then loose pockets - pinned construction ruling) and places, Esc/RMB cancels. - Brickworks (Brick Bakery) joined the production roster - bricks finally have a maker (2 clay + 1 wood → 2 bricks / 12 game-min, tier 2).
- QA:
--menuqa,--placeqa=<id>,--hoverqa=<id>;building_viewer.gdgained--thumbs(build-menu card renderer). Suitetest_economy.gdgrew to 114 checks (staffing, hero fallback, affordability, paid placement, coin spend order); all eight suites = 418.
[0.6.0-alpha] - 2026-06-12
Added - economy, logistics, needs & city tiers (specs 13 §R / 12 §R)
- Per-building item storage: every building carries incoming/outgoing pools (
BuildingStorage); warehouses store in bulk; the city inventory is a derived aggregate. 22-item catalog (EconomyItems) across the whole chain - wood/planks, stone/bricks, clay, iron ore→bars→steel, tools, wheat→flour→ bread, frosted berries→pastries, fish, beer, water, coins. - Worker logistics: a haul job board matches surpluses to demands; idle workers walk routes carrying a visible item prop, deposit into pools, and bring leftovers home. Priorities: recipe inputs → pub beer → home pantries → treasury coins → market feed → warehouse surplus.
- Gold-silver-copper economy (1 g = 100 s = 10 000 c): coins are physical items; market/trade-center sales mint coins into the till; only coins hauled to a bank or the governor's mansion count as spendable treasury.
- Citizen needs - food, water, fun (venue auras; the pub burns beer) and security (guard tower/fortress/lighthouse/shipyard coverage) → happiness → immigration waves at the harbour. Cozy law: statuses and small speed nudges only; needs never kill.
- City tiers: Camp → Hamlet → Town → Village → City → Metropolis → City-State → City-Empire, advancing on population / wealth-or-treasury / happiness / civic milestones; tier gates building availability and upgrade levels.
- 36 composed-model buildings across housing (tent→manor), production (15 defs covering every chain), logistics/trade (warehouse, market, trade center, bank, harbour, lighthouse, builders' yard), civic (town hall, governor's mansion), defense (guard tower, fortress, navy shipyard, dune toboggan workshop) and fun (park, plaza, pub, theater) - four composition styles (landmark / framed hut / compound / grand stack) built from Pirate, Survival and Fantasy Town kit parts; animated rotors on mills.
- Upgrades (≤ 3 levels): paid in items + treasury coins, built over game-time, adding parts and benefits; hover tooltip shows the next level's cost/time/benefit (U to upgrade). Buildings wear vehicle-style nameplates on hover/damage/upgrade; base 100 HP scaled by importance (tent 60 … fortress 400).
- Demolition collapse law: buildings fall apart into their component parts - tumbling rubble that rests, fades and frees the footprint.
- Top HUD bar: treasury (g/s/c) + loose wealth, crew vs housing, happiness face, key-goods chips, full-inventory expand, and the tier progression meter with milestone tooltip (existing top panels shifted down).
- Console:
build,demolish,upgrade,give,coins,tier,eco; QA args--ecoqa/--collapseqa; viewer toolbuilding_viewer.gd(--parts/--def/--all); new suitetest_economy.gd(86 checks; all seven suites = 367). - Save v3 gains
buildings(level/hp/storage/upgrade state) andeconomy(needs, tier, immigration clock) sections.
[Unreleased]
Added - specification suite (2026-06-10)
- Complete specification suite in
specs/: the architecture charter (00-architecture.md), 22 component specifications (project setup & tooling, visual style, main menu, settings service, world generation, grid system, terrain renderer, water & ocean, camera, day/night & weather, characters, city building, resources & economy, experience trees, combat, vehicles & exploration, story & quests, audio, save/load, UI/HUD framework, testing & QA, entity framework),ROADMAP.md(phases/milestones/Definition of Done), and aREADME.mdindex. Each spec carries a self-contained Primer so a component can be built and inspected in isolation. - Git repository,
.gitignore(vendor asset library and Godot caches excluded), and this changelog.
Changed (during authoring, before first commit)
- Renderer baseline switched from OpenGL/
gl_compatibilityto Forward+ (Vulkan) per direction: better graphics (clearcoat, glow, SSAO/SSR tiers); the dev VM software-renders Vulkan (Mesa lavapipe), so fps budgets target real GPUs and the VM is used for correctness, tests, and captures. - Added the five-type world entity taxonomy as charter §16 (landscape / resource objects / buildings / vehicles / citizens) with the fire & damage law (ignite <50% buildings, <40% vehicles & citizens; 2 HP per 15 in-game minutes; extinguish >40%; burning vehicles at 50% speed), the pinned world construction order, block-built buildings (Brick Kit), dune toboggans, and the weather system; integrated across all affected specs; added spec 22 (entity framework) and renamed spec 16 to vehicles & exploration.
- Institutionalized the QA phase (charter §13.5): every bigger task is verified against its spec direction, improved further when judged best, and journaled in
docs/journal/with screenshots and/or animated GIFs (docs/captures/, captured via Godot MovieWriter + ffmpeg).
Notes
- No game code exists yet by design: this milestone delivers specifications and build instructions only. Implementation begins with Phase 0 ("Keel") per
specs/ROADMAP.md. - The multi-agent review pass (contract consistency / requirements coverage / Godot 4.6 accuracy / primer self-containedness) was interrupted by session limits after the integration pass completed; grep-level contract checks passed (fire-law numbers, signal names, renderer, folder paths). A full review pass remains worthwhile before Phase 1 implementation.
Polish iteration 1 (2026-06-10)
Added
- Root
README.md: professional repository front door (tech baseline, layout, how development works, links into the suite). docs/decisions/architecture decision records: ADR 0001 (Forward+ renderer, software-rendered dev VM), ADR 0002 (five-type entity taxonomy; buildings as Brick Kit block assemblies).
Verified (scripted checks, in lieu of the rate-limited agent review)
- All 22 specs carry the full 10-section template + status header.
- Pinned contracts uniform across the suite: fire law (14 docs), world sizes, weather multipliers, day-phase boundaries, grid shader globals, scenario preset ownership (spec 03), no stale renderer/folder references, no broken inter-spec links.
Polish iteration 2 (2026-06-10)
Added
- Spec 05 §4.4b: pinned
ElevationStrategyinterface with three bake-off candidates - A "Coastal Shelf" (baseline ramp×FBM), B "Stacked Plateaus" (blob accretion, mesa look), C "Ridged Spine" (ridged FBM + smoothing) - sharing the quantization/terracing pipeline so only the heightfield differs. - ROADMAP M1.4a: elevation/island-shape bake-off milestone on
alpha/mapgen-*branches, judged via side-by-side captures and a QA journal verdict; the winning default and climate/size weighting get merged back per charter §15.
Alpha - world generation bake-off (2026-06-10, branches)
Added
- Three alpha branches implementing the first playable step (generate a world → see it rendered with warm glossy visuals):
alpha/mapgen-coastal-shelf(Strategy A baseline: full generator pipeline, terrain renderer with cliff stacks and 0.2 shore lips, bobbing translucent cube ocean, CLI demo with screenshot capture),alpha/mapgen-stacked-plateaus(Strategy B: banded mesa elevation),alpha/mapgen-ridged-spine(Strategy C: ridged-fractal peaks). - QA journals with screenshot evidence for all three (
docs/journal/2026-06-10-alpha-*.md); climate matrix captures indocs/screenshots/. - Provisional bake-off read (final verdict at ROADMAP M1.4a): A suits TROPIC/TEMPERATE, B suits DESERT, C suits COLD/large islands - climate-weighted selection beats a single global winner.
Notes
- Forward+ renders correctly via software Vulkan (llvmpipe) on the dev VM; full-scene stills take seconds. Automation rules learned: absolute
--pathalways;pkill godotbefore batches; re-run--importafter adding aclass_name; GIF capture blocked until ffmpeg is installed (spec 01, Phase 0).
Alpha - fog of war & map scale (2026-06-11, branch alpha/fog-of-war)
Added
- Fog-of-war environmental system: dense rolling mist (3 phase-offset noise slabs, 2 tiles high from base ocean level) covering land and ocean; anything outside the union of vision radii is hidden outright (chunked terrain/water + per-tile objects); soft-edged visibility holes via a linear-filtered R8 tile texture. Red marble player stand-in (vision radius 50, WASD movement, terrain following, wave floating, chase cam) for testing progressive discovery.
- Mixed-size island layout under a ~30% land budget (one or more dominant large islands + smaller isles; measured 0.29-0.31 across sizes/seeds).
- QA journal with evidence: docs/journal/2026-06-11-alpha-fog-of-war.md.
Changed
- Charter amendment (§15 process): world dimensions are now SMALL 128², MEDIUM 256², LARGE 512², HUGE 1024² (was 96/160/224/320); all restating specs and derived performance budgets updated (generation: HUGE < 10 s threaded on the VM - alpha measured 11 s single-threaded).
Alpha - menu, camera, configurable generation (2026-06-11, branch alpha/fog-of-war)
Added
- Main menu component: New Game (climate, world size, weather, island sizes, the five island formations with rationale tooltips, land ratio, elevation profile, day/night, seed), Load Game (seed re-derivation saves, F5 in-game), visual Settings (display mode/vsync, persisted + applied live), Quit.
- Camera rig component: WASD pan, Q/E rotate, wheel zoom-to-cursor, MMB drag, optional edge pan, bounds clamp, smoothing, zoom-dependent pitch curve.
- Buildable-flats guarantee: medium+ islands keep >=35% level ground (progressive level-merge + majority smoothing; measured 0.07->0.38, 0.14->0.53).
- QA journal: docs/journal/2026-06-11-alpha-menu-camera-genoptions.md.
Changed
- Charter amendment (§15):
WorldGenParamsgainsland_ratio(SPARSE/NORMAL/RICH ≈ 20/30/40% land) andelevation_profile(FLAT/ROLLING/HILLY/MOUNTAINOUS ×0.5-×2.0); enums added toWorldEnums. Specs 03/05 inherit via the charter contract block (full primer sweep deferred to the next spec-maintenance pass - flagged here per §15).
Alpha - terrain dressing (2026-06-11, branch alpha/fog-of-war)
Added
- Asset analysis of the Nature Kit cliff family + Pirate Kit patches (dimensions/connection points journaled); natural half/full-step ramp transitions in concave folds (thinned to read as ascents); sculpted cliff face panels standing in the water along cliff-run shorelines; organic Pirate-Kit sand patch chains (with foliage/sea-rock variation) at beach waterlines. Three cohesion passes documented in docs/journal/2026-06-11-alpha-terrain-dressing.md.
Alpha - textures, palette, placement cohesion (2026-06-11, branch alpha/fog-of-war)
Fixed
- Pirate Kit external colormap texture was never synced (untextured white pieces); palette-pinned assets now use flat palette colors with textures stripped. Refined palette applied: golden/coppery beaches, light grey rocks/cliffs, lush green grass, deep cerulean ocean. Context-aware placement rules (clear-water patch contexts, straight-run cliff panels, taller patch geometry above wave crests) eliminate clipping artifacts. Journal: docs/journal/2026-06-11-alpha-palette-textures.md.
Alpha - green material pass, rock family, slope corners (2026-06-11)
Fixed
- Per-material tinting: grass/leaf/foliage surfaces on ANY asset (slope tops, cliff caps, tufts, canopies) now share one pinned lush tropic green; rock
_rockfamily favoured over_stoneeverywhere (warmer); ramps' low corners wrapped with rounded half-corner/corner pieces via a quadrant rotation solver. Journal: docs/journal/2026-06-11-alpha-green-tint-rock-corners.md.
Alpha - slopes, lakes & rivers, RMB camera (2026-06-11)
Changed
- Ramps use the wall-less cliff_blockSlope exclusively (corner pieces removed - they clipped); rocks/cliffs retinted to a slight sand-copper hue; lakes and downhill rivers carved on large elevated islands (inland water via retained island_id) with waterfall faces at tall walls; small stones stud cliff faces taller than one level; RMB drag pans, Shift+RMB rotates. Journal: docs/journal/2026-06-11-alpha-slopes-lakes-rmb.md.
Alpha - flatter terrain, seams, slope facing (2026-06-11)
Fixed
- Power-biased elevation: level land 0.461 of land (was ~0.29); stacks snap 0.01 under caps with a 1.03 cap overhang (no coplanar z-fights); slopes flipped to face outward/downhill; sea-rock clusters keep natural proportions in a deeper sand-copper; waterfall faces disabled pending a composed scene. Journal: docs/journal/2026-06-11-alpha-flatter-seams-slopes.md.
Alpha - hexagonal grid feature branch (2026-06-11, branch alpha/hexgrid)
Added
- Feature branch converting the landscape to a hexagonal grid at the same 1.0 scale using Kenney's Hexagon Kit (pointy-top, odd-row offset over the existing WorldData): surface-mapped hex caps, stacked-disc elevation, hex water prisms under the cerulean bob shader, palette modulation onto our colors; props, fog, marble, and generator unchanged. Journal: docs/journal/2026-06-11-alpha-hexgrid.md.
Workflow - branch snapshots (2026-06-11)
Added
- tools/snapshot-branch.sh + charter §13.1 addendum: after a task's closing commit, every updated branch is hard-copied to /game/beyond-versions/<branch> (overwriting the previous copy). Initial snapshots made for alpha/hexgrid, alpha/fog-of-war, and main.
Merge - hexagonal grid becomes the main version (2026-06-11)
Changed
alpha/hexgridmerged intomain: the hexagonal landscape (Hexagon Kit tiles, stacked-disc elevation, hex water prisms) is now the mainline game, with the hex water-culling fix (AABBs scaled to the 0.866 row pitch - ocean, lakes and rivers always render in view) and the parchment pirate minimap (sepia chart, inked coasts, camera position/facing/FOV wedge, compass rose, click/drag navigation) in the lower right. The square-grid line remains on alpha/fog-of-war. Journal: docs/journal/2026-06-11-alpha-hex-water-minimap.md.
Generation - open-sea island spacing (2026-06-11)
Changed
- Island shorelines now sit 25-45 tiles apart on average (18% clump chance at 4-12 tiles). Spacing takes precedence over the land-ratio target, which now tops out near ~0.16-0.19 map land (journal: docs/journal/2026-06-11-island-spacing.md).
Workflow - baked imports + release exports in snapshots (2026-06-11)
Added
- game/export_presets.cfg (Linux x86_64, embedded pck) and an upgraded tools/snapshot-branch.sh: every branch snapshot now bakes all asset imports in a clean /tmp working copy and exports the release binary to /game/beyond-versions/<branch>/beyond-the-horizon.x86_64 (verified: 69M binary boots to the main menu). Branches without the preset skip export gracefully.
Storms - damage tick rate (2026-06-11)
Changed
- Storm cloud damage registers at 2 Hz (0.5 s accumulator) instead of every physics frame; the per-pass hit dedup is unchanged, lightning and cloud motion stay per-frame.
Debug - stats overlay (2026-06-11)
Added
- components/stats_overlay: top-right info box refreshing 2×/s - FPS, frame and physics ms, draw calls, objects and primitives in frame, VRAM/texture/ static memory, node count, and the live GPU/CPU identities (evidence: docs/screenshots/2026-06-11-stats-overlay.png).
Storms - population scales with size (2026-06-11)
Changed
- Cloud count, cloud size, and covered area now scale with storm radius: one perimeter cloud per ~4 tiles of circumference (7-26 dark + ~55% white), per-cloud size ×(0.75 + r/16, capped 2.1), and inner-ring clouds on large storms ((r-7)/2.5) so big storms read as fully clouded systems (evidence: docs/screenshots/2026-06-11-scaled-storm.png).
UI - in-game clock and speed panel (2026-06-11)
Added
- components/time_panel: top-center in-game clock (Day N HH:MM; 1 real second = 1 in-game minute at Normal speed, starting 08:00) with a +/- speed stepper through Paused / Normal / 2x / 5x / 10x. World simulation (storms, marble) multiplies its delta by TimePanel.speed; the camera stays real-time so the player can look around while paused. Evidence: docs/screenshots/2026-06-11-time-panel.png.
Storms - respawn occupancy guard (2026-06-11)
Changed
- Respawning resource objects never land on a tile holding another living resource object or the player marble; the occupancy test is the documented plug-in point for buildings, units, and vehicles (one world entity per tile).
Docs - primer for the units & vehicles work (2026-06-11)
Added
docs/primers/2026-06-11-units-and-vehicles.md: comprehensive hand-off primer for the next agent (specs 11 + 16): world ground truth (hex grid, curvature law), source map of the alpha, the spec-vs-alpha autoload gap and the integration fork, design contracts (taxonomy, fire law, hex AStar2D pathfinding, movement engines, occupancy hook), the measured performance/threading laws, GDScript gotchas, the full session workflow (spec-sync law, QA phase, changelog/commit/snapshot, 120-s run cap), and current hazards (feat/threaded-worldgenoverlap, contention SIGABRT).
UI - minimap chart prebakes during world load (2026-06-11)
Changed
- The parchment chart now bakes on its own Thread starting the moment generation finishes (it depends only on the final WorldData; the runtime chart is static - camera wedge/marble/storm markers are per-frame overlays).
Minimap.bake_chart_image()is static and pure;setup()takes an optional prebaked Image (sync fallback kept for sandboxes;--prebake=offescape hatch). The bake completes inside the terrain/water build window every time: ui+cam LARGE 507 → 11 ms, HUGE 1 045 → 11 ms (join waited 0 ms). Menu-path load: LARGE ~3.0 s, HUGE ~10.5 s, bar live throughout. Journal: docs/journal/2026-06-11-minimap-prebake.md.
UI - minimap bake 51.6 s → 0.5 s on LARGE (2026-06-11)
Changed
- The parchment minimap baked at a fixed 4× tile resolution (4096² on HUGE, for a 250 px widget) with per-pixel ring scans, probe allocations and
set_pixel- measured 51.6 s of the menu-path load on LARGE (the reported "ui+cam takes by far the longest"). Now: bake resolution is display-capped (~1024² for every map size), per-tile facts precompute once (sea bits, sepia bases, ONE multi-source BFS coast-distance field), and the pixel pass fans out over WorkerThreadPool row bands into band-local byte buffers merged withappend_array+ oneImage.create_from_data. ui+cam: LARGE 51 589 → 507 ms (102×); HUGE ≈ 200 s (extrapolated) → 1 045 ms. Chart look unchanged (same formulas and noise seeds). - New GDScript thread-scaling law pinned in spec 05 §9: per-element
ctx.memberaccess from many workers serializes on the shared Variant's atomic refcount - hot loops take band-local shared-buffer copies for reads and write band-local output buffers stored once per band. Journal: docs/journal/2026-06-11-minimap-bake.md.
Generation - threaded world generator, live loading bar (2026-06-11)
Changed
- World generation is multithreaded: the data-parallel per-tile passes (island carve, elevation, shoreline, surfaces) fan out over row bands via WorkerThreadPool; RNG-ordered and order-dependent passes stay sequential by design. Deterministic by construction (per-band noise with identical seeds; disjoint row writes): same-seed worlds are byte-identical for any core count, verified via the new
worldhashfingerprint (MEDIUM hash unchanged vs. the single-threaded baseline). Profile-driven algorithmic fixes:_guarantee_beachesno longer scans the map once per island (~2.4 s → 0.3 s on HUGE), the elevation strategy fills island bboxes instead of the full grid per island (2.7 s → 0.3 s), carve hot loop hoists per-tile Dictionary/String work (2.4 s → 1.1 s). Generation: LARGE 2.4 s → 1.3 s, HUGE 11.9 s → 4.6 s (24-core dev VM); spec 05 §9's "HUGE < 10 s threaded" budget is met. Spec 05 status/§9 updated with the threading laws (including the GDScript thread-write law: workers write through shared-Object members - lambda-captured Packed arrays CoW and lose band results). - Generation runs off the main thread in the demo: the loading overlay now appears first and stays alive during generation - the 10-20 s frozen window on big maps (single-threaded gen before the overlay existed) is gone. Measured first-frames after load (LARGE: ~1.2 s + 0.3 s + 0.25 s) are llvmpipe's first rasterization, not a game-side stall.
Fixed
- Same-seed determinism: treasure-chest placement used
Array.shuffle()(the global RNG) - chests moved between runs of the same seed; now a seeded Fisher-Yates (charter §12 law). - Demo CLI: bare flags (
--bench,--noyield) are now parsed;--benchpreviously never quit, so past bench runs silently ran the full pipeline until their timeout. Journal: docs/journal/2026-06-11-threaded-worldgen.md.
World - hex-native renderers + 5-8× faster map builds (2026-06-11)
Changed
- Terrain & water renderers rewritten hex-native: the square-grid pipeline (cliff stacks/lips/slopes/face panels and its 4-neighbor logic) is deleted; disc columns fill to the lowest of the SIX hex neighbors (fixes potential see-through gaps at parity-diagonal drops), beach patches and face stones anchor along true hex directions, water foam tests all six neighbors, and
get_wave_heightsamples at the true prism center (CPU now matches the GPU's instance-origin sampling).components/grid_system/grid_system.gdimplements spec 06's static hex math API (exact Voronoi picking, neighbors, offset↔axial, hex distance, footprints).WATER_CUBE_SIZEremoved; shader renamedwater_prism.gdshader. - Map load profiled and optimized (permanent
perf:stage prints): cold kit.glbloads cost ~150-200 ms on the VM and the dead square assets were re-resolved per chunk (~1.1 s/build); kit meshes now resolve once, failed loads cache as null, known assets preload on worker threads during generation, yields are time-based (40 ms), and the water build splits into a no-allocation in-map pass + a test-free margin pass. Load totals: MEDIUM 3 981→1 071 ms, LARGE 8 498→3 850 ms (build phase 8.1×/4.8×); HUGE measured 16.7 s, now dominated by single-threaded generation (10.9 s - next frontier). Journal: docs/journal/2026-06-11-hexnative-build-perf.md. - Root
README.mdrefreshed (playable-alpha status, hex world) and pins the spec-sync law for contributors and Claude agents: when implementation deviates from the specs as written, the affected specs are amended in the same task (charter §15). Specs 06/07/08 statuses + §9 build-time laws updated alongside this change.
Specs - suite aligned with the hexagonal world grid (2026-06-11)
Changed
- Charter amendment (§15): the world grid is hexagonal - charter §7 pins
HEX_W/HEX_ROW = 0.8660254/HEX_THICK = 0.2, thehex_center/world_to_hexodd-row-offset mapping, the 6-neighbor model, and thecurve_applyplacement law;WATER_CUBE_SIZEretired; Hexagon Kit pinned as the primary landscape kit. All 20 affected suite documents updated (+828/-535): spec 06 rewritten around hex math and a honeycomb Tab overlay, spec 07 around surface-mapped hex caps + stacked-disc elevation (the tile's 0.2 thickness IS the cliff lip), spec 08 around kit hex water prisms with instance-origin wave sampling, buffer-margin far-LOD and curvature-aware AABBs/seafloor (get_cube_top_y→get_tile_top_y); pathfinding specs 11/15/16 moved fromAStarGrid2Dto 6-neighborAStar2Dhex graphs; spec 12 carries pinned hex-adaptation rules (cell-set footprints, 60° facings) ahead of its Phase 2 redesign; spec 05 documents its 4-neighbor passes as the sanctioned conservative subset with the hex-aware pass as follow-up. Scripted consistency checks: no stale square contracts remain; hex constants uniform across 15 restating specs. Journal: docs/journal/2026-06-11-spec-hex-alignment.md.
UI - keyboard speed control (2026-06-11)
Added
- + / = / numpad-plus step the game speed up; - / numpad-minus step it down (same Pause/1x/2x/5x/10x ladder as the panel buttons).
Vehicles alpha - ships, selection, orders, roaming pirates (2026-06-11)
Added
- Units & vehicles, first slice (specs 16 + 22 alpha) in
game/components/vehicles/, storms-style integration (no autoloads; wired byisland_demo, world time viaTimePanel.speed). Journal: docs/journal/2026-06-11-vehicles-ships-alpha.md. - Ship roster (
VehicleDefcontract + code roster): player Dingy (boat-row-large), Sloop / Brig / Galleon (ship-small/medium/large, hostileship-pirate-*hulls) - larger ships sail slower (1.8/1.6/1.4/1.2 t/s), carry more cannons (0/2/4/6 mounted on deck), more HP (20/60/90/140), and see further (vision 8/15/20/25 tiles, friendly fog-of-war sources). Warm-graded glossy plastic hulls; nine ship/cannon GLBs synced intogame/assets/kits/pirate/. - OceanNav: hex
AStar2Dwater graph + BFS shore-distance field, built on a Thread during world load (join waited 0 ms on SMALL/MEDIUM); near-shore weight penalties bend courses ≥ 4 tiles offshore; courses never cross land. - Units gameplay: click / shift-click / amber marquee selection (friendly units only groupable; hostiles inspect singly with a red ring), right-click move orders with a synthesized two-strike ship's bell and a golden cross lighting up over the target, distinct-tile group fan-out, hold-position vs
autonomousresume, markov-chain roaming for self-navigating boats, hostile fleet spawned per map size on new/loaded games (--hostiles=N,--ships=off). - Unit overlays (spec-22 alpha, lives in vehicles until the entity framework lands): nameplates - name, HP bar (green/amber/red) + numbers, level, cannons + damage - hidden unless selected / damaged / attacking; golden selection ring with rotating pulsating warm glow (red for hostiles).
- World interplay: storm clouds damage units (6% max HP per pass); ships sink at 0 HP (sunk player dinghy washes ashore again after 8 s); units join the
world_unitsoccupancy group so storm respawns avoid them; ships bob on the displayed wave surface (curvature + storm drawdown included). - QA tooling:
tools/test_vehicles.gd(29 headless checks),tools/ship_viewer.gd(model fit probe), demo args--shipqa[=hostile]and--shotseqburst capture (GIF source on the VM).
Changed
- Spec 16 status + §10: alpha-slice deviations pinned (slower-when-larger roster, vision ranges, markov shore-buffer law) and the next vehicle compositions recorded (dune toboggan =
train-wagon-flat-short+sled-long+ pirate cannon; rotocopter =boat-house-b+ spinning Fantasy-Town windmill, AIR family; submarine later). Spec 22 status notes the temporary alpha home of selection/nameplates and the nameplate visibility law.
Dev console, bow-first sailing, debug navigator (2026-06-11)
Fixed
- Every ship was sailing stern-first: Pirate Kit hulls model the bow at +Z (found via a top-down orientation probe,
tools/ship_viewer.gd --top);VehicleDef.ship()now pinsmodel_yaw = PIso all vehicles point the way they travel. Ships additionally pivot in place toward the course tangent before gaining way - no more sideways departures. Sailing GIF re-captured.
Changed
- The red marble navigator is a debug feature now - no longer spawned at boot. Toggled by the console command
red-dot(or--reddot,--marble=x,y,--cam=follow); it registers/unregisters its fog vision source and minimap pip cleanly. Saves work without it. A fresh game starts with only the dinghy's 8-tile vision - the fog finally plays as designed.
Added
- In-game dev console (
game/components/dev_console/): opens on the key below Esc matched by physical position (tilde on US, ½ on Nordic layouts). Scrolling log, command history,help/clearbuilt in; camera + unit-selection input is gated while open (world keeps running). First commands (journal: docs/journal/2026-06-11-dev-console-and-bow-fix.md): red-dot- toggle the red ball navigator;fow- toggle fog-of-war visibility (saturates/recomputes the one visibility mask, so chunks, units, vehicles, and the minimap mask all follow; on a--fog=offsession it late-builds the fog system);spawn <type> [num]- spawn vehicles at the cursor, snapped to the nearest navigable tile, groups spread over adjacent unoccupied water; barespawnlists all 8 friendly/hostile types.- QA hook
--conrun=cmd;cmddrives console commands through the real submit path for scripted screenshots.
Storyline scripting - YAML stories, quests, saved state (2026-06-11)
Added
- Storyline scripting system (
game/components/storyline/): every*.yamlundergame/storyline/runs as an independent story on new games - nodes ofdoactions (quest pop-ups with title/description/choice buttons, unit spawns under reference ids with positioning, sail orders, despawn, state variables, waits, jumps) plusontriggers (game-time timers, unit sunk/arrived, proximity, state matches). Authored guide: docs/storyline-scripting.md; journal: docs/journal/2026-06-11-storyline-scripting.md. - YAML subset parser (
yaml_lite.gd, dependency-free): block mappings/ sequences, inline- key: valueitems, nested flow[..]/{..}, literal/folded text blocks, typed scalars, line-numbered errors. - Quest UI: parchment pop-up (buttons resolve story branches; "Later" keeps the choice pending) + top-left quest log (✔ done / ❢ pending / • active, click to re-open); pop-ups queue and refresh in place.
- Saves carry the story (save v2): node, action position, remaining waits, trigger timers, pending choices, state vars, quest log, and every story unit's type/name/level/HP/tile - loading resumes scripts exactly; story ships respawn where they sailed. Console gained
story(state dump) andsave [name]; demo args--story=off,--storyqa. - Starter storyline
01-first-voyage.yamlexercising every feature; exports now includestoryline/*.yaml;tools/test_storyline.gd(37 headless checks: parser, runner, JSON round-trip, shipped-story validation).
Factions + naval combat (2026-06-11)
Added
- Faction system (
shared/data/faction_def.gd+factions.gd): slug, full display name (the new faction line on unit nameplates), and type - friendly (green plates), hostile (pirate red), neutral (merchant amber). Defaults:playerHorizon Crew /piratesSalty Scallywags /merchantsFree Traders' Guild. Vehicles carry faction slugs (type picks the hull variant, ring and plate colors); buildings consume the same contract later. Storyline scripts declare factions in afactions:block and assign them per spawn (faction: black_fin) - validated at load, saved with units (docs/storyline-scripting.md §6b). Journal: docs/journal/2026-06-11-factions-naval-combat.md. - Naval combat (
naval_combat.gd, spec 15 alpha slice) for every ship with cannons: pirates attack all other factions (including other pirate factions, to vision range); friendlies answer pirates within firing range; neutrals never initiate. Engaged ships circle their target and fire one cannon ball per cannon per 3 s - base 30% hit, +5% per level, 75% dodge against a hightail-boosted target; balls arc, hits flash, misses splash. - Health statuses: below 45% HP a vehicle is ablaze (flame + smoke plumes, -35% speed until back above 45%); below 35% it goes hightailing it! (+250% speed for 2 s, then it keeps fleeing every enemy in sight and storms until safe); at 0 HP it explodes and is destroyed. Statuses show on the nameplate and stack; charter §16 vehicle fire law amended accordingly (§15 process).
Fixed
- Particle materials built in code rendered the magenta error-checker on llvmpipe when
color_ramp+vertex_color_use_as_albedowere combined - plain alpha albedo ships instead (noted for spec 22's fire VFX).
Pirate crews - red, black, and gold sails (2026-06-11)
Added
- Three pirate factions (always registered): Red Pirates, Black Pirates, Gold Pirates - pirate hulls with sails and flags dyed to their crew color (
FactionDef.sail_color; the kit keeps sails as named child meshes, so the dye lands exactly there). All hostile: rival crews fight each other and everyone else on sight. Journal: docs/journal/2026-06-11-pirate-crews.md. - Console
pirates [num]: spawns a pack (default 4, mixed sloop/brig/ galleon sizes, levels 1-3) of ONE random crew, grouped on adjacent water tiles at the cursor - and drops an intense red pulsing blip on the minimap at the spawn point (newMinimap.add_pingAPI, 10 s fade).
Exit segfault fixed (2026-06-12)
Fixed
- Occasional segfault/wedge when exiting (and a rarer load-time crash) - three expressions of two engine-level races, ~18% of runs under load (journal: docs/journal/2026-06-12-exit-crash.md):
- every quit path now routes through
_quit_clean(): the world is freed while the renderer is fully alive (plus static material caches cleared), and the engine finalizes an empty scene - the teardown race disappears; - the GLB preload warmup no longer fans out over the WorkerThreadPool (~16 concurrent imports segfaulted occasionally and pending requests wedged teardown with infinite "material is null" spam): ONE dedicated loader thread drains the queue sequentially into the resource cache, joined at the end of the load phase. Wall-clock cost: zero (it finishes inside the build window).
- Verified: 24/24 consecutive clean exits after the fix (vs ~18% failure before); both headless suites green.
Missing ocean chunks fixed (2026-06-12)
Fixed
- Ocean tile groups "forgetting to render" (bare seafloor holes beside rendered water): the fog of war showed a chunk only if a sparse sample grid (every 8th tile on water chunks) hit a revealed tile, while the mist parts per-pixel - a ship's small vision circle poking a narrow sliver into a chunk border parted the mist but left the water hidden. Chunk visibility is now EXACT (each chunk scans only its intersection with each vision source's bounding box, early-exit on the first lit tile) - correct for 1-tile slivers and cheaper than the old grid. Water chunk culling AABBs also deepened to the chunk's deepest curvature corner (frustum-edge pop-out hardening). New headless suite tools/test_fog.gd pins the law. Journal: docs/journal/2026-06-12-missing-ocean-chunks.md.
Lost-last-unit crash fixed (2026-06-12)
Fixed
- Crash when the player's last unit died (worst on the release export): clicking while the selection held the freshly freed unit hit
UnitSelection._live_units, whereselection.filter(...)- an UNTYPED Array - was assigned toArray[Vehicle]: a script error that aborts the function and feeds null to its callers. The prune is now an explicit typed rebuild. Also fixed: cannonball splashdown callbacks captured their target Vehicle directly and fired with a freed capture when the target exploded mid-flight - targets now resolve by instance id at splashdown. Verified by a 10×-speed two-crew war with synthesized clicks every frame: zero errors across 26 last-unit deaths (previously 3 script errors + 13 freed-capture errors per soak). Journal: docs/journal/2026-06-12-last-unit-crash.md.
Added
- Debug console commands
kill(destroy selected units) andspeed [0|1|2|5|10](world speed);--clickqaQA arg synthesizing click input on live units during capture runs.
UI - modal pause + Selected-units panel (2026-06-12)
Added
- Pop-up boxes pause the world: quest log entries freeze game time while open and restore the EXACT prior speed setting when dismissed (depth- counted, so queued pop-ups hand off cleanly; stepping +/- under a box queues the new speed for resume; the clock label reads "Paused").
- Selected-units group box (right side): avatar + nameplate rows for the current selection. Same-type-and-faction units bunch - one avatar with a gold ×N badge and a bundled nameplate ("Sloop ×5", combined HP) - max 5 per bunch, overflow starts a new bunch; singles keep their full nameplate (name, HP, level) and faction color strip. Clicking a row re-selects just that unit/bunch and glides the camera to it. Live HP refresh; sunk ships prune. 8 pre-rendered class avatars committed under assets/ui/avatars/. Journal: docs/journal/2026-06-12-ui-pause-and-selection-panel.md.
Pause freezes combat (2026-06-12)
Fixed
- Pausing the world now pauses all combat animations and actions: cannon balls hang mid-air (manually-stepped projectiles on the speed-scaled delta - damage lands at game-time splashdown, and flights now properly scale with 2×/5×/10× speed), explosions, sinking wrecks, impact bursts and the move marker freeze via a world-tween registry, and burning ships' fire/smoke plumes hold. Ambient water bobbing stays live by design. Verified headless (ball makes zero progress through a paused step, then resumes and lands) and visually (paused battle frames 2.4 s apart: identical positions and HP plates). Journal: docs/journal/2026-06-12-pause-freezes-combat.md.
Storyline primer callouts (2026-06-12)
Added
primer:storyline action - a tutorial info box (~18% of the largest viewport dimension; title, description, ✕) that anchors to a UI target: placed on the target's center-facing side within 5% of screen width, fully in frame, with an arched shadowed arrow stretching from the box to 20 px short of the target (re-laid-out per frame - it tracks sailing ships). Targets: registered UI ids (time_panel,minimap,quest_log,selected_unitsvia the new sharedUiTargetsregistry), story unit refs,player, and"$origin"- the unit whose event fired the last trigger (unit_sunk/unit_arrived/near), now recorded by the runner and persisted.primer: {clear: true}removes; the active callout survives saves. Starter story demonstrates both UI and$origintargets; console gainedprimer <target> [title…]. Docs: storyline-scripting.md §primer. Journal: docs/journal/2026-06-12-primer-callouts.md.
Debug tooltips (2026-06-12)
Added
- Console
tooltips [target]- toggles a debug-tooltip overlay: hover any registered UI widget (target id + rect + a readyprimer:snippet), any unit (name, class, faction, HP/level/cannons, tile, order, status, and how scripts address it: story ref / "player" / spawn type), any resource object (type, HP, island,at:position), or any bare tile (coords, terrain,at:position). With a target argument it enables the overlay and warps the mouse there. Journal: docs/journal/2026-06-12-debug-tooltips.md.
Camera - citrus-cove mouse controls (2026-06-12)
Changed
- Right mouse drag is now free-look on BOTH axes (ported from Citrus Cove's OrbitCamera feel): horizontal steers yaw, vertical steers pitch (clamped between near-horizon and overhead); pitch is no longer coupled to zoom (the old zoom-derived angle remains the initial framing only). Middle mouse drag pans (restoring the charter §10 mapping); the Shift+RMB special case is gone. A clean right CLICK still issues unit move orders - only drags steer the camera. Headless input tests cover yaw/pitch steering, both pitch clamps, MMB panning, and the console input gate (vehicles suite: 85 checks).
Hand-off primer - worldgen ocean bed (2026-06-12)
Added
- docs/primers/2026-06-12-worldgen-ocean-bed.md: comprehensive primer for the next session - expanding the landmass to cover the entire map with oceans overlaid at base elevation, producing a navigable ocean bed (varied depth, plants, fish/wildlife, shipwrecks/treasures) for future submarines. Carries the elevation-contract change plan (the -1 "void" sentinel becomes signed seabed depth) with a file-by-file consumer map, the generator's banded-threading laws, an in-repo asset survey for seabed content, rendering/fog integration notes, and every pinned session law (quit paths, preload threading, typed-array/lambda gotchas, pause-aware animation, QA workflow).
Main menu build footer (2026-06-12)
Added
- The main menu shows the build version bottom-left: project version (
config/version, now 0.4.0-alpha), branch@commit, CPU architecture, and when the build was made. Exported builds read abuild_info.jsonbaked into the pack by tools/snapshot-branch.sh at export time ("built 2026-06-12 14:03 UTC"); source runs query git live and read "source run (editor binary)". Graceful "unversioned" fallback.
Worldgen: full-map landmass + navigable ocean bed (2026-06-12)
Journal: docs/journal/2026-06-12-worldgen-ocean-bed.md.
Changed - CONTRACT (charter §15 followed)
WorldData.elevationis now a true signed field (charter §8.3):>= 0dry land,< 0SUBMERGED ocean-bed terrain in half-steps below sea level (-8..-1, cap-top Y = value × 0.5 for every tile). The old-1= "ocean, no terrain" sentinel is gone - terrain covers the entire map.is_ocean()keeps its< 0test but means "submerged terrain"; inland lakes/rivers sit at exactly-1withisland_id >= 0. New helpersterrain_top_y()/depth_half_steps(); new layerWorldData.seabed_props. All specs that restate the contract amended (01, 05, 06, 07, 08, 11, 12, 15, 16, 17, 19, 21, ROADMAP).worldhashchanged for every seed - intended; same-seed determinism re-verified across runs and banded vs sequential.
Added
- Seabed depth field (spec 05 §4.4c): banded continental-shelf falloff (water within 2 tiles of land stays ≥ -2) + open-water relief. Two strategies bake-offed with screenshots: A "Shelf & Basins" vs B "Shelf & Trenches" - B pinned default (real deep volume: trenches to -8 for subs/treasure). Seabed surfaces by depth band (SAND/DIRT/ROCK).
- The bed renders (spec 07): hex caps + stacked-disc columns at negative Y under depth-banded underwater grades (sunlit golden shallows → slate deeps); coast columns descend to the real seabed; seabed chunks fog-hide like land; the water system's flat seafloor quads are DELETED in-map (margin keeps a deep horizon floor). Water depth read ships as a transparency gradient (glass-clear lagoon shallows → dense blue deeps) after two albedo-tint variants washed out grey - captures of all variants in
docs/screenshots/2026-06-12-ocean-bed-*.png. - Seabed content: kelp (tall teal-tinted tufts), corals (mushroom stand-ins), bed rocks, shipwrecks whose masts break the surface (dive sites you can spot from deck), and 1-2 deep-sea treasure chests at depth ≤ -5. New ambient wildlife component (
components/wildlife/): seeded fish schools cruising above the bed, pause-aware and fog-aware. GIF:docs/captures/2026-06-12-ocean-bed-fish.gif. - SubNav (spec 16 §10 groundwork): depth-aware 6-neighbor AStar2D over submerged tiles (shallow water weighted ×3.0/×1.8 - submerged subs prefer hiding depth ≥ 3) +
bed_y/cruise_y/depth_half_stepsqueries. - New headless suite
tools/test_worldgen.gd(28 checks) + asset probetools/measure_bed_assets.gd; minimap sea now depth-shaded; tooltips describe bed depth; demo QA args--bed=,--watertint=,--fish=off.
Performance
- HUGE generation 4.95 s (seabed pass 552 ms, banded) - within the ~5 s budget; MEDIUM full boot 2.1 s total (terrain pass grew: every ocean tile now carries caps/columns). All suites green: vehicles 88, storyline 52, fog 6, worldgen 28.
Sea life, sea monsters, depth visibility, object ids (2026-06-12)
Journal: docs/journal/2026-06-12-sea-life-and-depth-visibility.md.
Changed
- Shipwrecks rescaled to the live fleet (0.26-0.32 vs ships' 0.20-0.25 - the 10.6-unit kit hull rendered 4× too big before).
- Fish are destructible vehicles now (
FishVehicle extends Vehicle; the ambient FishSystem component is gone): full HP/statuses/nameplates, dive cycles below the surface with occasional rises, spawn in oceans AND lakes, and respawn tree-style (25-55 s). Factionmother_earth("Mother Earth", neutral). HP scales with size: Sprat 15, Sunfish 45, Giant Grouper 100, Silver Stream 100 (six hulls swimming as one unit). - Facing law pinned (charter §16): every moving unit points its nose along its course or target; every new moving model gets a ship_viewer orientation probe + headless test (Cube Pets face +Z, Survival fish +X).
Added
- Sea monsters - faction
sea_monsters("Sea Monsters", hostile to all): Leviathan 450 HP, Sea Serpent 400, Royal Reef Crab 350. Pirate-style hunt/circle/attack AI; they spawn ONLY via storyline scripts or the console (leviathan,sea-serpent,reef-crab) and stay sunk. Crews never waste shot on neutral fish; monsters eat everything. - Depth visibility (spec 16 stat
depth_vision_tiles: ships 1/2/3/4, monsters 8): submerged creatures are fully invisible to vehicles whose depth vision falls short (targeting + threat AI), and a new murk veil (components/murk/) hides the deep bed and its sunken objects visually - lagoons stay glass-clear - parting around friendly units, with revealed objects glowing light-green neon while covered. - Stable object ids: every placement (nodes, decor, seabed props, wrecks, sunken treasure) carries a UUID4-style id, deterministic per world seed; storyline scripts target placements as
{obj: "<id>"}; tooltips show ids. - Cube Pets kit synced (
pets/); external-texture import pitfall documented (kits withTextures/colormap.pngimport white without it).
QA
- Suites: vehicles 108, storyline 61, fog+murk 12, worldgen 30 - all green; worldhash stable; HUGE gen 5.4 s (~budget). Captures:
docs/captures/2026-06-12-sea-life.gif(serpent hunting sprats) + murk veil / reveal-glow / monsters / wreck-scale screenshots.
Land tile borders + fish texture audit (2026-06-12)
Added
- Land hex tile borders: every above-sea-level cap wears a thin hex outline in a muted warm taupe with a soft shadow fading inward - tiles read individually like a board game; ocean/seabed tiles are exempt. One vertex-colored ring mesh, one MultiMesh per chunk, curvature-correct, fog-hidden with its chunk. (~100 ms extra on a MEDIUM build.)
Verified
- All fish/creature textures render properly end-to-end (pets clownfish, green caterpillar serpent, red crab, vivid-orange survival fish; the Leviathan's blue-grey is its deliberate monster-skin dye) - no fish types needed removal after the external-colormap import fix.
Load-game sub-menu, save thumbnails, F5/F9 quicksave (2026-06-12)
Added
- Load Game sub-menu (shared by the main menu and a new pause-menu page, replacing the inline pause-menu load buttons): savegames ordered by save date (newest first), each row with a thumbnail screenshot, slot name, save date, and world facts; parchment placeholder for old saves.
- Save thumbnails: every save grabs a UI-free viewport shot (all CanvasLayers hidden for one frame), stored as a 320×180 PNG beside the save JSON. Saves carry
saved_at/saved_at_unixmetadata now. - F5 quicksave (overwrites the single
quicksaveslot) and F9 quickload (quicksave, else the newest save) with fading toast feedback; key hints in the pause menu. - New headless suite
tools/test_session.gd(date ordering, thumbnails, quicksave/quickload laws).
Full game-state saves - v3 (2026-06-12)
Added
- Savegames now capture the entire game state, not just the map seed: the live fleet (ships, fish, sea monsters - class/faction/name/level/HP/ tile/autonomy, statuses re-derive from HP), resource-node runtime deltas keyed by stable UUID ids (storm damage, respawn moves, deaths - dead nodes re-enter the respawn cycle), the game clock, and the camera. Quests and story-owned units were already saved via the storyline state. v2 saves still load. Demo arg
--load=<slot>; fleet round-trip + payload tests.
Characters: Oloaf, The Acorn, berry workers (2026-06-12)
Added
- Characters (spec 11 alpha): UNIQUE characters (named, can never die - Oloaf the upright toast slice, flat-down/arch-up; The Acorn at a quarter his height under a tiny red baseball cap) and WORKER characters modeled as glossy bright berries/fruits (6 Food-Kit models). Both faction-bound, default the player's. Console
dropberryspawns a worker at the cursor. - Vehicle boarding: characters board own-faction vehicles and ride the deck under the vehicle's movement rules; E evacuates the selected vehicle's passengers (camera rotate-right rebound E → R). A character in water with no vehicle swims to the nearest shoreline and crawls ashore.
- Storyline
spawn_character:action; the starter story now spawns Oloaf and The Acorn aboard the dingy. Characters ride the v3 save envelope and re-board on load. New suitetools/test_characters.gd(27 checks).
Characters: land-only walking, command parity, Oloaf fix (2026-06-12)
Changed
- Oloaf stands properly now: the toast's completely flat cut edge points down, crust arch up (the model needed a roll, not a pitch - caught with a new generic
model_viewerprobe).
Added
- Characters walk ONLY on land (new
LandNav, threaded A* under the walkability law). Clicks on open water are refused - any other route needs a vehicle; the castaway swim remains the recovery rule. - Characters select and command exactly like vehicles: click/marquee with golden rings, right-click move orders with bell + golden cross - and right-clicking a friendly vehicle walks them over and climbs them aboard.
E is the boarding toggle (2026-06-12)
Changed
- E now boards as well as evacuates: with characters selected next to a vehicle of their own faction, E climbs them onto the CLOSEST one; with vehicles selected, E evacuates the passengers (as before). Other factions' hulls never count, swimmers and already-boarded characters are skipped.
Character nameplates (2026-06-12)
Added
- Characters carry the same nameplates as vehicles - name, faction line, HP bar + numbers, level, status ("swimming ashore!") - shown under the same visibility law and driven through a new shared
UnitNameplate.update_rigwrapper (one source for the hover/billboard mechanics, used by both kinds). Citizens get HP pools (heroes 100, workers 40) per the charter fire law - they still never die; boarded characters stow their plates.
0.5.0-alpha (2026-06-12)
Version bump rolling up the whole 2026-06-12 arc (ocean bed → sea life → depth visibility → land tile borders → load menu + full-state saves → characters) - merged to main. Individual entries above; journals: docs/journal/2026-06-12-worldgen-ocean-bed.md and docs/journal/2026-06-12-sea-life-and-depth-visibility.md (7 addenda).
Storm tuning - rarity, land decay, fluffier clouds (2026-06-12)
Changed
- Storms are rarer: spawn gaps stretched from 18-45 s to 50-110 s (first storm no earlier than ~20 s), and the per-weather cap dropped to MILD 1 / NORMAL 2 / EXTREME 3 (was 2/3/4).
- Storms weaken over land: clouds over dry land deal ×0.35 damage (resources and units; full punch at sea - lakes/rivers count as water), and every cloud-second spent over land accelerates the storm's aging (
decay_accel = 1 + land_time × 0.35) - age integrates quadratically, so a storm that wanders inland burns itself out fast while sea storms live their full 35-80 s. Spec 16's alpha-slice damage law amended in place. - Fluffier, fuller clouds: each cumulus is now four strata of 21 overlapping round lobes (was 12 flatter puffs in 3 layers) ringed around the cluster axis with a dark-base→bright-crown ramp that fakes ambient occlusion; lobes are rounder (height 0.8 of a full sphere before the per-stratum squash) and low-poly (24×12 segments, ~1/8 the default verts - the extra lobes render cheaper than the old spheres).
- Even cloud spread in 1-2 outer-ring layers: the whole population sits on the outer band at even angular spacing with light jitter - one ring on small storms, two staggered (brickwork) layers on storms with ≥ 14 clouds (second layer tucked to ring ×0.76-0.82, slightly higher and 12% smaller); the old random inner-cloud scatter is gone (the volumetric mist still fills the interior). Population now one cloud per ~3.5 tiles of circumference.
Added
tools/test_storms.gd- 23 headless checks pinning the rarity caps, the land/water classification, the land-decay and damage-mult laws (pure + integration: a forced land storm ages faster than the clock, a sea storm exactly 1:1), the outer-band/even-spacing cloud layout, and lobe counts.--weather=mild|normal|extremedemo arg (worldgen weather was previously unreachable from the CLI; QA for big EXTREME storms needs it).