No description
  • GDScript 92.5%
  • GDShader 5%
  • Shell 1.8%
  • Nix 0.7%
Find a file
Daniel Flanagan b099286923 build: add a flake dev shell; stop hand-managing export templates
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.
2026-08-14 11:58:37 -05:00
addons/godotsteam feat: optional Steam multiplayer via GodotSteam (lobbies + invites) 2026-07-19 21:11:25 -05:00
assets feat: vendor Kenney Space Kit GLB subset (CC0) for the 3D visual layer 2026-07-20 14:11:26 -05:00
dist docs: itch description as paste-ready HTML 2026-07-28 16:54:34 -05:00
docs docs: record the $3 paid + open-source position across store copy 2026-07-28 16:52:58 -05:00
game fix(splash): sparks launch, arc, and burn hot 2026-08-14 11:54:36 -05:00
mods feat!: wave timing rules are now plain seconds, not multipliers 2026-07-20 12:38:31 -05:00
promo fix: promo art — rebuild the ship's wing the dock prompt was covering 2026-07-28 16:38:37 -05:00
proto3d_shots docs: backdrop-pass screenshots — painterly planets + domain-warped nebula 2026-07-20 23:13:01 -05:00
scripts build: add a flake dev shell; stop hand-managing export templates 2026-08-14 11:58:37 -05:00
.envrc build: add a flake dev shell; stop hand-managing export templates 2026-08-14 11:58:37 -05:00
.gitignore build: add a flake dev shell; stop hand-managing export templates 2026-08-14 11:58:37 -05:00
CHANGELOG.md feat!: the name is NO CRATERS ALLOWED 2026-07-20 08:55:38 -05:00
CONTRIBUTING.md feat!: mods are a load point — in-repo mods with toggles; game ships as mods 2026-07-20 11:16:46 -05:00
default_bus_layout.tres balance: longer build phases — 90s before wave 1, 40-50s after 2026-07-18 16:28:10 -05:00
export_presets.cfg fix!: user-facing binary renamed no-craters-allowed; versions are datetimes; exports can't silently fail 2026-07-20 13:01:27 -05:00
flake.lock build: add a flake dev shell; stop hand-managing export templates 2026-08-14 11:58:37 -05:00
flake.nix build: add a flake dev shell; stop hand-managing export templates 2026-08-14 11:58:37 -05:00
LICENSE chore: license the code under GPLv3 2026-07-20 01:09:36 -05:00
MODDING.md feat!: mods are a load point — in-repo mods with toggles; game ships as mods 2026-07-20 11:16:46 -05:00
project.godot build: add a flake dev shell; stop hand-managing export templates 2026-08-14 11:58:37 -05:00
readme.md feat: zero-g flight — drift, brake, auto-brake; zero-g splash particles 2026-07-20 09:30:31 -05:00

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 --nosteam or ASTEROID_BASE_NOSTEAM=1. (Currently runs under Valve's test AppID 480 until the Steamworks account exists — see game/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 13. 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 13
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.

  1. 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.
  2. Wave phase — asteroids drift in from the field's edge. Shoot them, split them, hoover up the scrap. Don't let the core shatter.
  3. 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.