Bye Bye, Hell

Demo

Touch to escape

A one-thumb roguelite

Layer I: The Furnace Play the demo

You are Helen Back. You have been in Hell for 4,000 years. You hate it. You are leaving.

  • Drag to move.The gun aims itself. One thumb is all it takes.
  • Dodge the patterns.Every room is a bullet hell. Every layer ends in a boss.
  • Build a run.Pick boons and powers between rooms. Some come with a curse.
  • Climb out.The demo ends at Layer III, when Mother Cantor falls.
Fullscreen itch.io

Layer II: The Larder What is in the demo

Status
Demo build
Layers
I to III
Bosses
3
Guns
4
Plays on
Browser, phone or desktop
Built with
Cocos Creator 3.8.8, TypeScript
Saved for the full game
Pets, attachments, the wheel
Price
Free
  • Helen Back
  • Imp
  • The Sins
  • Mother Cantor

Layer III: The Drowned Choir Under the hood

Hundreds of bullets, enemies and sparks, held at a steady frame rate on cheap phones. These are the optimisations actually in the source, and where they live. They are design choices: we have not published benchmarks.

  • <12Draw calls
  • 1000Quads per batch
  • 60Fixed steps a second
  • 0Allocations per frame
  1. 01One draw call per layer

    Sprites are not scene nodes. A custom renderer, QuadBatch, writes quads straight into a vertex buffer, up to 1000 per draw call. The world is drawn in back-to-front layers, one batch each, so the whole game stays under 12 draw calls.

    core/QuadBatch.ts, core/Gfx.ts

  2. 02Typed-array pools

    Bullets, sparks and shots live in parallel Float32Arrays with fixed room: 760 bullets, 1400 particles, 220 player shots. Dead ones are swap-removed, so nothing is created or destroyed mid-fight and the garbage collector never stalls a frame.

    game/Bullets.ts, game/Fx.ts, game/Gear.ts

  3. 03Spatial grid hit tests

    Each frame, enemies drop into a 10 by 16 grid of 32-unit cells, chained by a next pointer so the grid allocates nothing. A shot checks only the 3 by 3 cells around it, not every enemy in the room.

    game/Enemies.ts: rebuild, queryHit

  4. 04Fixed timestep

    The game moves in exact 1/60 second steps from an accumulator. Frame time is capped at 1/20 second and at most three steps run per frame, so a hitch can never let a bullet tunnel through you.

    Main.ts

  5. 05Look it up once

    Sprite frames are found by name once, at startup, and kept as plain rectangles. Drawing never touches a string. Every sprite, and this font, share one packed atlas, which is what lets it all batch.

    core/Gfx.ts, gen/AtlasData.ts

  6. 06A lean demo build

    One DEMO flag cuts the game to three layers, four guns and a smaller boon pool, and drops whole systems: pets, attachments, the wheel. It keeps its own save slot, and every platform call is guarded, so it runs as plain HTML5.

    game/Demo.ts, core/Platform.ts