Game Mower wiki

Game

Menu, settings & savesMN

The title over grandma's street, your saves as polaroids on the fridge, a new game, the "Who's playing?" room, when the game saves (bed, grandma's portrait, a job done), the pause menu and the settings screen.

The game opens on grandma's street, and your saves are polaroids stuck to her fridge. It saves when you go to bed, when you finish a job, and when you say hi to grandma's portrait in the hall. She winks: she saw that. Everything else (the settings, the pause menu, getting your siblings in) stays out of the way.

The player's view

The title. The camera drifts slowly over grandma's street: the traffic, the weather, a cat on a wall. The menu sits on top: Continue, New game, Load, Join, Settings, Quit. Continue picks up your newest save.

The fridge. Load opens grandma's fridge door. Every save is a polaroid held up by a magnet: a photo of the place where you last saved (grandma's house at night with the lights on, Mrs. Higgins' lawn freshly striped), and under it, written by hand, the save's name, the siblings, the day, the money and the time played. Click one to play it, rename it, or throw it away (it crumples into the bin).

A new game. You type a name for the save, or keep the silly one already in the field. Then comes the "Who's playing?" room: start alone, or wait for your siblings. Your brother clicks Join on your name in his Steam friends list (or accepts your invite), and his card pops up next to yours. You press Start, everyone makes their face at the same time, and the intro plays.

Saving. There's no save button. The game saves when the whole family goes to bed (you wake up in the saved morning), when you knock on a client's door to say you're done and get paid, and when you stop by grandma's portrait in the hall. Press E on it: her googly eyes follow you, she winks and says "I saw that.", and the save is done. Every time it saves, a camera clicks, a polaroid slides into the corner of the screen, and it fades out. The portrait comes with every house the siblings ever buy: grandma insists on keeping an eye on things.

Quitting. Esc pauses the game when you play alone (online never pauses). The pause menu has Settings, "I'm stuck", "Open to siblings", Back to menu and Quit. If anything happened since the last save, it tells you: "Last saved 14 minutes ago, at grandma's portrait. What happened since is lost." Quit anyway, and next time you're back where the polaroid was taken. A stone through a window you'd rather forget can be undone this way. That's allowed.

Settings. Four tabs: Controls, Display, Sound, Game. Every change works at once, with no Apply button. Settings belong to your machine: your brother's mouse speed is his own business.

Ideas

MN1: the title over grandma's street

The title is a HubUI screen over the live hub: TitleScreen drifts the camera over the street and the house waits for it. Buttons: Continue (only with a save), New game (confirms before overwriting the one save), Host, Join by IP (the field starts with the last address), Settings, Quit. "Back to menu" sits in the house menu and the job pause, and RpcClosing tells guests why they were sent to their title. -netjoin, -nethost and -notitle skip the title (TitleRules). MN4 and MN6 change the buttons; this code stays as built.

Needs: - · Done when: built (step 0b): host a new game online, a guest joins by IP from its menu, both watch the intro, the host's Back to menu sends the guest to its title, a failed join says so, settings survive a restart.

MN2: save points

The game saves at three moments, and only then. Nothing is written between them: quitting, a crash or a power cut takes you back to the last save point.

