Skip to main content

How to become an elite game developer

· 10 min read

I spent too much time as a kid playing games like Elite, so having recently created a solar system simulation / clock and now that I am fully unemployed and have a whole different set of demands on my time sorting out family admin after a couple of bereavements this summer (as well as firing off a billion job applications via LinkedIn), I naturally decided to build a web-based space trading game inspired by Elite and Firefly.

Claude is an astronaut​

I started off by prompting the idea to Claude, and within an evening and 12 rounds of prompting on Opus 5.5 set to Medium I had a playable, procedurally generated space-based trading game.

It does help that I already had a bit of a frame of reference from the solar system clock build, and also that I am a web developer of some vintage and know how to express and structure a set of requirements, but even so I found it pretty impressive.

I was so impressed that I span up a repo, committed all 12 versions in incrementally, switched from Claude Chat to Claude Code, and started to work on additional requirements / features!

Building with guardrails​

I should point out that I'm not just wildly vibe coding this - I'm using my own, still-evolving framework for AI-enhanced development, which puts a well defined set of constraints and guardrails in place, along with tools, prompts and agents defined for Claude, Codex, and GitHub Copilot.

Requirements are worked up as Markdown files initially, and then turned directly into Issues in my Gitea instance, running on my homelab server.

Issues are labelled with a fixed taxonomy of priority levels, status, type, and whether automation is allowed.

Gitea tools have been created within the framework to allow an agent to list available tickets, claim them, work on them, raise PRs, and hand over for human review - that's a deliberate decision to constrain the workflow rather than letting it loose on the Gitea API, which would have been more flexible, but I want my robotic pets on a short enough leash for now!

Picking up a ticket forces an assessemnt of the level of work needed, classifying it into trivial, standard, or significant tiers.

Anything that implements significant change requires an ADR to be written, reviewed and adopted by a human, preventing runaway work and keeping human judgement in the loop.

That's all wrapped up in its own repo, and is, as I said, still evolving.

I'll write another blog post with a deeper dive into the framework and the lessons learned by using it, but at a high level it defines:

  • A governed AI delivery workflow (Trivial / Standard / Significant)
  • A set of explicit agents and workflow roles with clear responsibilities
  • Reusable workflow instructions for supported AI clients
  • Code‑review configurations and validators enforcing governance at PR time
  • AI hygiene and bootstrap mechanisms to prevent “rubbish in, rubbish out”
  • Logging and resumability for auditability and context rebuilding
  • A framework CLI so projects use this framework as a pinned, versioned, external dependency instead of a copy (framework init | doctor | upgrade), with release practice clearly documented
  • Platform‑specific coding constraints for supported stacks
  • Evals — scenario-based behavioral tests checking that AI-agent output actually complies with the rules above, not just that the rules are documented (currently observability-only)

Together, these allow me (and future teams) to move faster without sacrificing engineering quality, testability, or documentation.

It's also enabled me to do a complete modularisation of the code, convert it all to TypeScript, create a lot of test coverage, including some automatic instrumentation to allow me to measure performance and frame rates across different devices to prevent performance regressions and code bloat.

The game itself​

It's very obviously inspired by Elite, and at this point in time it's purely for personal learning and entertainment.

Saying that, there are still a lot of open tickets for new features and tweaks to existing ones - 21 at the time of writing - but I figured I might as well get something out there and see what people think of it.

It's currently called "Outer Lanes" and you can check it out here.

It's a single page web app, 5 files in all, including a service worker to allow offline play and download updates when back online.

Give it a spin, and drop me a line to let me know what you think - you can get me at outerlanes@andyhawkes.co.uk

The idea​

You are a commander with a small ship, 300 credits and an empty hold. You buy goods where they are cheap and sell them where they are dear, and you use the profits to upgrade your ship. You can stay legal, or you can misbehave: run contraband, pay off patrols, trade at freeports nobody licenses, and go looking for outposts that aren't on any chart. Every star system in eight galaxies is generated from a seed, so the universe is large, consistent and costs almost nothing to download.

