Game
Weather: fronts and forecastsWE
Semi-realistic weather you plan around. Fronts from the save seed, an honest forecast per period, wet lawns, rain that grows grass, wind, and bookings you move when rain is likely.
Weather you plan around. A front rolls in, the forecast says 70% tonight, so you mow Mrs. Higgins' lawn after lunch and let the wet morning go. The percentage is honest: a 30% afternoon rains about 3 times in 10. And the weather makes work as well as blocking it: rain grows grass, so clients call back sooner.
The player's view
Checking the sky. Over breakfast you open Cloud Nine on the old computer, or read the weather box in the morning paper: fog this morning, a fair afternoon, showers in the evening, rain overnight. Grandma's sticky note says it for you: mow after lunch, home before the rain.
A soaked morning. It rained in the night while you slept, so at 7:00 the lawn is soaking and wrapped in fog. Mow now and the grass is heavy, the clippings clump and the bag fills in no time. Wait for the fog to burn off and the sun to dry the lawn, and the same job goes light.
Rain on the way. In a client's garden you can't check the computer, so the sky warns you: the clouds build for an hour or two, and the clock line on the HUD says rain is coming. A client looks up: "Looks like rain, dear." When it starts you choose: keep mowing in the wet, or stop and get paid for what you finished, with no bad review.
A washout. The evening before a booked visit, the forecast is grim and the client calls to move it. On a merely rainy day you can call to move it yourself, or go anyway. A washout isn't a lost day: you fix the mower at home, make a store run, or knock on doors, where people are home because of the rain.
A wet week. After a week of showers every lawn on your list has shot up, and the phone rings with clients who want you back sooner. After a dry week, things are quiet.
Wind. The trees sway and the rain slants. Blow leaves with the wind and the pile flies across the lawn; blow against it and the leaves barely move and drift back. Clippings drift downwind onto the patio and into the pool.
Later. Thunderstorms stop work and leave fallen branches and clean-up calls behind them. Seasons bring frost mornings, heat waves that brown the lawns, autumn leaves and snow.
Ideas
WE1: the model and the forecast numbers
The weather replaces the one roll per day of Calendar.WeatherOn(day) (three types, a hash of the day number, so day
12 had the same weather in every save). It is a pure function of the save seed and the hour, so every sibling
computes the same sky and nothing is synced.
Fronts, not dice
- A hidden hourly curve per save, a pure function of (
State.seed, hour). Fair spells sit between fronts. A front arrives every 3-6 days, builds cloud for a few hours, rains for 6-24 h, then clears with a wind shift. Warm fair afternoons can pop a shower. A clear, calm night after rain leaves fog the next morning (it burns off by ~10:00 and leaves the lawn soaked). - Cloud cover, rain chance, rain amount, fog, wind and temperature are all read from the curve, so changes are gradual and streaks are realistic (a wet week, a dry week).
- Periods: simulated every hour, shown as morning (7-11), afternoon (11-15), evening (15-19) and night (19-7). Night isn't played but is shown small: rain overnight means a soaked lawn at 7:00.
- The first 3 days are dry (grandma's garden, Mrs. Higgins are learned on dry grass): fair weather forced, 0% shown.
An honest forecast
- The curve gives each period a rain chance; whether it actually rains is then rolled from that chance
(
SimRandom.Value(seed, period index, salt), a named salt, SD2). "30%" rains about 3 times in 10. A rare shower under a "clear, 2%" forecast is fair and funny. The forecast can be wrong; the percentage is always true. - The percentage comes first and the icon is drawn from it. If the percentage only followed the icon, it would add nothing. A player who mows anyway under 30% wins 7 times in 10, and knew the risk.
- Today and tomorrow are shown per period. Days 3-7 show one icon, the day's rain chance (1 − the product of the morning, afternoon and evening "no rain" chances), high/low and wind.
- The forecast never changes as the day gets closer (revisions are WE15).
Sky types
Stored as values (cloud cover, rain chance and amount, fog, wind, temperature); the icon is derived, so the sky changes gradually instead of switching between presets.
| Type | Cloud | Rain chance | Notes |
|---|---|---|---|
| Clear | < 20% | 0-5% | dew burns off by 11:00; heavy dew after a clear calm night |
| Partly cloudy | 20-50% | 5-15% | fair; afternoon cumulus can grow into a shower |
| Cloudy | > 60% | 10-40% | slower drying, often ahead of a front |
| Morning fog | low | 0-10% | after rain + a clear calm night; burns off by ~10:00; soaked lawn |
| Showers | broken | 30-60% | rain on and off (the existing shower drift in Weather.cs) |
| Rain | overcast | 60%+ | the front itself: wet grass, growth boost, booking moves |
Thunderstorms (WE7) and snow (WE13) come later.
Season, temperature, wind
- Season: the code is season-ready (a season table, 14-day seasons, a 56-day year) but runs one endless late
spring: growth ×1.2, lows ~50 °F, highs ~70 °F.
Calendar.SeasonsEnabled = false. Filling the table is WE9. - Temperature: for now it only sets the dew (clear calm nights = heavy dew). Shown in °F (WE4).
- Wind: mph, a direction (8 points) and gusts. Ambiance (trees, rain slant) plus the two effects in WE3.
Climate targets (late spring)
What the generator is tuned and tested against, over a 56-day run:
- A washout every 2 weeksAbout one, by the washout rule (WE4: ≥70% in both the morning and the afternoon).
- 1-2 rainy days a weekThe day's rain chance is 40% or more.
- Fog 1-2 mornings a weekAfter rain and a clear, calm night.
- Streaks of 6 days at mostNo dry or wet run longer than that.
Hooks built now, empty
So later weather is data, not a rewrite:
- Season table (
SeasonClimate): front frequency, front strength, temperature range, shower odds, fog odds, growth, dew. Only the late-spring row is filled. - Weather events on top of the front curve:
{type, start hour, length, strength}, decided by the seed. None yet; thunderstorms, heat waves, cold snaps and droughts plug in here (WE7, WE10, WE11). - AftermathWhen an event ends, a hook can drop garden debris, pool leaves, a headline and client calls (WE8).
Replacing the old calendar
WeatherModel(Sim, pure) gives the hourly state; the forecast per period and the truth rolled from it; the daily chance for days 3-7.- It replaces
Calendar.WeatherOn/HumidityAtfor every caller (Company,ClientTexts,HubComputer,GarageUI,HudController,MissionController,GarageController,EgoReactions). AWeatherType-style summary stays for the old callers until each one is moved. ForceWeatherCommand(host-only, debug) sets a day's weather.- Tests: determinism (same seed → same week); calibration (each 10% bucket rains within ±3 points over 10,000 periods); the climate targets over a 56-day run; days 1-3 dry.
Needs: SD2 · Done when: the tests pass, and the old UI still shows sensible weather from the new model.
WE2: the sky follows the game clock
Weather.cstakes continuous values (overcast, rain, fog, wind) interpolated between hours instead of three presets. Its visuals stay (smooth blending, showers, wet ground, rain slant), fed by the model.- Clouds build 1-2 h before rain: the sky is the first warning in the field.
- Morning fog (URP fog density) is new.
- The HUD clock line shows the current period's icon and the next one ("rain from 15:00"). A client may say it
("Looks like rain, dear", through
VoiceLineswith WE4's lines). - The same continuous values feed
SoundWeather(SN1): rain and wind are heard from them, and the rain edge's position (rain sweeps in down the street) comes from the same seed and clock. - DY1's running clock comes first; DY3 and this idea both edit the sky, so they're built back to back.
Needs: WE1, DY1 · Done when: on two instances a "60%" afternoon turns grey and rains (or not) at the same minute.
WE3: the weather in the work
Wet grass
- Lawn wetness = dew + recent rain − drying (sun, wind). It drives the existing humidity (heavier load, more
clogs). Above ~50% wet clippings stick and drop as clumps (counted as clippings left) and the bag fills
faster. These effects are read through grass condition: WE3 writes wetness into
LawnWeather(GR2), whose wet row gives bag fill ×1.5 and clumps above 0.5, and MO6 drops the clumps. - Dew dries by the sun (day.md): shaded cells stay wet longer.
- Shapes of a day, for the same lawn: a dry, clear day loses its dew by 11:00; after rain overnight the lawn stays above 50% until about 10:00; a 15:00 shower soaks it again for an hour or two. So the best plan differs: mow any time after 11:00 on the dry day, wait until the afternoon after a wet night, start early when a 15:00 shower is forecast.
Rain grows grass
- Soil moisture (derived from the last days' rain, never stored) multiplies daily growth by
0.8 + 0.5 × moistureinCompany.GrassHeightFor(dry week ×0.85, average week ×1.05, wet week ×1.25). A wet week puts on ~2 cm more than a dry one, so clients call back sooner a few days later. Example: a lawn that grows 0.6 cm a day in late spring (×1.2) puts on 4.3 cm in a dry week (moisture 0.1), 5.3 cm in an average one (0.5) and 6.3 cm in a wet one (0.9). - Soil moisture also goes into
LawnWeather(GR2: lush grass, scorch).
Wind
- The leaf blower pushes further with the wind and barely works against it. Target: with the same blower in a 12 mph wind, a pile lands ~6 m away blown with the wind, ~2 m against it, and some leaves drift back.
- Mower and trimmer clippings drift downwind (onto patios, into pools).
- Leaf blows are replayed on every machine, so the wind must be the same everywhere: it is, because it comes from the seed.
Rain starts mid-job
- You can always keep working; it just gets wetter (heavier load, clumps, the bag fills fast).
- In heavy rain you may also stop: the client pays for the share done, no abandon review, no reputation loss.
The rest can be booked again. Leaving a dry job early still gets the usual "left halfway through" review
(
AbandonReview).
Tests: the growth multiplier, the stop-in-rain settlement.
Needs: WE1, GR2 · Done when: a wet week makes clients call back sooner, and blowing against the wind is visibly worse on both instances.
WE4: where players see it, and bookings
Where it shows
- Cloud NineThe computer's weather app, next to Mail, Starzly and Hedge Fund Bank, on the old beige PC: 7 days, today and tomorrow by period, rain %, temperature, wind.
- The Daily ClippingThe morning paper's weather column becomes a 3-day box with icons, printed in black ink.
- The clock lineThe hub and HUD clock line show the current period, plus the next one in the field (WE2).
- °F or °C°F by default, °C in Settings (per player, PlayerPrefs, display only).
Bookings
You pick the day when you book a newspaper client, and you can move a visit when rain is likely. The forecast the evening before decides:
| The booked day | What happens | Reputation |
|---|---|---|
| Washout: rain ≥ 70% in both the morning and the afternoon | the client calls the evening before to move it | no loss |
| Rainy: the day's rain chance ≥ 40% | you may call to move it, or go anyway | no loss either way |
| Fair: below 40% | you go | a missed visit costs reputation and an angry review, as today |
- Anyone can make the call (
MoveBookingCommand, actor recorded), from the phone. - The washout call and "Looks like rain" lines go through
VoiceLines. - Tests: the washout rule; moving a booking costs no reputation.
Needs: WE1 · Done when: a guest moves a rainy booking and the host's calendar shows it, with no reputation lost.
WE5: rainy days have things to do
A washout must not be a skipped day: repairs and maintenance at home, a store run, and canvassing works better in the rain (people are home), once canvassing exists (J37b). The bonus's size is still to set.
WE6: ironing at home
Indoor work for rainy days and evenings, a small trade of its own: clients drop laundry baskets at grandma's house, you iron in the evening or while it rains, and in co-op one sibling can stay home ironing while the others go out (once siblings can split up, DY5). Housekeeping in clients' homes is EC12.
WE7: thunderstorms
A weather event (WE1's events list) with lightning and synthesized thunder (SN6). Work stops and the job pauses; a storm on a booked day makes the client call to move it, like a washout. Its icon is a cloud with a bolt.
WE8: storm aftermath
When a storm ends (WE1's aftermath hook): fallen trees and branches (the wood job exists), debris in gardens and pools, a headline, and storm clean-up calls, the big paydays. Rain-flattened grass comes with it (GR2's lodging).
WE9: seasons
Fill the season table (SeasonClimate): 14-day seasons in a 56-day year, each with its front frequency and strength,
temperature range, shower and fog odds, growth and dew. Turns Calendar.SeasonsEnabled on. Frost, heat, leaves and
snow (WE10-WE13) hang off it.
WE10: frost mornings and cold snaps
No mowing frozen grass until it thaws; mowing or walking on it anyway blackens it (GR2's frost row). Cold snaps are a weather event.
WE11: heat waves and droughts
Weather events. Heat waves make grass go dormant, scalping burns it, clients don't book, and sun-exposed cells scorch (GR2's scorch: heat 1 in a heat wave). Droughts dry the soil and bring watering jobs (WE14).
WE12: autumn leaves
Leaf fall in autumn: leaves cover lawns and pools (the leaf task; GR2's leaf cover), written into LawnWeather.
WE13: winter and snow
Snow cover on lawns (the snow icon), and a winter trade: shovelling, salting driveways.
WE14: weather-aware services
Lawn feed works better before rain and burns in heat; patch seeding needs rain or watering; watering jobs in droughts; gutter clearing in autumn. The treatments themselves are GA2's.
WE15: forecasts that shift
The forecast moves as the day gets closer ("rain moved to Thursday"), still honest about its odds.
WE16: more ways to hear the forecast
Grandma's knee (always right), the living-room TV, a phone radar. The car radio reading the weather is day.md's.
WE17: after the rain
A rainbow after rain, puddles on paving, snails and worms in Critters, rain on grandma's windows and roof, steam off
a drying lawn.
WE18: rain gear
A raincoat or poncho (with the safety gear plan) and a tarp for the van.
WE19: clients and the rain
Tips and complaints for working in the rain.
WE20: weather in the other trades
Rain on fresh glass cleaning, diluted pool chemicals, ladder and chainsaw risk in gusts.
WE21: microclimates per district
Different weather per district, only if districts become real places.
Tuning
Starting numbers, tuned against the climate targets.
| Name | Value | Idea | What it does / why |
|---|---|---|---|
| Front spacing | every 3-6 days | WE1 | fair spells between fronts |
| Front build-up | a few hours of cloud | WE1 | the warning before rain |
| Front rain | 6-24 h | WE1 | then it clears with a wind shift |
| Fog | after rain + a clear calm night; gone by ~10:00 | WE1 | a soaked lawn the morning after |
| Periods | morning 7-11, afternoon 11-15, evening 15-19, night 19-7 | WE1 | simulated hourly, shown by period |
| Forced fair days | days 1-3, 0% shown | WE1 | the tutorial gardens are learned dry |
| Daily rain chance | 1 − (1 − morning)(1 − afternoon)(1 − evening) | WE1 | one number for days 3-7 |
| Forecast reach | today and tomorrow by period, days 3-7 one icon | WE1 | |
| Sky types | cloud and rain-chance bands in the sky-type table | WE1 | the icon is derived from the values |
| Seasons | 14-day seasons, 56-day year (off) | WE1 | season-ready code |
| Late spring | growth ×1.2, lows ~50 °F, highs ~70 °F | WE1 | the one endless season for now |
| Dew | burns off by 11:00 on a clear day; heavy after a clear calm night | WE1 | |
| Wind | mph, 8 directions, gusts | WE1 | |
| Climate targets | 1 washout / 2 weeks; 1-2 rainy days / week; fog 1-2 mornings / week; streaks ≤ 6 days | WE1 | over a 56-day run |
| Calibration | ±3 points per 10% bucket over 10,000 periods | WE1 | the honest-odds test |
| Cloud build-up | 1-2 h before rain | WE2 | the sky warns you in the field |
| Clump threshold | lawn wetness above ~50% | WE3 | clumps and a faster bag |
| Growth by moisture | ×(0.8 + 0.5 × moisture): ×0.85 dry week, ×1.25 wet week | WE3 | a wet week puts on ~2 cm more |
| Blower and wind | ~6 m with a 12 mph wind, ~2 m against it | WE3 | a target, not a formula yet |
| Washout | ≥ 70% rain in both the morning and the afternoon | WE4 | the client calls to move it |
| Rainy day | the day's rain chance ≥ 40% | WE4 | free to move |
Co-op
Weather is a pure function of (seed, hour), and the clock is already synced, so every sibling sees the same sky and the same wind (leaf-blow replays stay identical).
- State:
WeatherModelinScripts/Sim, pure; the only new commands areMoveBookingCommandand the debugForceWeatherCommand. - Ownership: everything is shared and derived; °F/°C is per player (PlayerPrefs, not the save).
- Host-only:
ForceWeatherCommand.MoveBookingCommandis anyone's (actor recorded). - Randomness:
SimRandomfromState.seedonly, with named salts (SD2). - Channel: deterministic generation from seeds; bookings through company state.
- Packets: nothing new is sent.
- Late joiners: compute the same weather from the seed and the synced clock.
- Secrets: none.
- Cinematics: none.
- Save: no new field (
State.seedexists);ForceWeatherCommandstores a day override (a save version bump only if it ships outside debug). Data version unchanged. - Voice lines: the washout call and "Looks like rain" go through
VoiceLines. - Tests: the ones in each idea, plus a two-instance run: the same forecast, the same rain at the same minute, mismatches=0.
Tech
Who owns what
This page owns what the weather is (the hourly curve, the forecast and the truth), what it does to the work (wetness, soil moisture, wind on leaves and clippings, stopping in the rain) and the booking rules.
- The day (day.md, DY1-DY4): the clock, the sun, dew drying by the sun, the car radio. WE2 needs DY1.
- Grass (grass.md, GR2): reads the weather only through
LawnWeather. WE3 writes wetness and soil moisture; frost, heat and leaf fall come later (WE10-WE12). Until WE3,LawnWeathercomes from the calendar. - Sound (SN1): reads only
SoundWeather, filled from WE2's continuous values; storms, seasons and snow add fields later. - The mower (mowing.md): humidity loads the deck; MO6 drops the wet clumps.
- Demand and moneyJobs.md and work.md read the day's rain (growth, demand); garden.md and economy.md keep weather moves free. difficulty.md has no weather row: the forecast stays honest on every preset.
- Seeds (seeds.md): the save seed and named salts (SD2).
The code
- Today:
Calendar.WeatherOn(day),HumidityAt(day, minute)andWeatherLabelinSim/Company/VanPacking.cs(one roll per day, three types); the visuals inAmbiance/Weather.cs. - New:
WeatherModel(Scripts/Sim, pure: hourly state from (State.seed, hour)),SeasonClimate, the events list and the aftermath hook,ForceWeatherCommand,MoveBookingCommand; growth inCompany.GrassHeightFor; the lawn's values inSim/Mowing/LawnWeather.cs; sound's inSoundWeather. - Files the early-game steps also edit:
Company.cs,ClientTexts.cs,HubComputer.cs,HubPaperPhone.cs,GarageUI.cs,HudController.cs,MissionController.cs. WE1 and WE2 are mostly new files plusCalendarandWeather.cs; WE4 touches the computer and the paper. - Sandbox: wind and a weather override independent of the day (docs/dev/sandbox.md).
Save
No new field: the save seed already exists, and everything else is recomputed. °F/°C lives in PlayerPrefs.
Tests
- WE1: determinism (same seed → same week); calibration (±3 points per 10% bucket over 10,000 periods); climate targets over a 56-day run; days 1-3 dry.
- WE3: the growth multiplier; the stop-in-rain settlement.
- WE4: the washout rule; moving a booking costs no reputation.
- Co-op: two instances show the same forecast and the same rain at the same minute, mismatches=0.
Open questions
- The canvassing bonus in the rain (WE5): how much better, and in which form (more doors answered, warmer replies)?
- The wind's push on the blower (WE3): the 6 m / 2 m example is a target; the force formula isn't decided.
- Pollen and sun: the skills page wants high-pollen days (hay fever) and sunny days (sunburn) from the weather; neither is in this spec yet.
Rejected
- One roll per day from the day number (the old
Calendar.WeatherOn): the same weather in every save, no forecast, no streaks. Replaced by fronts from the save seed. - A percentage that follows the icon: it would add nothing. The chance comes first, the icon from it.
- Syncing the weather over the network: not needed; it is a pure function of the seed and the synced clock.
- Three sky presets in
Weather.cs: the sky switched instead of changing gradually; continuous values instead. - A difficulty dial for the weather (difficulty.md): the forecast stays honest on every preset.