Back to Devlog
    v0.3.0
    EngineDecember 28, 2025Release notes

    Before the Guns, There Were Pots

    The engine's earliest public release, back when it was being built to grow plants rather than to fight. Harvest indicators, instant pot placement, and better console help.

    An Honest Origin

    This engine did not begin as an arena shooter. The early releases are about plants.

    Not decorative foliage — a growth pipeline with stages, a BuildableSystem, pots as placeable objects, harvest indicators, and a water prompt UI that watched for events. v0.1.0 shipped map transitions, camera state persistence and world indicator scoping. v0.2.0 added a UI scaling system and a generic HUD framework.

    Then v0.7.0 loaded textures out of Quake and Warsow PK3 archives, and the trajectory bent hard. By v0.8.0 the engine was loading BSP maps, and the plants were gone.

    We are not quietly editing that out of the archive. The tools that made a shooter — PK3 indexing, the shader system, map-scoped indicators, a buildable-object system that would much later turn into moving platforms — mostly arrived while the engine still thought it was a gardening game.

    Fixes In This Release

    A small release by later standards, and still recognisably the same codebase:

    • Harvest indicator never appeared. The ready_to_harvest condition was

    hardcoded false.

    • Pot action indicator never showed. BuildingSystem.currentMapId was never

    set, so every map ID mismatched.

    • Water prompt UI was deaf. Event names disagreed between PlantSystem and

    WaterPromptUI.

    • Instant builds emitted nothing. A buildTime: 0 pot placed fine and

    then never fired its complete event, so the indicator it was waiting for never cleared.

    • `BUILDABLE_ITEMS` was empty, courtesy of a circular dependency. A

    satisfying one.

    Better Console Help

    Commands now sort alphabetically within categories, group themselves into System, Debug, Game and Other, print in colour, and put usage tips in the footer.

    The implementation note is that formatMessage() detects pre-formatted HTML and skips escaping it. This is also the release that started converting \n into <br>, which is a sentence that would not mean anything to anyone reading it now, and rather a lot to anyone who was there.