Skip to content
Emre.dev — home
Emre.dev
All work
In development2026Designer · engineer

Evolutionary Tycoon

An isometric browser management game whose demand is real traffic, not a spawn timer.

The short version

The simulation core knows nothing about the renderer. Phaser only draws — which is what makes the economy testable headlessly and a bug reproducible from a seed.

The Evolutionary Tycoon build: a 2:1 dimetric road and plot rendered with placeholder art markers standing in for the final sprites.

Phases 0–4 of a 25-phase plan are complete and the build is deliberately paused there. The isometric renderer and the deterministic simulation core work; the art is placeholder, which the live build shows honestly.

How Evolutionary Tycoon works

A 2D isometric tycoon game: turn a roadside lemonade stand into a restaurant chain by converting the vehicles physically passing your plot into customers. The differentiator is that demand is an observable, influenceable traffic flow rather than a timer that emits customers.

The problem

In this genre demand arrives from a spawn timer, which the player cannot see, predict or influence. That makes the core loop opaque: you upgrade and hope. Making demand a physical flow of vehicles across the screen turns the same loop into something you can watch and reason about.

The architecture

One decision carries the project: the simulation is a dependency-free, deterministic TypeScript core with no knowledge of the renderer, and Phaser is a drawing layer fed by a bridge. Six separate RNG streams, an eighteen-slot system pipeline, a command log and an event bus sit behind it. No backend at all — it deploys as a static site.

The interesting decision

Separating simulation from rendering buys five things at once that would each be hard to retrofit: headless tests, economy balance verification in CI, pixel-exact visual regression, bug reports reproducible from a seed, and a "replay the day" feature that is free rather than engineered.

What it does now

Roughly 26,000 lines across 143 source files with 110 test files, a determinism suite, and a simulation benchmark. Phaser 4 was chosen over PixiJS and a custom WebGL2 renderer on a weighted comparison recorded in the repository.

Worth knowing

  • The simulation core imports nothing from the renderer, so the economy can be verified without a browser.
  • Six independent RNG streams, so adding a system cannot perturb another system’s sequence.
  • A determinism suite: the same seed must produce the same world hash, which is what makes a bug report reproducible.
  • The engine decision is written down as a weighted comparison of four candidates, not asserted.
  • Paused at phase 4 of 25 on purpose, at a gate, rather than drifting — and the live build shows placeholder art rather than pretending otherwise.