Fate or Fortune
A server-authoritative, co-op action RPG in isometric pixel art that runs in a browser tab. Up to four players clear procedurally generated rifts across sixteen biomes, cut their own skill gems and weave the Great Fateloom. The server simulates every hit at 20 ticks a second, and around two thousand tests keep it honest.
Recorded from a live local server1920 × 1080 · PixiJS client, .NET server
(01) — Overview
Every hit decided on the server.
The client only sends intentions: move here, cast this. The server runs the world at 20 Hz and streams snapshots back, while the client predicts your own movement and reconciles, so it feels instant and can't be cheated. Map seeds come from a cryptographic RNG and every craft is rolled and audited server-side.
Around that engine is a full game: four classes with skills defined as pure data, uncut gems you cut into any skill, supports and seventeen auras, a 48-motif talent loom per class, a spatial inventory, an Ember currency economy, a market and mail, and a Riftweb endgame that climbs to area level 100.
- ClassesWarden · Strider · Evoker · Gravecaller
- Biomes16, each with its own boss
- Server tick20 Hz, authoritative
- Players1–4 co-op
- Codebase~51k lines client · ~90k server
xUnit facts and theories across combat, crafting, AI, the Fateloom, Riftweb, market and persistence.
Playwright journeys that drive the real game and save screenshots and JSON reports.
Against a 50 ms budget, with four combat instances at once in a release build. Zero overruns.
Reached at Riftweb depth 350, with monster density climbing on a written contract.
(02) — Endgame builds, recorded live
Stacked characters, packs that pop.
Three level 100 characters, geared and linked the way a late-game player would build them, recorded on a live local server at 1080p and 60 fps. Every bolt, shard and spin you see was simulated by the server and streamed to the browser.
Malveil, Master of Revels.
A carnival ring of fire and knives. Bosses telegraph their attacks, arenas seal, and the HUD globes track health and Vigor as it's spent.
Ysara, the Mirror Queen.
A different biome, boss and palette, all generated from the same systems.
The hideout, then the rift.
Walk to the Rift Device, pick a node on the Riftweb and step through one of six portals into a freshly generated map.
(03) — The systems
Depth you can see.
Every panel is hand-built in the DOM over the PixiJS world, in the same ornate language as the HUD.







(04) — Skill effects
Fire with rules.
Skill art is authored frame by frame and previewed on an isolated test stage before it reaches the game. Flashover, for example, chains through up to six burning enemies and copies each one's remaining ignite, over a 32-frame, 1.44-second eruption.
(05) — How it's put together
One set of rules, shared.
A shared domain library holds the catalogues and rules for skills, items, affixes, map generation and talents. The server runs them and the client mirrors movement for prediction. Hover or tap a node.
Swipe the diagram sideways to see all of it →
(06) — Engineering notes
Built like a game studio, by one person.
- 01
Server authority, everywhere
Damage, drops, crafting and map generation all happen on the server. The client never decides an outcome.
- 02
Skills are data
A skill is a catalogue entry run by generic executors, so adding one is content work, not new engine code.
- 03
Tested co-op
A two-browser end-to-end test drives two real players through the same SignalR session to prove movement stays in sync.
- 04
Balance by simulation
Headless auto-play of every class against the bosses drove real tuning, alongside certified build matrices.
- 05
Validated maps
Every generated layout is flood-filled and validated, so no rift can seal a player away from its boss.
- 06
An asset pipeline, too
Around ninety scripts build world, character and skill art, process effects, voice and backups, so the art stays reproducible.
ZenFast
