Skip to content

Places: Woodland and Window studio ​

Consolidated on 2026-10-13 from the design work of 2026-10-11 and 2026-10-12.

PlayPets has two places: Woodland, the outdoor yard it starts in, and Window studio, a calm room above a city to keep open while working. Both hold the same friends, conversations, games, garden and collection; only where they stand changes. A place is more than a picture: its floor, the activities it offers, its weather and its sound have to agree with what people see. To add one, follow Add a place for friends.

One registry ​

src/content/worlds.json lists every place. An entry has a stable id, a label and an about key from the page string tables, an optional chatter key for idle lines, optional art per time of day, authoredLighting, optional windowPanes, a fit, its geometry and its capabilities.

src/yard/worlds.js reads the registry. worldFor sends an unknown or removed id back to woodland, so changing an id later returns saved choices to Woodland. worldAllows treats a capability as on unless the entry sets it to false. setupSky in src/yard/sky.js builds the Place select in the scene menu from the registry and saves the choice with remember('world') (local storage), beside the time, weather and season choices.

Capabilities ​

A capability belongs to a place, not to an activity's code. Each flag is checked where its work happens:

CapabilityWoodlandStudioWhat it turns on
skyonoffPainted sky, sun, moon, clouds and stars (easel.js, scenery.js); weather remarks also need it (remarks.js)
weatheronon, behind the panesRain and snow on the weather canvas and the land (scenery.js, environment.js)
wildlifeonoffBirds, bugs to catch and fireflies (scenery.js)
fishingonoffThe lake's water and casting (catch.js, environmentLake)
seasonalEffectsonoffFalling leaves and petals, festival cards and lights (scenery.js, festival.js, environment.js)
ambientonoffThe woodland sound mix (soundmix.js); activity cues still play

The studio's idle lines come from its chatter key (world.studio.lines) instead of the outdoor time and weather lines, so friends do not talk about stars or snow falling indoors. A third place gets its own about and chatter keys rather than inheriting the studio's.

Floor geometry and fit ​

geometry.fieldTop is the back edge of the walkable floor as a fraction of the image height: 0.66 in Woodland and 0.55 in the studio. src/yard/field.js uses it when the place's picture is shown and the composition's own field when the painted fallback is.

fit: "cover-floor" keeps the picture's proportions: environmentFrame in src/yard/environment.js scales the image to cover the yard and lines its floor up with the yard's. cover-bottom aligns the bottom edge instead. The decision was to crop, never stretch: very wide mini strips lose the top of the window or the hills and show more floor, and narrow windows lose the sides. Woodland was stretched in wide strips before this and now uses the same transform.

Everything placed over the picture uses that one frame: the lake (environmentLake, from geometry.lake with from, to, center and radius), the window panes and the seasonal lights. Fishing in src/yard/catch.js asks for the lake again when the size, the place or the picture-or-fallback mode changes, so a cast never aims at water that moved. A place without fishing returns no lake, and both manual and automatic fishing check the capability.

Authored lighting ​

Woodland's land is one of four transparent seasonal layers (green, spring, autumn, winter in src/art/environments/), drawn over the live sky. environmentLook tints it for each time of day and for rain.

The studio has a picture for each time of day: studio-modern-city-morning, -day, -evening and -night. A colour filter cannot turn a midday city into a sunset or a lit night skyline, so each time was painted on its own from the same camera, and "authoredLighting": true tells environmentLook to add no filter or tint. A place with pictures but without authored lighting gets a gentle filter for each time of day. The room is ivory stone with slim graphite frames, a cream chair and restrained metal furniture, with an open floor where the friends stand.

Weather behind window panes ​

The studio enables weather and lists three windowPanes, normalised rectangles over the glass. weatherPanes moves them through the same frame as the picture, so rain, snow and overcast shading are clipped to the glass that is still visible. The floor stays dry and gets no ripples, no second whole-room tint is added, and when cropping hides every pane the weather canvas does no work at all. Reduced motion draws still weather.

What stays outdoors ​

Fishing, wildlife, falling leaves and petals, festival effects and cards, the sky and the forest sound stay in Woodland. The studio has no clickable water. A future indoor or city sound needs its own mix: turning on ambient today selects the woodland one.

Switching places ​

The worldChanged handler in src/app.js ends any game and fishing, releases every friend from its trip, then enters the new place and lays out friends, the garden and gifts again. Pending remarks are cancelled first, and a festival card that was not seen does not use up its yearly announcement. Friends keep their identity, saved positions, relationships, AI connections and collected items; none of that is stored per place.

Painting and loading ​

The easel paints only when the scene or the size changes, or when a picture finishes its first load (see the performance standard). A place's pictures load only when it is selected. While the next picture decodes, the current one stays on the wall; a late image paints only if it still belongs to the active scene. Crossing between places never fades the outdoor painting over the room. If a room picture cannot load, the land is a plain warm surface rather than an outdoor hill.

Artwork and sources ​

The selected studio prompts are in src/art/environments/MODERN-STUDIO-PROMPTS.md, and the environment provenance in src/art/environments/README.md. The earlier studio pictures (studio.png, studio-night.png and the four studio-city-* images of the warm wooden room) are kept as sources in assets/sources/environments/; the app does not ship them. Art direction for the scenery is in the art direction record.

Places not built ​

These are proposals, not choices in the app:

  • Reading café: indoor capabilities, a tiled or timber floor and a counter at the back; it needs its own sound rather than the forest mix.
  • City terrace: outdoor sky and weather but no fishing or wildlife, a railing with depth, its own floor line and a city sound palette.
  • Quiet observatory: a room with its own night view and lines.

Expose a place only when its art covers every time of day, its floor fits the whole cast and the tools, and its capabilities, lines and sound are reviewed together.

Checks ​

tests/worlds.test.mjs, tests/studio-environment.test.mjs, tests/window-weather.test.mjs, tests/world-remarks.test.mjs, tests/world-festival.test.mjs and tests/environment.test.mjs cover the registry, the frame, window weather, remarks and festivals. scripts/visual-audit.mjs renders both places at full, mini and wide sizes (Visual review), and the real-app E2E checks that entering the studio leaves no fishing line or outdoor effect behind and that Woodland comes back intact.

Follow-up: current catalog (2026-10-15) ​

The current registry offers Hill garden, Stone courtyard, Lakeside cottage and Cozy living room. Stable IDs retain woodland and studio for saved selections. The shared capability and geometry contract also supports imported background packages; see architecture and background packs.

Free and open source under the MIT license. Not affiliated with OpenAI; Codex is a trademark of OpenAI.