Celilo Blast — a side-scrolling R-Type shoot-'em-up using Celilo circuitry artwork for the backgrounds.
  • TypeScript 97.8%
  • JavaScript 1.8%
  • HTML 0.3%
  • CSS 0.1%
Find a file
Peter Banka 0ff2975295 cb-134.29: Launch loading screen covers spawn-in jank, fades to reveal settled game
Full-screen loader (reusing the boot spinner look, cb-8yc) shown from Launch
while the board fills (cb-134.23) and the ship settles over the spawn-grace
window (cb-134.16); fades out to reveal a clean game once grace ends.
2026-07-10 10:57:23 -07:00
designs Physics-engine bake-off: planck vs rapier slice behind a thin PhysicsWorld seam (cb-qz1.1) 2026-07-07 14:22:34 -07:00
poc/physics-engine-spike Physics-engine spike: findings doc + rapier/matter PoC (cb-em6) 2026-07-07 12:11:22 -07:00
src cb-134.29: Launch loading screen covers spawn-in jank, fades to reveal settled game 2026-07-10 10:57:23 -07:00
.gitignore Scaffold Vite + React + TS + PixiJS app shell (cb-81o.1) 2026-07-03 16:52:03 -07:00
eslint.config.js Scaffold Vite + React + TS + PixiJS app shell (cb-81o.1) 2026-07-03 16:52:03 -07:00
index.html feat: boot loading overlay — static HTML spinner removed on first real frame (cb-8yc) 2026-07-04 09:20:26 -07:00
package-lock.json WIP: checkpoint (auto) 2026-07-07 12:40:14 -07:00
package.json Remove bake-off cruft: dev-planck/dev-rapier scripts + ?engine= app swap (cb-qz1.8) 2026-07-08 15:37:59 -07:00
README.md Add Vitest unit-test suite covering the fragile spec/render/scroll paths (cb-acu) 2026-07-03 22:28:28 -07:00
tsconfig.app.json Add Vitest unit-test suite covering the fragile spec/render/scroll paths (cb-acu) 2026-07-03 22:28:28 -07:00
tsconfig.json Scaffold Vite + React + TS + PixiJS app shell (cb-81o.1) 2026-07-03 16:52:03 -07:00
tsconfig.node.json Scaffold Vite + React + TS + PixiJS app shell (cb-81o.1) 2026-07-03 16:52:03 -07:00
vite.config.ts cb-6dw: Kill test flakiness under load — drop wall-clock perf gate + raise timeout 2026-07-10 10:41:30 -07:00

Celilo Blast — Ship Designer

A web tool for designing procedural spaceships for Celilo Blast. Randomize a ship, tweak every field of its genome by hand, and save/export the ones you like. Ships are stored as plain ShipSpec data (not images), so the same spec can be handed to any renderer in the game.

Prerequisites

  • Node.js 18+ (developed on Node 24; any modern LTS works)
  • npm (this repo ships a package-lock.json)

Install

npm install

Run (dev)

npm run dev

Vite serves the app at http://localhost:5173 (it prints the URL on start).

Build & preview

npm run build     # type-checks (tsc -b) and builds to dist/
npm run preview   # serves the production build locally

Other scripts: npm run typecheck (types only), npm run lint (ESLint).

Test

npm test          # Vitest, single run
npx vitest        # watch mode

Unit tests (src/**/*.test.ts, Vitest — pixi-free/Node, no browser needed) guard the paths that actually broke or are fragile:

  • spec load/migrationloadShips()/parseSpec() upgrade legacy/partial/garbage specs against DEFAULT_SHIP without ever crashing the renderer (the cb-185 bug).
  • renderer/firing tolerancefiringOrigins() (the pixi-free twin of the renderer's weapon placement) handles hardpoints missing later-added fields (angle, weapon) with no unguarded access.
  • background scroll — decoration defaults, and the tile-recycle math (advanceStrip) stays contiguous forever (no gaps, no leaks).

The older hand-run src/**/*.check.ts self-checks are folded in via src/checks.test.ts, so npm test runs everything in one command.

Using the tool

The layout is a top toolbar, a Controls panel on the left, the live ship in the middle, and a Gallery on the right.

  • 🎲 Randomize — generate a fresh ship from a random seed. The current seed is shown in the toolbar, so a ship is reproducible from its seed.
  • Controls panel — every ShipSpec field is a live control: hull length/width, silhouette, cockpit, wings, engines, palette colors, greebles, seed, and weapon hardpoints (add/remove). Edits re-render the ship instantly.
  • Save — names the ship and stores it (with a thumbnail) in your browser's localStorage.
  • GalleryLoad, Dup (duplicate), or Del (delete) any saved ship.
  • Export — download the current ship as a .json spec for sharing.
  • Import — load a .json spec exported from anywhere.

Saved ships live in localStorage under the celilo-blast:ships key — they persist in that browser until you delete them or clear site data.

Tech stack

React 19 + Vite 6 + TypeScript, with PixiJS 8 for rendering. Ships are renderer-agnostic ShipSpec data; the Pixi renderer is just one consumer of it.

Project structure

src/
  ship/
    spec.ts          ShipSpec genome + DEFAULT_SHIP
    randomizer.ts    seeded "cool ship" generator
    renderer.ts      draws a ShipSpec with PixiJS
  storage/
    shipStore.ts     localStorage gallery + export/import
  components/
    Toolbar.tsx      randomize / save / export / import
    ControlsPanel.tsx  live field-by-field editor
    Canvas.tsx       Pixi canvas + thumbnail snapshots
    Gallery.tsx      saved-ship grid (load/dup/delete)
  App.tsx            wires it all together
  main.tsx           React entry point