- GDScript 99.6%
- GDShader 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Deploy Web Build / Export Web & publish (push) Successful in 3m1s
|
||
| .forgejo/workflows | ||
| docs | ||
| scenes | ||
| scripts | ||
| shaders | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| export_presets.cfg | ||
| icon.svg | ||
| icon.svg.import | ||
| project.godot | ||
| README.md | ||
Atomic Derelict
A retro-futurist sci-fi roguelike for Godot 4.7 (Forward+, 3D). You are a salvager aboard a silent 1960s-style space station. Fight down five decks, keep your oxygen and stomach topped up, trade with survivors, craft gear, and piece together what went wrong before you face whoever — or whatever — is responsible.
Every asset is generated at runtime from code: meshes are assembled from primitives,
textures are painted into Images, sound effects are synthesized, and the story is
procedurally assembled per run.
The soundtrack (scripts/autoload/music_gen.gd) is rendered fresh each session as a
set of dark-industrial sections — a theremin lament, heartbeat dread, a driving
phrygian pulse, a distorted dirge, rusted-pipe machinery and a dying radio
transmission — all in minor-family modes, run through tape wow, saturation, hiss and
crackle. Sections are sequenced in a shifting order, leaning heavy during boss fights.
Running
Open the folder in Godot 4.7 and press Play, or:
godot --path . # play
godot --path . -- --seed=12345 # jump straight into a specific run
godot --path . -- --deck=4 # dev: start on deck 4 with a dev loadout (add --seed=N to pick the run)
In debug builds (running from the editor, or a debug export) the title screen and pause menu also have DEV: JUMP TO DECK. From the title it starts a run on any deck with a chosen or rerolled seed, previewing that seed's station, catastrophe and deck names. From the pause menu it moves the current run to another deck, keeping its seed and inventory. The optional dev loadout grants weapons, upgrades, armor and supplies roughly matching the deck. Release exports hide the menu.
Controls
| Action | Keyboard + mouse | Gamepad |
|---|---|---|
| Move | W A S D | Left stick |
| Aim | Mouse / arrow keys | Right stick (auto-assist) |
| Fire ranged | Left click / J | Right trigger |
| Melee / parry | Right click / K | X or RB |
| Dash | Space / Shift | B or Left trigger |
| Interact / talk | E / Enter | A |
| Swap ranged | Q / mouse wheel | Y |
| Grenade | G / L | LB |
| Medkit / O2 / Eat | 1 / 2 / 3 | D-pad Up / Left / Right |
| Inventory & craft | Tab / I | Back / Select |
| Pause | Esc / P | Start |
| Menu tabs | Q / E | LB / RB |
With no aim input the game locks onto the nearest visible threat, so it is fully playable with only WASD + J/K or only a gamepad's left stick and buttons.
Hits, explosions and recoil rumble the gamepad, or the phone itself on Android
(scripts/autoload/haptics.gd). Toggle it under Vibration in the pause menu;
the choice is saved to user://settings.cfg.
How a run works
- Story (
scripts/story/story_gen.gd): each seed picks a catastrophe (rogue AI, alien bloom, mutiny, dimensional rift), a station, a corporation, an antagonist, a cast of five crew with fixed roles, one of them a secret accomplice, and a personal hook for the player. Ten chronological terminal logs (two per deck), four survivor NPCs, the enemy roster on each deck, the final boss and the ending are all drawn from that same cast, so the clues line up. - Decks: five procedurally generated levels (
scripts/world/level_gen.gd). Each deck's warden (a gold-haloed elite) carries the keycard for the lift. The final deck holds the boss and the escape pod, which needs the artifact the boss guards. - Survival: oxygen and nutrition drain constantly; hull-breach rooms drain O2 4x faster. Refill from canisters, wall stations, food and traders.
- Hazards: ruptured coolant lines sputter, then vent scalding steam (dash through or wait it out); electrical fires burn anything standing in them; and sparking wall panels shock whoever is close. Enemies get hurt too — lure them in. Chemical drums explode when shot, struck or caught in a blast, setting off any drums nearby; the blast hurts everyone, bosses and you included.
- Combat: 6 ranged and 4 melee weapons, grenades, dash with i-frames, and melee parry (swinging knocks enemy bolts back). 13 enemy types plus 4 bosses, each with its own behaviour (chasers, chargers, kiters, turrets, exploders, teleporters, mortar lobbers, shielded bots, summoners, O2-draining leeches).
- Crafting: field recipes anywhere (medkits, O2, ammo, grenades); workbench recipes for weapons, armor, suit upgrades and weapon overclocking.
- Trading: survivors on decks 1–4 sell supplies and the occasional weapon.
Layout
scripts/autoload/ game.gd (run state, inventory, input map), sfx.gd (synth audio)
scripts/data/ items.gd (items, weapons, recipes), enemy_defs.gd
scripts/story/ story_gen.gd
scripts/art/ art.gd (textures, themes), models.gd (procedural models)
scripts/world/ level.gd, level_gen.gd, decay.gd (grime, debris, failing lights), camera_rig.gd, fx.gd, interactables
scripts/actors/ player.gd, enemy.gd, projectile.gd
scripts/ui/ HUD, minimap, menus (title, inventory, dialogue, trade, ...)
scripts/debug/ dev harnesses (see below)
shaders/crt.gdshader CRT scanline/vignette post effect
Dev harnesses
Launched via user args after --; each writes screenshots into the given directory.
--autotest=<dir>: tours title, intro, combat, inventory, dialogue, trade, terminal, each deck, game over.--playtest=<dir>: bot fights deck 1 with auto-aim, then verifies keycard → lift and boss → artifact → escape pod.--probe=<dir>: renders lineups of every enemy, boss, prop and weapon model.--closeup=<dir>: low-angle close-ups of wall damage and level dressing.--screenshot=<dir>: stages a mid-fight moment (fullscreen, letterboxed to 16:9) and saves a 1600×900 shot; takes--seed=Nand--deck=N.docs/screenshot.jpgis--seed=31 --deck=4.--music=<dir>: run headless; renders one of each soundtrack section to WAV with timing and level stats.--flashlight=<dir>: clears a room of enemies and shoots the flashlight aimed in each direction; takes--seed=Nand--deck=N.--hazards=x: run headless; checks steam, fire and shock damage, the safe zones, dash immunity and death cause.--barrels=x: run headless; checks drums explode from shots, melee, enemy fire and chained blasts, and the damage they deal.--devjump=<dir>: drives the dev Jump-to-Deck menu from the title and the pause menu and checks the result.--stress=x: run headless; exercises every weapon, enemy, boss, recipe and trade path.
