Each species blooms on a bell-shaped calendar curve centred on its real UK flowering week, and the running blossom count is reduced permanently whenever a frost falls while flowers are open:
bloom(d) = exp( -((d - center)/sigma)^2 )
P_frost(d) = Fmult · 0.85 · max(0, 1 - d/140)^2
if frost triggers on day d:
loss(d) = U(0.15, 0.4) · bloom(d) [per species in bloom]
damage += loss(d) (capped at 1.0, permanent)
remaining(d) = bloom(d) · (1 - damage_so_far)
- Day-of-year slider / Play — scrubs the season; every species' blossom density and frost damage are recomputed directly from the day, so scrubbing back and forth is exact and repeatable within one season.
- Frost severity — scales the daily frost probability, which itself decays roughly quadratically from February into May as an approximation of UK spring warming.
- New season — rerolls which days actually carry a frost event (a fresh random draw against P_frost(d) for every day), so early-flowering willow and cherry/plum are consistently the most exposed while midsummer lime is essentially frost-free.
- Damage is cumulative and irreversible within a season — a frost that hits a species already 40% through its bloom window only removes flowers it hadn't opened yet times the current bloom density, matching how real blossom damage compounds through a cold snap.
Real-world relevance: this is why a run of April frosts can wipe out a UK apple or cherry harvest almost entirely while barely touching midsummer lime — early bloomers accumulate exposure across more frost-risk days, exactly as beekeepers and orchardists track it season to season.