- GDScript 92.5%
- GDShader 5%
- Shell 1.8%
- Nix 0.7%
Answers "do we really not have a nix flake for this?" -- correct, there was none, on a machine where everything else is nix. Every build went through an ad-hoc `nix shell nixpkgs#godot_4`, so the engine version was whatever the system registry happened to resolve to that day. That is the root cause of the export-template incident, not bad luck. The templates lived at a hand-made symlink into /nix/store that was not a gc root, so nix-collect-garbage silently broke it -- and it was broken AGAIN when I looked today. My first attempt at a fix was another hand-made symlink with an --out-link gc root, which Daniel correctly called out as the same hack with extra steps. The dev shell is the right level: the templates are a declared, pinned dependency and the shell hook links the pinned store path into the one location Godot will look (it cannot be pointed elsewhere by flag or env). Pinned deliberately to the nixpkgs rev carrying Godot 4.6.3, NOT nixos-unstable -- which is already on 4.7.1. Discovered by entering the shell and reading `godot4 --version`: an unpinned flake would have silently upgraded the engine under a polish pass. An engine bump is its own change with its own testing. Also: the version directory name is derived via replaceStrings from the package (nixpkgs says "4.6.3-stable", Godot wants "4.6.3.stable") so a future bump cannot leave the two disagreeing. steamcmd is deliberately excluded -- it is unfree, and only the release operator runs it; push-steam.sh fetches it on demand rather than forcing every contributor to configure allowUnfree. require_export_templates now points at `nix develop` instead of reciting ln commands. Verified: `nix develop` provisions godot 4.6.3 + templates from scratch (both were deleted first), and export-linux.sh inside the shell produced a fresh 86MB binary. Next: godot-branding is consumable as a flake input, which is how deck-slice takes it. This repo still carries a hand-copied fork of that addon; wiring it up as an input is the natural follow-up. |
||
|---|---|---|
| addons/godotsteam | ||
| assets | ||
| dist | ||
| docs | ||
| game | ||
| mods | ||
| promo | ||
| proto3d_shots | ||
| scripts | ||
| .envrc | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| default_bus_layout.tres | ||
| export_presets.cfg | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| MODDING.md | ||
| project.godot | ||
| readme.md | ||
No Craters Allowed
(previously "Asteroid Base" / "Astro Bastion"; renamed July 2026 — the clearance sweep graded this name clean across trademarks, storefronts, and search. See docs/launch-plan.md.)
Build a bastion in the core of a very strange world — solo, split-screen, or networked. A multiplayer 2D base-defense game. TowerFall-style frenetic combat plus a tower-defense build loop. Between meteor waves, players explore the less-volatile portions of the debris field and other ruined ships and stations for tech and resources, then return to fortify and (lightly) automate the base. Players pilot drone space ships and upgrade over time. They also must manage a base and its defenses.
Geared at young families looking for a fun game to play together that is intuitive but allows for learning coordination. Minimal violence, just defending from various meteors and maybe the occasional strange alien creature. (Yes, "meteors" is astronomically wrong for rocks in space — it's the word every kid at the couch reaches for, so it's the word the game uses.)
License
The game's code is GPLv3 (see LICENSE) — free to study, mod, and redistribute under the same terms. Assets keep their own licenses (Kenney art/sfx and Junkala music are CC0; fonts are SIL OFL; GodotSteam is MIT) — see assets/CREDITS.md. The commercial Steam/itch builds are the same code: you're paying for convenience, updates, and multiplayer matchmaking, not a different game.
Playing
Open the project in Godot 4.6+ and press F5, or run
godot . from the project directory. Pass --skip-intro to jump straight
to the menu (any input during the studio intro also skips it).
- Play — opens the mission-setup lobby: pilots claim controllers (the first pad attaches to P1 — Deck-friendly if you tapped Play on the touch screen), pick ship colors (X / F) and starter weapons (Y / E), and dial in match rules (difficulty, core health, rock damage, upgrade prices, mutations). Rule tweaks can be saved as named rulesets ("Save…" next to the presets) and reloaded, edited, or deleted any time. Up to three more pilots can still drop in anytime mid-game with A/Start on an unclaimed controller; leave with Back/Select.
- Continue — local runs autosave at the start of every build phase (rules included); the menu offers to resume. A shattered core ends the run and clears the save.
- Multiplayer (LAN) — one home hosts on port
24565, everyone else joins with the host's address; friends can join mid-game. - Multiplayer (Steam) — when the Steam client is running, the
multiplayer menu also offers Host for Steam friends: it creates a
friends-only Steam lobby, friends join through the overlay invite or
their friends list, no port-forwarding or addresses needed. Steam support
is fully optional — without Steam the game silently sticks to LAN.
Disable it explicitly with
--nosteamorASTEROID_BASE_NOSTEAM=1. (Currently runs under Valve's test AppID 480 until the Steamworks account exists — seegame/autoload/steam_bridge.gd.)
The in-game button hints show the right glyphs for whatever controller is plugged in (Xbox, PlayStation, or Switch).
Controls
Five verbs everywhere: fly, aim+fire, build, interact, pause. In the build ghost and at the dock, interact switches the selection and fire confirms — no extra hotkeys to learn (the dock list also walks with up/down). The keyboard pilot can also quick-pick hotbar slots with 1–3. The build key closes whichever menu it opened.
P1 flies with keyboard+mouse; every other pilot brings a controller.
| Action | Keyboard+mouse (P1) | Gamepad |
|---|---|---|
| Fly | WASD | Left stick / D-pad |
| Brake (hold) | Ctrl | B |
| Afterburner (hold) | Shift | Left trigger |
| Aim | Mouse | Right stick (or nose) |
| Fire / confirm | Left click / Space | A |
| Build mode (open/close) | E | Y |
| Interact / switch selection | F | X |
| Hotbar quick-pick | 1–3 | — |
| Join / Leave | — | A / Back |
| Pause / menu | Esc | Start |
The loop
Three weapons, switchable anytime (numbers 1-3, or interact in open space): the rapid Pulse Cannon, the instant-hit Beam Laser (harder punch, slower cycle), and the slow Rocket — the skill shot: land it clean and even a big rock pops in one.
- Build phase — spend scrap on turrets, collectors, and barriers around the core. Fly out to mine rock clusters for scrap and blast the sturdy ruined stations apart for tech.
- Wave phase — asteroids drift in from the field's edge. Shoot them, split them, hoover up the scrap. Don't let the core shatter.
- Dock at the core (interact next to it) to buy ship upgrades with tech, or repair the core with scrap.
Drones have Halo-style defenses: shields soak hits and recharge quickly after a calm moment, but hull damage sticks until you dock and pay scrap to patch it. Lose all hull and the drone is down — it doesn't respawn; a buddy has to fly over and hold interact to rebuild it (costs team scrap, and the hull comes back barely holding together). If the whole squad is down, the core performs a free emergency rebuild after a few tense seconds.
A gentle on-screen guide (arrows + one-line tips) nudges young pilots toward whatever the team needs next: mine when broke, build when rich, rescue when a drone is down. The first waves are gentle; after wave 8 the field gets endlessly angrier.
Modding
The whole game is data-driven and meant to be remixed in the Godot editor —
waves, asteroids, buildings, upgrades, and ships are all .tres resources under
game/data/. See docs/MODDING.md.
Assets
All art and audio are CC0 by Kenney — see assets/CREDITS.md.