A single-player, browser-based 3D action-MOBA built solo. You play Randy of the Nature faction against a PvE Hell army: three lanes, barracks, a jungle with mini-bosses, and a commander to kill. One match runs 10–15 minutes.
Status: playable MVP. Not feature-complete, and the balance is still moving.
Non-commercial study project, inspired by the mechanics of Land of Chaos Online. All art and 3D assets in this repository were generated for this project.
The gameplay is only half of it. The other half is the architecture, which was the actual design goal:
- The simulation is pure.
src/simholds every game rule and runs on a fixed 30 Hz tick with zero imports from the renderer or any browser API. It runs headless — which means the same code can become the authoritative server if this ever goes online. - No magic numbers in code. Every balance value — hero, creeps, buildings, jungle,
economy, items, map layout — lives in
src/data/*.json. Tuning the game never means touching logic. - Balance is verified by simulation, not by feel.
npm run simplays full 10–15 minute matches headless and reports the outcome, so a balance change can be checked in seconds instead of played by hand. - Rendering interpolates between ticks, so a 30 Hz simulation still presents at 60 fps.
src/sim pure game logic — fixed 30 Hz tick, headless, no Babylon, no DOM
src/render Babylon.js scene, models, animation, interpolation between ticks
src/ui DOM layer — lobby, HUD, end screens
src/data JSON balance data — the single source of truth for every number
The dependency rule is one-directional: render and ui may read sim, never the
reverse. Pathfinding is a waypoint graph living inside sim, so navigation works headless
too.
TypeScript · Vite · Babylon.js 7 · Vitest · Playwright · glTF/GLB assets
npm install
npm run dev # dev server
npm run build # typecheck + production build
npm test # unit tests (Vitest)
npm run sim # headless autosimulation of a full matchNode 20+ required.
~18 500 lines of TypeScript across 32 source files, 66 test files, 187 commits of real history. Built by one person, with AI used as an implementation layer — architecture, review, and every design decision stayed manual.
| Lobby | Randy |
|---|---|
![]() |
![]() |
The project was built spec-first: a written design document defined all mechanics and
numbers before implementation, and each iteration ended with a review pass against
reference screenshots. Twenty such iterations are captured in progress-iter-*.png.
Contributor notes and the naming glossary live in CLAUDE.md; the full design
spec is under docs/.


