Bye Bye, Hell
Demo
Touch to escapeA 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.
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
-
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
-
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
-
03Spatial grid hit tests
Each frame, enemies drop into a 10 by 16 grid of 32-unit cells, chained by a
nextpointer 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
-
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
-
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
-
06A lean demo build
One
DEMOflag 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