Inspirations​

  • Elite (David Braben and Ian Bell, Acornsoft, 1984), first played on a BBC Model B at school and later on an Atari ST. It provides the core loop (trade, upgrade, explore), the procedurally generated galaxies, the spinning station you dock with by rolling to match its slot, the docking computer, the 3D elliptical scanner, galactic hyperdrives, and random mid-hyperspace ambushes. Elite's economy of means, fitting eight galaxies of 256 systems into a 32 KB machine, is the spirit this project tries to keep.
  • Firefly / Serenity. It provides the "we aim to misbehave" tone: smuggling, freeports, patrols that can be bribed, and a lawless fringe haunted by raiders who don't negotiate. The raiders here are an original creation, the Unlit, not borrowed from the show.
  • Early hacker culture. Galaxy 1 is seeded with 1337 ("leet", itself from "elite") as a nod to both.
  • Broader SF and gaming tropes: asteroid mining, hidden outposts and rumours, faction politics and ship classes, which feature in the roadmap.

Design principles​

  1. Browser first, phone friendly. It must load quickly and hold a playable frame rate on a mid-range phone. Touch is a first-class input, not an afterthought.
  2. Minimal code, maximum generation. Content is generated from seeds rather than shipped as assets. There are no image, model or audio files; everything is built from code at runtime.
  3. Deterministic worlds. The same seed always gives the same galaxy, system, planet, station and asteroid field, in every view mode.
  4. Three views, one world. Vector (BBC-style hidden-line wireframe), low-poly (flat-shaded, the default) and refined (smooth, glossy, bloom). Switching changes how things look, never where they are.
  5. Readable over realistic. Choices show their odds, and failure messages explain what to do differently.
  6. Honest scope. Features earn their place by making the core game loop more interesting, not by adding systems for their own sake.

What's in the game today​

Galaxy and systems​

  • 8 galaxies of 150 systems each, generated from seeds (galaxy 1 = 1337).
  • Each system has a generated name, government (8 types), economy (8 types), tech level, population, description, star class, moons and station type.
  • Planets come in six world types (temperate ocean, jungle, desert, ice, volcanic, barren) with noise-generated terrain.
  • Station types: cuboctahedral orbital, high-tech ring station, moon base (a surface hangar with chasing runway lights), and asteroid freeport.
  • Uncharted outposts, hidden from the chart until found, discovered through bar rumours, the scanner or a signal scanner.
  • Asteroid fields (four ore types, told apart by colour) and comets with particle tails.

Flight​

  • Pitch, roll and throttle by keyboard, mouse drag or touch stick and slider.
  • Cruise (fast in-system travel, mass-locked near bodies and ships) and Hyperspace (jumps between stars, which cost fuel).
  • Docking through framed collars; you must match the spin, stay level and keep your speed down.
  • A docking computer that routes around planets, moons, stations, asteroid fields and comets.
  • 3D elliptical scanner, compass, and HUD bars for speed, altitude, fuel and hull.

Trade and economy​

  • 15 commodities plus relic tech (sold only at outposts). Prices depend on economy, tech level and world type, and change daily (one day passes per hyperspace jump).
  • Contraband (narcotics and weapons) is banned in democracies and corporate states. Customs searches, confiscation and fines depend on the law level and your record.
  • Freeports charge a docking-day trading fee, have no customs and pay premium prices. You can decline the fee and still refuel.
  • Moon bases sell mining goods cheaply; ring stations carry deep stock and discount equipment; outposts pay 30% over the odds.
  • Galactic chart with fuel range, trade notes ("usually cheap/dear there", best run from the current market), and risk indicators.

Danger and the law​

  • Random encounters with pirates, patrols and the Unlit (mysterious baddies who can pop up seemingly out of nowhere and pull you out of hyperspace). These are resolved as choices with visible odds: fight, run, go dark, pay, jettison cargo, submit to a scan, or bribe.
  • Legal status (Clean, Offender, Fugitive) that fades with time.
  • Hull damage, repairs, bounties and salvage.

Mining​

  • Shoot asteroids to split them and scoop the ore fragments; comets yield water ice and the odd gemstone.
  • A mining laser greatly improves the yield.

Progression and equipment​

