Offline Progress Done Right, and Icons That Move
Android does not close an app when you switch away – it freezes it. That broke offline earnings in a subtle way. Also: offline bonuses as percentages, small animations that bring the resort to life, and fair prices in every country.

The bug that only existed on Android
On Android the offline earnings felt wrong. If you closed the app completely, you got your offline report. If you only switched to another app and came back later, you got nothing: no report, and less money than expected.
The reason: Android keeps a backgrounded app alive in memory, but the browser engine inside it stops drawing frames. The game loop runs on animation frames, so it simply stopped. When the app came back, it continued as if no time had passed.
The fix treats "coming back from the background" like "starting after being offline": the game notes when it was hidden and credits the time in between with the same logic used at startup. Browsers do the same when a tab is hidden, so the web version uses the same path.
Five minutes
Then a second question: should switching to a chat for ten seconds trigger the offline report and its bonus? No. The rules now are:
- Under 5 minutes away: production is credited silently. No dialog, no bonus.
- Over 5 minutes: the offline report appears, with the bonus from crystal upgrades, and an optional video that doubles it.
I briefly considered not crediting short absences at all, but that would mean your resort stops working whenever you glance at a notification. Silent credit is the honest version.
Offline bonus as percentages
The VIP crystal upgrade used to add hours of offline time. That looked strange after five minutes away ("+2 hours" bonus on a five-minute absence). It now adds a percentage to offline earnings, in steps: +25 %, +50 %, +75 %, +100 %, +150 %, +200 %, +300 %. The offline dialog shows how long you were away and the bonus that applied.
Icons that move
The painted icons were beautiful but still. I tested small animations, removed them again, and then brought them back properly with a setting to turn them off:
- lift chairs and T-bars sway gently on the cable;
- huts, the onsen, the ramen house and the espresso bar steam; the soup and the pizza too;
- windows flicker with warm light; in the ryokan, room lights go on and off now and then;
- flags wave at the ski school;
- the heli-skiing rotor turns (on a flattened ellipse, so it matches the perspective);
- the fondue bubbles, the champagne has rising pearls, the gourmet restaurant's stars twinkle;
- the snowmobile throws a snow spray, and a ski at the rental wobbles from time to time.
Each animation is a separate image layer cut out of the painted icon by a script, moved with CSS. That keeps them cheap: the browser animates transforms and opacity on the graphics card, without repainting. They switch off with the system's "reduce motion" preference and with the new setting, which shows the still icons.
The same day the settings got a credits screen and the region tabs started scrolling to the active region on startup. Opening the game in Switzerland and seeing Austria first was a small, daily annoyance.
Fair prices in every country
The crystal pack prices were set in euros, and Google converted them into odd amounts everywhere else. I wanted round prices that make sense locally, so prices are now maintained by a script through the Play Developer API:
- in euro countries, Britain, Switzerland and the US the pack costs the same number (1.99, 4.99, 9.99 in the local currency);
- lower-income countries get lower price tiers, so a pack costs a fair share of local income rather than a European price;
- everywhere else, Google's conversion is used and only updated when it drifts more than 10 %.
The script prints a dry run first and only writes with an explicit flag. Changing prices in two hundred regions by hand would have taken an evening and produced mistakes; now it takes a command.