Gather is a compact single-scene Godot 4.7 game focused on gathering, crafting, and survival. It combines a simple item-driven gather loop with resource nodes, enemies, crafting stations, and a built-in self-test harness for reliable development.
Place a bone turret, catch a skeleton in the net, drop the skull into the turret — then let a bank of them hold the line. (mp4)
Lay out a chest and two worker bases, drop a captured skull into each, and the skeletons fell a tree and break a rock while you watch — then open the chest and the haul is in it. (mp4)
A ten-minute day runs from afternoon to dusk, the lantern comes up, a storm rolls in off the sea, and lightning walks in from the horizon before dawn breaks. The sea dims with the land — they are separate canvases, so keeping them in step is deliberate. (mp4)
Rarely, a bolt lands on a skeleton and what gets up is blue. Net it — killing one is a loss — and its skull upgrades a machine: the charged turret on the right is clearing its lane while the ordinary one beside it is still working through its own. (mp4)
From the third night, the dark comes to you. A horn, a banner counting down, and a wave that walks in out of the black at whatever you have built — which is the night the walls and the turrets stop being decoration. Clear it before dawn and it pays. (mp4)
Nothing else in the game asks you for anything. The board does: a handful of jobs with live progress, so there is always something specific worth going and doing. Finish one and hand it in for coins and xp. (mp4)
Buying land far enough gets you to the boss island, and the elite standing on it is the last fight in the game. Kill it and the run stops and totals itself up — days survived, levels, land, raids cleared, everything the hours came to. (mp4)
- Resource gathering with tool-based timing and bonus yields
- Crafting stations, recipes, and player progression
- Enemies, waves, and pickup/vacuum systems
- Save/load support using a
SaveLoadgroup and JSON persistence - Built-in Godot self-test harness for linting, unit tests, and runtime validation
- Beads issue tracking support via
.beads
All files and folders use snake_case; PascalCase is reserved for class_name
declarations and node names.
main.tscn/main.gd— core scene, world generation, tile writes, and save formatplayer/— player node, manager, and reach;player/states/holds the player state machineenemies/— enemy scenes and wave spawning;enemies/states/holds the enemy state machineitems/— item and resource definitions, the sharedTypes.Itemenum, pickupsinventory/— inventory data, hotbar, and slot systemscrafting/— crafting recipes, stations, and UIturrets/— turret and projectile logicworld/— camera, resource gathering and spawning, plusresource_nodes/,tile_scenes/, andvfx/systems/— input, health, save/load, sound, level-up, and collision helpersui/— HUD elements such as the gather progress bar and floating damage numbersassets/—art/,audio/,tilesets/,materials/, andshaders/tools/— lint and test runner scripts, pluscapture_clip.py(records the README clips)test/unit/— headless unit testsdevtools_ext/— project-specific DevTools commandsaddons/godot_selftest/— test harness implementation
- Godot Engine 4.7.x
- No external package manager required
- Open the project in Godot:
"GODOT_PATH" --path . --mute
- After adding or changing
class_namescripts, run the import step:"GODOT_PATH" --headless --path . --import
Launch the game:
"GODOT_PATH" --path . --muteRun project linting:
"GODOT_PATH" --headless --path . --script res://tools/lint_project.gdRun unit tests:
"GODOT_PATH" --headless --path . --script res://tools/run_tests.gd- Use
bdfor issue tracking and work management - Keep
project.godotandclass_nameimports up to date - Use
tools/devtools.pyand the DevTools bridge for automated runtime validation
The Web build is published to https://severalherr.itch.io/gather.
- Trigger: every push to
mainruns.github/workflows/deploy-to-itchio.yml. The workflow can also be started by hand from the Actions tab (workflow_dispatch). - What it does: downloads Godot 4.7-stable and its export templates, imports
the project (the
.godot/cache is gitignored, so it must be rebuilt in CI), exports theWebpreset tobin/index.html, and pushesbin/to itch.io with butler asseveralherr/gather:html5. - Export preset:
Web(preset.1inexport_presets.cfg). It is configured withvariant/thread_support=falsebecause itch.io serves pages without cross-origin isolation headers, soSharedArrayBufferis unavailable. bin/stays gitignored — CI builds it fresh on every run.
A repository secret named BUTLER_API_KEY must exist
(Settings → Secrets and variables → Actions). Generate the key at
https://itch.io/user/settings/api-keys. The itch.io project page must also exist
at severalherr/gather; the html5 channel is created automatically by the
first successful butler push, and the uploaded build should be marked as
"This file will be played in the browser" on the itch.io project page.