Cargo bay extension, freight pods, long-range fuel tanks, mining laser, signal scanner, beam and military lasers, shield booster, injector burners, and a galactic hyperdrive.

Presentation​

  • Three view modes (vector, low-poly, refined), each with matched hyperspace effects, docking entrances, particles, debris and ore.
  • Procedural galactic sky, planetary oceans, clouds and atmosphere glow, and bloom in refined view.

Saving​

Progress is saved automatically in the browser (localStorage). A two-step Start over resets the commander.

How to play​

ActionKeyboardTouch or mouse
Pitch / rollArrows or W A S DDrag anywhere
ThrottleSpace / ShiftRight-hand slider or mouse wheel
Fire laser (mining)FHold the Fire button
Cruise (fast, in system)JCruise button
Docking computerCDock comp button
Galactic chartGChart button
HyperspaceHHyperspace button
Cycle viewVView button
LaunchLLaunch button
Close a panelEscClose button
Help? or F1? button in flight, Help on the station screen

Sound is synthesised at run time with the Web Audio API (no audio files): engine hum that follows the throttle, cruise, lasers, rocks, ore, hits, explosions, docking clamps, launch, the hyperspace countdown, whoosh and arrival, UI and trade ticks, alarms, a quiet generative pad in flight (darker in dangerous systems), and The Blue Danube (Strauss, 1866, public domain) while the docking computer flies. Each view has its own palette (raw squares in vector, filtered in low-poly, reverb in refined). Nothing plays before the first tap or key press, and it pauses when the page is hidden. A speaker button in the flight HUD mutes; the station's System tab has master, effects and music volume, mute and a switch for the waltz, all saved with the game.

The Help screen lists the same controls for keyboard, mouse and touch, with a short Basics section and credits. Opening it in flight pauses the game. A new commander is asked for a name (one tap or Enter accepts the suggestion), shown a welcome with a first trade worked out from the real market, and a controls card for the device in use; a few one-time hints follow in flight. "Skip intro" leaves it all in one tap, and "Replay welcome" in Help brings it back. The name can be changed from the station's System tab.

First steps​

You start docked at Late, a poor industrial democracy. Bexebe, 2.3 LY away, is agricultural: carry food there, and bring computers and machinery back. Buy a cargo bay extension early, then a mining laser, and keep an ear on the rumours.

Technical overview​

  • Strict TypeScript ES modules, built with Vite. About 2,300 lines of TypeScript in src/ (no any), split into modules, with the page markup and styles in index.html. The game's own code is about 40 KB gzipped; the first load, three.js included, is about 177 KB gzipped. No assets, no framework. Everything is generated at runtime. (Types are checked by tsc, not by the build).
  • three.js r128, pinned and bundled (no third-party script origins). Its bloom post-processing and BufferGeometryUtils come from three's own ES-module examples. Upgrading three.js is a separate piece of work.
  • Fonts: two families, Major Mono Display and IBM Plex Mono, loaded from Google Fonts, so Google Fonts is the one third-party origin. The game plays without them.
  • Supported browsers (current stable version of each): Safari on iOS, Chrome on Android, and Chrome, Firefox and Safari on desktop.
  • Baseline test devices: Google Pixel 8, iPhone SE and iPad Air (5th generation). All three hold 60 fps in every view.
  • Seeded randomness (mulberry32) and 3D value noise drive all generation.
  • Save format: a single localStorage key (outer-lanes-v1), with migration for older saves (for example, the move to the 1337 seed). Every save format that ever shipped has a test fixture.
  • Logarithmic depth buffer, so planets tens of thousands of units away and docking slots a few units wide render correctly in one scene.

Credits and intellectual property​

  • Elite is © David Braben and Ian Bell. This project is an independent homage and uses no code, assets or text from Elite. A few genre terms (such as docking computer and galactic hyperdrive) are kept deliberately as a nod to it.
  • Firefly and Serenity are © their respective owners. The tone is an inspiration only; names, factions and characters here are original.
  • three.js is © its authors under the MIT licence.
  • Game code by Andy Hawkes, developed with Claude (Anthropic).