I built the project around small, focused classes that each handle one job. Entities manage colonies and modules, data classes keep track of stats and upgrades, and controller classes (like LevelManager and TickManager) orchestrate everything that happens. I kept the GUI completely separate, giving it its own module with clean, typed builders and formatters so the visual layer stays independent from the game’s brain.
For progression, I made the level system deterministic and data-driven. Each level holds its baseline stats, experience targets, and upgrade rules all in one place. The level manager handles transitions smoothly, applies upgrades to the numbers that matter, and gives the UI read-only snapshots to display. Numbers scale using custom letter notation for those massive late-game values (just like Idle Miner Tycoon [K, M, B, T, aa, ab, ac …]), and upgrade costs flow directly from the level parameters.
The tick system is the heartbeat of everything. It runs a controlled update loop that advances time, processes queued actions, and syncs state changes at a consistent rate. Each tick fires events that managers and the GUI listen to, batching their updates together.