DenverVsTheUniverse

Denver Vs The Universe

A roguelike take on Space Invaders, staged as a home-made diorama on a long table under hanging lamps. A few large alien action figures descend on Denver at a time; you run a toy F-15 robot along a street cut through the plywood city and, between waves, pick one of three cards: city defenses, robot upgrades or new abilities. DESIGN.md says what the game is meant to be and look like. The run ends when the robot runs out of hearts or half the city’s health is gone.

Godot 4.7, GL Compatibility, built for the web (the Scareathon arcade) and phones. Everything is made in code: main.tscn is one node with scripts/main.gd on it.

How it is put together

Playing

Layout

File What it is
scripts/main.gd The referee: states, wave/card loop, and what every hit does
scripts/diorama.gd The set and the camera that fits the play box to any window shape
scripts/cutout.gd Cutout: a paper cut-out quad. Nearly everything on screen is one
scripts/city.gd The three-district city, building health and crumbling
scripts/swarm.gd, alien.gd Squads per district, the march, and each alien kind’s behaviour
scripts/shots.gd Everything in flight and what it collides with
scripts/tank.gd The player robot: stats, refit tiers (CHASSIS), rockets, drones, A.T. field
scripts/figure.gd Loads a figure model from models/ and handles its flash, tint and limb swing
scripts/defenses.gd Flak, Blucifer, dome, missile battery, Tesla spire, hail, bear crew, decoy cow, UFO watchtower
scripts/upgrades.gd The card list and how three are dealt
scripts/hud.gd, fx.gd, sfx.gd Interface, effects, synthesized sound (no audio files)
shaders/cutout.gdshader The paper edge, hit flash and roof-down damage
art/*.svg All the art. Each file keeps a 10 px clear margin for the paper edge

The fight is 2D on the z = 0 plane (x from -8 to 8, ground at y = 0); depth is only for looks. A tall window gets a taller sky (Diorama.play_top) and the aliens start higher and step down further to match.

Adding a card: add an entry to Upgrades.LIST, then read its level in Tank.apply or Defenses.sync/update. Adding an alien: add it to Alien.TYPES, draw art/alien_<name>.svg, and place it in Swarm._row_kinds. New SVGs need mipmaps/generate=true in their .import file.

Tests

godot --headless --path . -s tests/smoke.gd -- --runs=4     # autopilot plays whole runs, fast-forwarded
godot --path . -s tests/shots.gd -- --shots=<dir> [--portrait]   # screenshots of each screen
godot --path . -s tests/shots.gd -- --shots=<dir> --lineup       # every alien figure close up, one shot per invasion
godot --path . -s tests/shots.gd -- --shots=<dir> --invasions    # a late wave of each invasion
godot --path . -s tests/shots.gd -- --shots=<dir> --idle         # the robot standing still, frame by frame
godot --headless --path . -s tests/roads.gd                   # walks the street graph the way the joystick does

Web build

godot --headless --path . --export-release Web build/index.html

On game over the game posts { type: 'PLAYER_DIED', score } to the parent page for the arcade leaderboard.

Font: Jost (SIL Open Font License, see fonts/Jost-OFL.txt).