Marjorine's Manor
In developmentA cozy game about running a Victorian rooming house, where helping each tenant move on with their life is the whole point, and it costs you their rent.
At a glance
- Outcome: You manage a multi-room Victorian home and the people living in it. Building relationships with tenants moves their stories forward and helps each one get unstuck. Spiritfarer’s emotional arc, played at Animal Crossing’s pace and register.
- Status: In development. 3D Godot prototype with tenant relationships, three five-beat quest arcs, an attic mystery, light economy pressure, and style-based room building.
- Role: Solo.
- Stack & libraries: Godot 4.x (Forward Plus) with GDScript, the Dialogic
addon for dialogue playback, and a content layer of six JSON files in
data/read by ten autoload managers. - Source: Private.
- Limitations: MVP scope. Every quest beat is currently three lines of dialogue, 59 lines across the whole game, in 23 linear timelines, none of them branching. There’s no title screen, no demo endpoint, and no balance pass.
The idea, and what it costs you
Cozy games are usually about accumulation: a bigger farm, a nicer town. This one is about departure. Each tenant arrives stuck on something, and the arc of knowing them is the arc of them working it out and eventually leaving.
And leaving takes their rent with it. Rent is the live tenant count times $300 a month, against $600 of flat monthly bills. So finishing a tenant’s story is the thing that costs you, and redecorating their empty room is how you replace them. The emotional beat and the economic one are the same event, which is the whole reason the premise works as a game rather than as a mood.
Decoration decides who can live here
Every furniture item carries weighted style tags, and placing it recomputes the room as percentages. Leave build mode in the empty apartment with the room at 50% or more vintage and Jasper moves in; 50% or more minimalist and Zoe does.
Only one of them ever arrives, and which one is entirely a consequence of what you chose to buy. That’s what “the house is the mechanism” actually means here.
An attic mystery runs underneath as the long thread.
How it’s built
A tenant isn’t a record. There’s one dictionary of tenant id to heart level, and being in it means living here. So one erase despawns the NPC, unlocks the apartment for building, and drops the rent. Three consequences from removing a key.
The honest cost of that: the dictionary has no redundancy, which is why progression needs a fail-safe that can put a tenant back.
Each tenant story is a five-beat sequence in one JSON file. A beat names its own trigger, whether a conversation, a specific gift or a finished objective, and one gate checks the trigger, the relationship level and the required item together. Beats also declare their effects: raise a heart, open an objective, or, on the last beat, mark the tenant departed. There’s no separate move-out system; leaving is just the final beat’s effect.
Data-driven inside fixed schemas, not all the way down. Six JSON files hold the tenants, quest beats, attic items, journal entries, furniture catalog, and asset paths; ten autoload managers hold the rules that read them. A fourth tenant arc built from the three existing trigger types is content work. A fourth trigger type is a code change.
Some rules are frankly hardcoded and it’s worth saying so: which rooms accept building, the Sadie restyle exception, the attraction thresholds, and Elena’s birthday are all constants in GDScript.
The documentation is ordered for someone arriving cold: quick start, architecture, gameplay systems, content editing, scene navigation, then save/load and testing. That’s the same discipline as the rest of my projects. If the next person can’t get oriented, the design isn’t finished.