Candy Tycoon (Revamped)
A from-scratch rewrite of my 2019 incremental game in clean, framework-free JavaScript. Build candy factories, ride a live market of spikes and crashes, automate your shops with stop-loss and logistics upgrades, and watch it all on a hand-rolled canvas dashboard. No engine, no dependencies, just ES modules.
The problem
The original Candy Tycoon (2019) was a single ~500-line minified AngularJS file: fun, but impossible to extend, and quietly shipping a watermarked chart library and a stray redirect to google.com. I wanted to keep the game and lose the cruft.
My role
Solo: design, balance, architecture and code. I recovered the game model from the old minified bundle and rebuilt it from the ground up.
Outcome
A modular, dependency-free game: a live market system, shop automation, versioned saves with a patch-notes popup, and a custom canvas chart, all plain ES modules served as static files. Runs at 60fps with a tiny memory footprint.
Build factories across 16 candy types, open shops, and price-optimise as exponential cost curves push you to keep expanding. Hundreds of values recompute live every frame.
Prices spike and crash on live market events, with a scrolling news ticker, per-candy trend arrows, and a market-odds readout. Upgrade toward friendlier headlines and more frequent events to bend the market your way.
Stop-Loss closes a shop when its product crashes; Hired Hands reopens it when prices recover; Franchise Playbook points every shop at one product; and the R&D Department auto-buys production upgrades, toggleable any time.
The Information panel renders a doughnut sales-mix, per-candy bars, and live balance / earned / cash-per-second lines on a custom HTML5 canvas chart, replacing the watermarked library the original shipped.
A responsive three-column board that collapses to a single column on phones, with collapse-all controls, press-and-hold confirmations for irreversible actions, and folding panels to tame the density.
A deep dive into the architecture: a pure simulation core, a fixed-step game loop, data-driven balance, versioned saves, and a framework-free panel system.