Luke Miskelly

Taking projects for early 2027

Start a project

WorkObverse

03Arcade shooter · 2026 Playable

Obverse

Sixteen sectors. Sixteen guardians. One flip.

A neon side-scrolling shooter for phones, original IP in the spirit of 80s arcade shmups. Mid-stage the run reverses polarity: the ship turns around and the enemies come from the other side. The first two sectors are free in the build below, as they will be in the stores. Pick Cadet if you want five lives.

Role
Game design, systems, art direction, audio, mobile release
Platforms
iOS, Android, web
Stack
HTML5 Canvas · WebGL · Web Audio · Capacitor 8
Status
Preparing App Store and Google Play release
Obverse · web build Standby T+00:00.0 960 × 540

WASD or arrows to fly, or drag.Hold Space to charge the beam.X launches the pod.On a phone, turn it sideways.

DesignOne new idea per sector

Each sector introduces exactly one new way to kill enemies, and each guardian has one gimmick that tests it. Worms only take damage at the glowing tail. Mirrors reflect your shots, so only the charge beam or the pod gets through. The Relay Twins must both die within six seconds or the first revives.

Cadet mode gives five lives, three hull hits per life and walls that push rather than kill, so a child can finish what a veteran plays on Pilot.

Sector chartThe whole campaign

Sixteen sectors from the build's own level table, in their own colours, with each guardian and how many times that sector flips the run.

  1. 01Outer LatticeThe WardenNo flips
  2. 02Reef FoundryBrood FoundryNo flips
  3. 03Coil ChannelsThe Coil1 flip
  4. 04Mirror SeaPrism RegentNo flips
  5. 05Pressure DeepThe Press1 flip
  6. 06Twin RelayRelay Twins2 flips
  7. 07Event HorizonSingularity1 flip
  8. 08The NullwakeNull Heart3 flips
  9. 09Cryo VeilRime Colossus1 flip
  10. 10Spore GardenMother Bloom2 flips
  11. 11Magnetar RunThe Magnetar1 flip
  12. 12Hollow ChoirThe Cantor2 flips
  13. 13Rust GraveyardJunk Leviathan1 flip
  14. 14Chrono TideHour Engine2 flips
  15. 15Ember ThronePyre King1 flip
  16. 16The ObverseThe Obverse5 flips

EngineeringFlipping a whole game with one sign

The game logic runs in lane space, where forward is always plus x. A polarity flip mirrors the render transform and the input direction, so one codebase plays in both directions with no special cases for enemies, bullets or guardians. These lines are from the shipping build.

www/index.html · player, flip, renderexcerpt
// input: in a flipped run, right on the stick still means "forward"
const fd = L.flipped ? -1 : 1;
P.x += mx * sp * dt * fd;  P.x += I.dx * fd;

// the flip itself: clear the screen, shake, warn the player
function doFlip() {
  L.flipped = !L.flipped; L.flipT = 1.2; shake = 12; sfx.flip();
  for (const e of enemies) if (!e.dead) { score += e.score; e.dead = true; }
}

// render: mirror the whole world in one transform
ctx.save(); if (L.flipped) { ctx.translate(W, 0); ctx.scale(-1, 1); }

CraftLight, sound and terrain from code

A dependency-free WebGL layer draws procedural backdrops for every sector, then composites the game with bloom, shockwaves, chromatic aberration, vignette and grain. If WebGL is missing it falls back to plain canvas.

Terrain is seeded value noise per sector and flattens automatically for guardian arenas. The audio engine synthesises every effect and a procedural bassline per sector, with tempo and root note changing for guardian fights.

Shipping itFrom one HTML file to two stores

One web build is wrapped with Capacitor into native iOS and Android projects, with haptics, Game Center and Play Games leaderboards, a one-time unlock after two free sectors, and anonymous crash reporting that attaches the sector, phase and last game events.

What this means for your project