Balancing an Idle Game with a Simulation
You cannot balance six regions and days of play time by playing them yourself. A small Python bot now plays the whole game in seconds, and its results decide prices, goals and build times. Plus: coin stacks, slimmer cards and a design I threw away.

Idle games live and die by their pacing. If a region takes ten minutes, it is forgettable. If it takes ten days without anything new, players leave. The problem: you cannot test pacing over days by playing yourself, especially not after every change.
Targets first
Before touching any numbers I wrote down what I wanted, for an active player without premium currency:
- Region 1 complete in 1–2 hours.
- Region 2 in 2–3 hours, region 3 in 5–7 hours, region 4 in 12–18 hours.
- Region 5 in one and a half to two and a half days, region 6 in a bit over a week.
Inside a region, phase 2 should be reachable after about 10 % of the region's time and phase 3 after about 35 %. And one rule I care about a lot: the next region should unlock while the previous one is still being finished. The player should always have a main region and a side region, so there is always something to do. In numbers: the next region opens about 25–35 % into the last expansion build of the current one.
A bot that plays the whole game
balance_sim.py is a small Python script that plays like a greedy but sensible player: it buys whatever pays back fastest, hires staff as soon as it is worth it, starts expansions when it can afford them, and switches regions when a new one opens. It is event-driven instead of frame-based, so simulated days take seconds.
The output is a table: when each phase opens, when each region unlocks, how long each region took. A --set option lets me try a value without editing the configuration, for example "what if the second phase of Italy needed 30 % more production?". Then I change the JSON, run the bot again, and compare.
The simulation is deliberately simple. It knows nothing about ads, crystals or the special projects that came later. It answers one question: is the basic progression shaped the way I want? Everything else is a bonus on top of a solid curve.
Finishing a build with crystals
The same day got a feature for impatient players: finishing a running construction instantly with snow crystals. The price falls as the build progresses, roughly:
- 30 minutes left: 25 crystals
- 15 minutes: 12
- 10 minutes: 8
- 5 minutes: 4
- 2 minutes: 2
While building, the expansion card shows a painted excavator, a progress bar with a percentage, the "watch a video to speed up" button and the crystal button. A later analysis showed the curve was too cheap – players ended up with more than enough crystals to skip every build – so it got steeper. More on that in the entry about resort ratings.
Coin stacks instead of tapping the card
In the prototype you tapped a business card to collect its money. That made the whole card a button, which caused accidental taps while scrolling. The new rule:
- When a ride finishes and nobody works there yet, the money becomes a coin stack at the end of the progress bar. The business waits.
- Tapping the stack collects it and starts the next ride. Every few seconds an uncollected stack wobbles slightly.
- Once staff is hired, collection is automatic and only a small "+amount" text rises where the stack would be.
I tried flying coins from every business to the wallet. With ten automated businesses it looked like a slot machine, so flights stayed only for stacks the player collects by hand.
Slimmer cards
Phones are narrow, and every pixel a card uses is a pixel less for the next business. In a few rounds the card lost about a third of its height: the count moved next to the name ("12 / 25" towards the next milestone), profit and cycle time moved into the progress bar, the buy button moved next to the bar, and the line "12 more until the next doubling" disappeared because the count already says it.
The design I threw away
I also spent part of the day on a concept from another chat: a small illustrated mini-map per expansion phase. It looked charming in theory. On a real screen it took too much space for too little information. I discarded all changes and went back. Throwing away a day's work is never pleasant, but keeping something that makes the main screen worse is worse.