Save pointWhenWhere you load
Bedthe day changes after everyone sleeps (the beds' group rule, DY1)the new morning, 7:00, in bed
A job doneright after the client pays at the door (EC8); until EC8 is built, when the job ends as todayat the client's door, after the pay
Grandma's portraitany time, by pressing E on it (MN3)in front of the portrait, at the time it was
  • The first save is written when the drop-off ends (ST3): a new game left during the intro leaves no polaroid on the fridge.
  • What's saved: the whole company (SaveData), the lawn memory files of every lawn, the polaroid (MN4) and the save's card (name, siblings, day, money, time played, place). They're written together: a lawn file is never newer than its save.
  • A job in progress is not saved. A save point while a sibling is mid-job (siblings on different lawns, J37) saves the rest of the company; that job loads as not started, its lawn as it was at its last save.
  • The click: every save point plays a camera click and a quick white flash in a corner, and the new polaroid slides in there for polaroidShow, then fades. It's the only sign. There's no "Saving..." text, ever.
  • Quitting with unsaved play: Back to menu and Quit (MN8), and the window's close button, first say how long ago and where the last save was ("Last saved 14 minutes ago, at grandma's portrait. What happened since is lost."), with Leave and Stay. With nothing to lose they just go.
  • Undoing by quitting is allowed. Difficulty is about consequences (DF3), and a player who quits to undo a broken window gets their window back. That's accepted, like Stardew Valley.
A day's save points: bed in the morning, each job done, and the portrait whenever you pass it

Needs: DY1 · Done when: solo and as a host with a guest: a bedtime, a finished job and the portrait each save (the click, the polaroid in the corner) and load at their place and time; quitting mid-job after a portrait save loads at the portrait with the job not started; killing the game between two save points loses exactly what happened since the last one.

MN3: grandma's portrait

The save point at home. A framed photo of grandma (Claudia, CH1) in her best brooch, hanging in the hall of grandma's house, with googly eyes behind the glass.

  • Always watching: her pupils follow the nearest sibling in the room. Walk past and she tracks you.
  • Press E: she winks, says one line, and the game saves (MN2). The prompt says "Say hi to grandma".
  • Her lines (portraitLines, voiced by grandma's cast voice, never the same twice in a row): "I saw that.", "Wipe your feet.", "Is that my good towel?", "Saved. Now go mow something.", "Your grandfather never saved anything. Not a penny.", "Don't touch my room.", "Sit up straight.", "Who ate my butterscotch?", and more to write.
  • Every property: each house the siblings buy later comes with her portrait in its hall (she mails one, with a note). The property's spec places it; it saves the same way.
  • In co-op: any sibling can say hi. It saves the host's company, everyone in the house hears her, and everyone sees the polaroid slide in.
  • No text on the frame: the save happens through her, not a sign.

Needs: MN2, CH1 · Done when: in grandma's house, solo and with a guest, her eyes follow the nearest sibling, pressing E (as host or guest) plays a line and saves, and the next line is a different one.

MN4: the fridge (a list of saves)

As many saves as you like. Load opens grandma's fridge door, full screen: each save is a polaroid held by a magnet, newest top left. Continue on the title loads the newest.

  • The polaroid is a photo of the place of its last save point, taken from that place's photo spot (the front of the house, the client's front lawn), whatever is there at that moment: night, rain, the siblings standing on the lawn.
  • Under it, by hand: the save's name, the siblings' names, the day ("Day 4, Tuesday"), the money, the time played, and later the difficulty (DF1: "Weekend Pro", or the Custom mix).
  • Click a polaroid: Play, Rename, Throw away. Throwing away asks first ("Throw away 'The Lawn Rangers'? This can't be undone.") and the polaroid crumples into a bin.
  • More than fit on the door: the fridge scrolls; the magnets keep coming.
  • A damaged save shows as a torn polaroid (MN7).
  • Before MN2, the fridge works with today's saving (after every action); the photo is then taken when you leave the game.
  • The old single save (save.json and its lawns/ folder, from before MN4) moves into the list on the first start, named "The old save".
The fridge: one polaroid per save, newest top left

Needs: - · Done when: three saves made one after the other show as three polaroids with the right photo, name, siblings, day, money and time played; Continue loads the newest; renaming and throwing one away work and survive a restart; an old save.json turns up as "The old save" and plays on.

MN5: a new game

From the title's New game, in order:

  1. Name the saveA text field, at most saveNameMax characters, already filled with a silly suggestion ("The Lawn Rangers", "Mow Money", "Blade Runners", "Grass Menagerie"...) and a die that rolls another. It isn't the company's name: you register that in the game, later.
  2. Difficulty (DF1, when it's built): three preset cards and Custom, after the name.
  3. Who's playing? (MN6): start alone, or wait for siblings.
  4. Your face (SI1, SI2): everyone in the room at once.
  5. The intro (ST1-ST3). The first save is written when the drop-off ends (MN2).
  • New game never overwrites: it adds a polaroid. Two saves can have the same name.
  • The seed is made here, a new one each time (SD4).
  • Back at any step returns to the one before, up to the title. Nothing is created until the drop-off ends.
From the title to the first save: name, difficulty, the room, faces, the intro

Needs: MN4, MN6, SI1 · Done when: solo and with a guest: New game, a typed name, the room, the faces and the intro end in a new polaroid with that name, next to the earlier saves, none of them touched.

MN6: the "Who's playing?" room

Every game goes through it: New game after the name, and Continue or a polaroid's Play before loading. It replaces the title's Host button. This is the screen; how players find each other and who they are is the co-op spec's (CO7, CO8).

  • The host's side: the save's name, the host's card, and two buttons, Start alone and Wait for siblings. Waiting opens the game to the host's friends, with Invite a friend (CO7). Guests' cards pop up as they arrive, each with their sibling (their face, or "new" on a new game) and a tick when they're ready. Start goes on when the host wants: it doesn't wait for every tick.
  • The guest's side: the title's Join lists friends with an open game (CO7); joining one, or a Steam invite, lands in the same room: the save's name, who's in, and "Waiting for Louis to start...". A failed or full join says why (CO7).
  • Which sibling a guest plays: on a continued save, a guest gets back the sibling they played last time (CO8). A new guest takes a free sibling, and makes their face (SI1) when the host starts.
  • Up to maxPlayers (CO7) cards.
  • Later joiners: "Open to siblings" in the pause menu (MN8) opens a running game; who joins then gets up from their bed or comes in beside the host (CO9), after making their face if they're new to this company.
  • Dev builds keep join by address (two instances on one Mac, CO7's dev line): the room then shows the address, and the title's Join has the address field.

Needs: MN4 · Done when: on two instances: the host's New game waits in the room, the guest joins (CO7's way, or by address in a dev build) and appears with a tick, Start takes both to the faces; on Continue, the same guest gets back the same sibling; Start alone never opens the game.

MN7: safe saves

A save never gets lost to a bad write, a crash or an older build.

  • Write safely: each save point writes into a temporary folder, then swaps it in. A crash mid-write leaves the previous save whole.
  • Backups: the last backupsKept save points of each save stay in its backups/ folder, oldest dropped first.
  • A save that won't read is never overwritten and never silently replaced by a new game (as today: SaveSystem.Load starts fresh, and the next write replaces the broken file). Its polaroid shows torn, with "This one got damaged" and Load the one before (the newest backup that reads). The broken file stays where it is.
  • Old saves load through the migrations (Company.Normalize), as today. A save from a newer build shows "Made with a newer version of the game" and won't load (and is never written).

Needs: MN4 · Done when: in edit-mode tests and by hand: a save cut off halfway through writing loads the save point before it; a save with garbage in it shows torn and loads its newest good backup; a save from a newer version stays untouched; four save points in a row keep the last three as backups.

MN8: the pause menu

Esc (Start on a pad) anywhere outside a cinematic, with no screen open, opens it: the game's only menu (UI15; Esc closes an open screen first, UI8). It replaces the house's Tab menu footer and the job's pause.

ItemWhat it does
ResumeBack to the game (Esc again does the same).
SettingsThe settings screen (MN9).
Open to siblingsHost only, while the game is closed: opens it to the host's friends, with Invite a friend, like the room (MN6, CO7).
I'm stuckPL16: always there, never greyed.
Back to menuTo the title. Warns about unsaved play (MN2). A host's confirm also says the guests will be sent to their titles.
QuitTo the desktop, with the same warnings.
  • Pausing: alone, the game stops (DY1); online it never does, and the menu says "The game keeps going".
  • A guest's Back to menu leaves the host's game. Nothing is lost: the host's save points are the host's.
  • Harold's manual gets its line here when it's built (mowing).

Needs: - · Done when: solo, Esc stops the clock and every item works; online, the clock keeps going, a guest's Back to menu leaves only them, and the host's warns about the guest before sending them home.

MN9: the settings screen

One screen, from the title and the pause menu: four tabs, each with Reset this tab. Every change applies at once and is kept for next time. Settings are this machine's (PlayerPrefs, GameSettings): never in a save, never sent to another player. Each setting belongs to the spec that needs it; this screen lists the MVP's:

TabSettings
ControlsMouse look speed, stick look speed, invert Y (mouse, stick), sprint hold/toggle, holds as presses (PL6), bar hold/toggle (MO8a), rumble (PL6)
DisplayFullscreen (built), field of view, head bob, camera shake (PL6), grass detail (GR3)
SoundMaster, voices, effects (built)
GameSubtitles (on by default; today the intro's are always on), captions for sounds (SN1, UI7; on by default), Gauges (MO8a)
  • A setting comes with its feature: a tab shows only settings for things that exist in the build.
  • The built "Look speed" becomes the mouse look speed (PL6).
  • Unreadable settings fall back to the defaults (as built), and older settings files read what they lack as default.

Needs: - · Done when: every setting in the table changes the game at once and survives a restart; Reset this tab puts back the defaults of that tab only; a guest's settings never change the host's.

MN10: the full settings pass

For the demo's Steam layer: resolution, display mode (fullscreen, borderless, windowed) and monitor, vsync, a frame cap, UI scale; the rest of the sound settings as their codes land (a slider per mixer group, dynamic range, mono, captions, mute in the background, from the sound spec), rebinding (PL8), the pad in every menu (PL9), °F or °C (weather), and language with localization. Plus the gamepad driving the title, the fridge and the room.

MN11: the first launch

The very first start asks two things, once, over the title: headphones or speakers (the sound spec's setting), and a quick look at the frame rate that picks the grass detail (GR3). Everything else starts on its defaults.

MN12: the title over your own street

The title camera drifts over the newest save's street as you left it: its day, its weather, your mowed lawn, the siblings' mower by the garage. A new player sees grandma's jungle.

MN13: grandma notices

The portrait's lines react to what she can see: muddy footprints in the hall, the lawn uncut for a week, a broken window, a sibling who hasn't said hi in days, the first night in a new property.

MN14: the album

Every polaroid a save ever took stays in an album in grandma's house: the company's story, day by day. The ending (ST8) could show it.

Tuning

NameValueIdeaWhat it does / why
polaroidShow2.5 sMN2How long the save's polaroid stays in the corner. Long enough to see, short enough to forget.
polaroidSize480 × 360 pxMN4The photo's size: sharp on the fridge, small on disk.
portraitLines12 to startMN3Her line pool; never the same twice in a row.
saveNameMax28 charactersMN5Same as the company's name. Fits under a polaroid in two lines.
backupsKept3MN7Save points kept per save. Enough to step back past a bad one.
maxPlayersCO7's (2 in the MVP)MN6Cards in the room.

Co-op

  • Where the save lives (host only) is the co-op spec's call; this spec follows it. A guest's own saves are never touched by playing in someone else's game (as built: GameSession.Guest).
  • Save points are host writes. The bed and a job done are the host's sim events; the portrait is a command (SaveGameCommand) any sibling can run through GameSession.Execute. The host writes the file, and everyone sees the click and the polaroid.
  • What syncs: the save points' moments, the portrait's line (which one, from the host's seed so everyone hears the same) and her gaze target. The room's cards, readiness and Start go through the network session.
  • What doesn't: the fridge, the settings and the pause menu are each machine's own. Online never pauses.
  • Mid-way joiners come in through "Open to siblings" (MN8), as CO9 and CO10 say.
  • Leaving and dropping out are CO10's: a guest who leaves loses nothing; when the host leaves, everyone goes back to the host's last save point (MN2).

Tech

  • Slots on disk: <persistentDataPath>/saves/<id>/ per save, id a short random string: save.json (the company), card.json (name, sibling names, day, money, time played, place, difficulty, save version, game version, last saved at), polaroid.png, lawns/ (LawnMemoryFiles, today under persistentDataPath/lawns/<lawnId>), and backups/1..3/. The fridge reads only the cards and polaroids.
  • Writing only at save points: GameSession.Persist() (today it writes after every command) stops writing; a new save-point call writes the slot. Lawn memory writes are kept in memory until the next save point.
  • The atomic write: write saves/<id>.tmp/, rotate backups/, then rename into place.
  • -profile <name> (two instances on one machine, docs/dev/testing.md) picks its own saves root, saves-<name>/. -slot <id> (dev) loads a save without the title.
  • Commands: SaveGameCommand (the portrait; records the place and time in the state for the card). The bed and job done save from the commands that end the day and the job.
  • Settings: Settings.cs (PlayerPrefs, apply at once) and GameSettings in Sim/Company/MenuRules.cs with Clamped(). The player id MN6 uses is CO8's, kept with the profile, not the settings.
  • The title and menus: UI/HubTitle.cs (title), TitleRules and JoinAddress (MenuRules.cs), Net/NetSession.cs (host, join, closing); Steam lobbies and invites behind the same screens (CO7).
  • Tests (edit mode): listing slots and Continue's pick (newest), the atomic write and backup rotation, a broken file showing torn and loading its backup, a newer-version save refused, the old save.json migration, settings clamping and defaults per tab. By hand: the two-instance recipe through the room.
  • Steam Cloud (Steam platform spec) syncs saves/.

Open questions

  • The pad in the MVP's menus: PL5 wants every row on both devices, PL9 (demo) owns the pad in menus. Does the MVP's title, fridge and room need the pad?
  • The bed in co-op with siblings apart (J37, DY5): the bed save needs everyone asleep; a sibling still on a lawn at night blocks it, as the beds' rule does today.
  • More portrait lines: written with the characters spec's voice for grandma.

Rejected

  • Saving after every action (as built): quitting could never take anything back, and a save point is a moment the player feels. Replaced by the three save points.
  • Saving only at bedtime: a quit or a crash would lose up to a whole day (about 30 real minutes).
  • A save button anywhere in the pause menu: the portrait does it, in the house, with a joke.
  • "Load this morning" snapshots: the save points and the backups cover it.
  • Three fixed slots: a list costs the same and never forces an overwrite.
  • Saves named after the siblings automatically: a typed name, with a silly suggestion already filled in.
  • A Host button on the title: every game goes through the room (MN6).
Source docs/game/menus.mdEdited 2026-10-03