feat(content): add upper floor slice

This commit is contained in:
2026-05-10 07:34:51 -05:00
parent daa5e9d655
commit 83e4877852
18 changed files with 245 additions and 15 deletions
+7
View File
@@ -26,3 +26,10 @@
- [x] Feature: / brings focus to terminal
- [x] Feature: Add "Restart" option to option menu
- [x] Bug: gear icon is still wayyyyyyy toooo smallllll it needs to be like 4x larger at least.
- [ ] Add a "wait" tile.
- [ ] Add a mechanic where after the player waits 3 times or moves six times the light goes out and needs to be relit.
- [ ] Add attack options for most encounters. Rarely this will be a good idea though.
- [ ] Add a failure condition for attacking at the wrong time. Make the reasons for the failure condition contextual, for example, when they attack the stair sleeper they might trip on the stair and get injured.
- [ ] If the user says "light match" or "light match" the response should be "use match with what?"
- [ ] If the user says "use match with letter" they should burn the letter.
- [ ] There should be a lighter in the smoking room that allows unlimited lighting.
+8 -1
View File
@@ -16,10 +16,14 @@ describe('assembled world', () => {
'music-room',
'servants-passage',
'laundry',
'stair-up',
'bedroom',
'nursery',
'attic',
]))
})
it('contains the authored opening and main-floor items', () => {
it('contains the authored opening, main-floor, and upper-floor items', () => {
expect(Object.keys(world.items)).toEqual(expect.arrayContaining([
'broken-cigarette',
'lamp',
@@ -33,6 +37,9 @@ describe('assembled world', () => {
'grandfather-clock',
'dinner-place-setting',
'covered-cage',
'childs-drawing',
'music-box',
'toy-dog',
]))
})
+22
View File
@@ -180,4 +180,26 @@ export const encounters: Record<string, EncounterDef> = {
onFailed: { narration: narration('linen-shape', 'failed'), retreatTo: 'servants-passage' },
defaultWrongVerbNarration: narration('linen-shape', 'wrong-verb'),
},
'stair-sleeper': {
id: 'stair-sleeper',
aliases: ['stair sleeper', 'sleeper', 'figure', 'person', 'body'],
startsIn: 'stair-up',
initialPhase: 'seated',
phases: {
seated: {
description: narration('stair-sleeper', 'seated'),
transitions: [
{
verb: 'wait',
chipLabel: 'WAIT',
narration: narration('stair-sleeper', 'wait-resolved'),
to: 'resolved',
},
],
},
},
onResolved: { setFlags: { hallwayShifted: true } },
onFailed: { narration: narration('stair-sleeper', 'failed'), retreatTo: 'parlor' },
defaultWrongVerbNarration: narration('stair-sleeper', 'wrong-verb'),
},
}
+19
View File
@@ -0,0 +1,19 @@
---
id: stair-sleeper
startsIn: "[[stair-up]]"
initialPhase: seated
---
## seated
Someone sits halfway up the stair with their back to you. Their head rests against the banister. One hand lies open on the runner.
## wait-resolved
You do not speak.
After a while, the figure leans aside, not waking. The stair above is not the same stair, but it is open.
## wrong-verb
The seated figure draws one breath. The sound is too small for the body that made it.
## failed
The sleeper turns before you see the face. The stair folds down under your feet, and the parlor receives you again.
+15
View File
@@ -0,0 +1,15 @@
---
id: childs-drawing
names: ["drawing", "child's drawing", "childs drawing", "crayon drawing", "childs-drawing"]
short: "a child's drawing"
takeable: false
readable: true
initialState: {}
---
A child's drawing is pinned to the wall with two black tacks. It shows a hallway with too many doors and a small square room where the house has no room to keep one.
## read
Beneath the drawing, in blunt blue crayon, someone has written:
NOT THIS HALL
+10
View File
@@ -0,0 +1,10 @@
---
id: music-box
names: ["music box", "box", "nursery music box", "music-box"]
short: "a bolted music box"
takeable: false
initialState:
wound: false
---
The music box is bolted to the nursery shelf. A tiny keyhole waits below a painted house with all its windows shut.
+20
View File
@@ -0,0 +1,20 @@
---
id: toy-dog
names: ["toy dog", "stuffed dog", "dog", "woof", "wolf", "toy-dog"]
short: "a stuffed dog"
takeable: true
initialState: {}
---
The toy dog is several shades darker than it used to be.
His fur is matted down in areas and worn from years of handling.
A name is stitched into one paw in faded blue thread:
WOOF
Or perhaps:
WOLF
The stitching has begun to loosen.
+23
View File
@@ -0,0 +1,23 @@
---
id: attic
title: "[ Attic ]"
exitN: null
exitS: null
exitE: null
exitW: null
exitU: null
exitD: "[[bedroom]]"
items: []
encounter: null
---
## first-visit
The attic is lower than the roof outside promised. Trunks lean together under the beams. A piano note sounds once below you, then once above.
The bedroom is down.
## revisit
The attic crouches under its own dust.
## examined
Old sheets cover old furniture. The shapes beneath them are all too tall. In the far corner, a child's handprint has been pressed into the dust from underneath.
+24
View File
@@ -0,0 +1,24 @@
---
id: bedroom
title: "[ Bedroom ]"
exitN: null
exitS: null
exitE: "[[nursery]]"
exitW: null
exitU: "[[attic]]"
exitD: "[[stair-up]]"
items: []
encounter: null
safe: true
---
## first-visit
The bedroom has been prepared for another sleeper. The counterpane is turned down on one side. The pillow holds a shallow dent.
A nursery opens east. A narrower stair climbs into the ceiling.
## revisit
The bedroom keeps the shape of its absent sleeper.
## examined
The wardrobe stands open a hand's width. A dress hangs inside, dark at the hem. On the bedside table, a dry glass has left a ring in the dust.
+27
View File
@@ -0,0 +1,27 @@
---
id: nursery
title: "[ Nursery ]"
exitN: null
exitS: null
exitE: null
exitW: "[[bedroom]]"
exitU: null
exitD: null
items:
- "[[childs-drawing]]"
- "[[music-box]]"
- "[[toy-dog]]"
encounter: null
safe: true
---
## first-visit
The nursery is awake. Toys have been arranged in a careful circle on the floorboards, all facing the door.
A music box is bolted to the shelf. A crayon drawing is pinned beside it.
## revisit
The nursery keeps its circle.
## examined
The small bed has not been slept in. The blanket is folded square enough to hurt the eye. The toys face you now, though none has moved.
+3 -1
View File
@@ -5,7 +5,7 @@ exitN: "[[study]]"
exitS: null
exitE: null
exitW: null
exitU: null
exitU: "[[stair-up]]"
exitD: "[[hallway]]"
items:
- "[[grandfather-clock]]"
@@ -18,6 +18,8 @@ The parlor has been arranged for company. No chair faces another. Each one waits
A stopped clock stands against the north wall. A narrow study opens beyond it. The hallway is below.
A staircase climbs where the corner of the room should be.
## revisit
The parlor waits with its empty chairs.
+23
View File
@@ -0,0 +1,23 @@
---
id: stair-up
title: "[ Upper Stair ]"
exitN: null
exitS: null
exitE: null
exitW: null
exitU: "[[bedroom]]"
exitD: "[[parlor]]"
items: []
encounter: "[[stair-sleeper]]"
---
## first-visit
The stair rises from the parlor and turns before it should. The banister is polished by hands that knew the way in the dark.
Halfway up, someone sits with their back to you.
## revisit
The upper stair waits in its narrow turn.
## examined
The runner is worn thin along the center. Dust gathers at either side, untouched. The figure on the stair is still enough to be furniture, until the house settles and their head settles with it.