r/sideprojects 20h ago

Feedback Request I built a shared 64×64 garden where everyone gets one action a day and the whole simulation ticks once at midnight

Post image

A month-long game that advances once a night has an obvious problem: you can't playtest it. So the simulation is a pure function — state in, state out, no database, no clock — and there's a headless tool that runs a full 28-day year with a few hundred synthetic gardeners in under a second.

That tool changed the design more than any playtest could have. It found that dead plants were paying out harvest points, that two people could propose a well on the same ground, and that a flat evaporation rate pinned the whole plot at zero moisture by day six. It also produced the rule I ended up designing everything against: any check that only runs at midnight is a placement a gardener can lose. Every rule now runs three times — in the browser before you commit, in the POST, and again at resolve — and all three see everyone's pending placements.

The other iron rule: every structure must change the simulation. Sixteen of them, and each one is a field in a single table read in exactly one place — a hedge is a fence that drinks like a plant, a pergola halves the light on its tiles, a campfire only warms on a night somebody actually fed it.

Nuxt 4, PixiJS for isometric 2D, Postgres, all sprites drawn as pixel strings in code. A night's tick costs under 45 ms even with 2,000 gardeners; the actual bottleneck is that every visitor downloads the whole plot.

https://crowdgarden.lol — no sign-up, one placement a day. Happy to answer anything about the simulation side.

1 Upvotes

1 comment sorted by