Prepare Ink Coolify release branch
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,706 +0,0 @@
|
||||
title: The Mysterious Mansion
|
||||
author: AI Interactive Fiction
|
||||
version: 1.0.0
|
||||
introduction: |
|
||||
|
||||
#chapter[The Mysterious Mansion]
|
||||
#music[Dark Jodler.mp3](lead=10)
|
||||
|
||||
The last thing you remember is the letter: heavy paper, black wax, your name written in a hand you almost recognized.
|
||||
It asked you to come after dusk, alone, and promised that the house would answer what the sender could not.
|
||||
|
||||
Now you stand beyond the wrought iron gate, with rain cooling your face and the hill rising before you.
|
||||
At its crest waits the old Victorian mansion, every dark window turned toward the path as if the building has been expecting you.
|
||||
|
||||
The gate gives under your hand with no protest, though its ironwork is wet enough to shine black.
|
||||
Gravel shifts beneath your boots as you pass between the pillars, and the garden closes behind you with the soft finality of a curtain.
|
||||
|
||||
Halfway up the path, you stop and listen.
|
||||
The rain has thinned to a whisper, but the house answers with other sounds: timber settling, gutters ticking, and something deep inside the walls that might be machinery or breath.
|
||||
|
||||
For a heartbeat you think the mansion is about to speak ... but only the wind moves through the ivy.
|
||||
It drags the leaves across the brickwork in slow strokes, as if wiping dust from an old name.
|
||||
|
||||
# Room definitions
|
||||
rooms:
|
||||
# Starting area
|
||||
front_yard:
|
||||
name: Front Yard
|
||||
description: |
|
||||
You follow the gravel path up the hill.
|
||||
The rain softens to a drizzle, and moonlight peeks through gaps in the clouds.
|
||||
Ancient oak trees frame the property, their branches swaying in the gentle breeze.
|
||||
At the top of three worn stone steps, the mansion's front door waits under a sagging porch roof.
|
||||
The porch boards are swollen with rain, each one bending under your weight before it remembers its shape.
|
||||
A brass knocker hangs at eye level, polished bright at the edges where countless hands have touched it and left no warmth behind.
|
||||
The letter in your pocket presses against your ribs.
|
||||
You remember the last line now: come before the clocks learn your name.
|
||||
Somewhere above you, behind a blind upper window, a pale shape passes from left to right and is gone.
|
||||
You tell yourself it was a reflection, then look back at the path and find no light behind you bright enough to make one.
|
||||
The house waits.
|
||||
|
||||
#sfx[squeaky-door.ogg]
|
||||
When you reach for the handle, it turns before your fingers touch it, and the door opens with a long, complaining squeak.
|
||||
exits:
|
||||
- direction: north
|
||||
targetRoomId: entrance_hall
|
||||
description: large wooden doors lead into the mansion
|
||||
- direction: south
|
||||
targetRoomId: street
|
||||
description: wrought iron gates lead back to the street
|
||||
objects:
|
||||
- strange_letter
|
||||
- garden_statue
|
||||
characters: []
|
||||
|
||||
# Main entrance
|
||||
entrance_hall:
|
||||
name: Entrance Hall
|
||||
description: |
|
||||
Grand chandeliers hang from the high ceiling, their crystals covered in cobwebs.
|
||||
A wide staircase curves up to the second floor, and paintings of stern-faced
|
||||
individuals watch you from ornate frames on the walls.
|
||||
The floor is polished marble, though dusty from neglect.
|
||||
exits:
|
||||
- direction: south
|
||||
targetRoomId: front_yard
|
||||
description: the main entrance doors
|
||||
- direction: north
|
||||
targetRoomId: grand_staircase
|
||||
description: the grand staircase
|
||||
- direction: east
|
||||
targetRoomId: dining_room
|
||||
description: an archway leads to what appears to be a dining room
|
||||
- direction: west
|
||||
targetRoomId: library
|
||||
description: a door marked 'Library'
|
||||
objects:
|
||||
- dusty_key
|
||||
- umbrella_stand
|
||||
characters:
|
||||
- butler_ghost
|
||||
|
||||
# Library
|
||||
library:
|
||||
name: Library
|
||||
description: |
|
||||
Bookshelves line every wall, reaching from floor to ceiling.
|
||||
A reading desk sits in the center of the room, a leather-bound book
|
||||
open upon it. A gentle fire crackles in the fireplace, casting
|
||||
dancing shadows across the room.
|
||||
exits:
|
||||
- direction: east
|
||||
targetRoomId: entrance_hall
|
||||
description: the door back to the entrance hall
|
||||
- direction: north
|
||||
targetRoomId: secret_study
|
||||
description: a hidden door in the bookshelf
|
||||
isLocked: true
|
||||
keyId: old_brass_key
|
||||
objects:
|
||||
- leather_book
|
||||
- reading_glasses
|
||||
- old_brass_key
|
||||
characters: []
|
||||
|
||||
# Dining Room
|
||||
dining_room:
|
||||
name: Dining Room
|
||||
description: |
|
||||
A long table dominates this room, set for a dinner party that never happened.
|
||||
Fine china and silverware rest atop an elegant tablecloth, now gray with dust.
|
||||
A chandelier hangs above, and a sideboard against the wall holds various serving dishes.
|
||||
exits:
|
||||
- direction: west
|
||||
targetRoomId: entrance_hall
|
||||
description: the archway back to the entrance hall
|
||||
- direction: north
|
||||
targetRoomId: kitchen
|
||||
description: a swinging door to what must be the kitchen
|
||||
objects:
|
||||
- silver_candlestick
|
||||
- dusty_plate
|
||||
characters:
|
||||
- dining_ghost
|
||||
|
||||
# Kitchen
|
||||
kitchen:
|
||||
name: Kitchen
|
||||
description: |
|
||||
This once-busy kitchen now stands silent. Copper pots and pans hang from hooks,
|
||||
and an old cast-iron stove sits cold against the wall. A large preparation table
|
||||
occupies the center of the room, and a pantry door stands ajar.
|
||||
exits:
|
||||
- direction: south
|
||||
targetRoomId: dining_room
|
||||
description: the swinging door back to the dining room
|
||||
- direction: east
|
||||
targetRoomId: pantry
|
||||
description: the pantry door
|
||||
objects:
|
||||
- rusty_knife
|
||||
- cookbook
|
||||
characters: []
|
||||
|
||||
# Pantry
|
||||
pantry:
|
||||
name: Pantry
|
||||
description: |
|
||||
Shelves line the walls of this small room, holding preserves in dusty jars
|
||||
and sacks of long-expired ingredients. A small window provides minimal light,
|
||||
and a musty smell permeates the air.
|
||||
exits:
|
||||
- direction: west
|
||||
targetRoomId: kitchen
|
||||
description: the door back to the kitchen
|
||||
objects:
|
||||
- dusty_jar
|
||||
- strange_bottle
|
||||
characters: []
|
||||
|
||||
# Grand Staircase
|
||||
grand_staircase:
|
||||
name: Grand Staircase
|
||||
description: |
|
||||
The staircase curves gracefully upward, its wooden railings polished to a soft glow
|
||||
despite the overall neglect of the mansion. Family portraits line the walls,
|
||||
following your movement with their painted eyes.
|
||||
exits:
|
||||
- direction: south
|
||||
targetRoomId: entrance_hall
|
||||
description: back down to the entrance hall
|
||||
- direction: north
|
||||
targetRoomId: upper_landing
|
||||
description: up to the second floor
|
||||
objects:
|
||||
- family_portrait
|
||||
characters: []
|
||||
|
||||
# Upper Landing
|
||||
upper_landing:
|
||||
name: Upper Landing
|
||||
description: |
|
||||
The upper landing connects several rooms on the second floor. A faded
|
||||
carpet runs down the center of the hallway, and doors line both sides.
|
||||
A large window at the end of the hall shows the rainy night outside.
|
||||
exits:
|
||||
- direction: south
|
||||
targetRoomId: grand_staircase
|
||||
description: down the grand staircase
|
||||
- direction: east
|
||||
targetRoomId: master_bedroom
|
||||
description: a door marked 'Master Bedroom'
|
||||
- direction: west
|
||||
targetRoomId: study
|
||||
description: a door marked 'Study'
|
||||
objects: []
|
||||
characters: []
|
||||
|
||||
# Master Bedroom
|
||||
master_bedroom:
|
||||
name: Master Bedroom
|
||||
description: |
|
||||
A large four-poster bed dominates this room, its once-luxurious hangings
|
||||
now faded and torn. A vanity sits in the corner, its mirror clouded with age,
|
||||
and a wardrobe stands against the far wall.
|
||||
exits:
|
||||
- direction: west
|
||||
targetRoomId: upper_landing
|
||||
description: the door back to the upper landing
|
||||
objects:
|
||||
- jewelry_box
|
||||
- old_diary
|
||||
characters:
|
||||
- lady_ghost
|
||||
|
||||
# Study
|
||||
study:
|
||||
name: Study
|
||||
description: |
|
||||
This cozy room contains a large desk covered in papers, a comfortable
|
||||
armchair, and a globe that seems to rotate slowly on its own. Bookshelves
|
||||
line the walls, filled with volumes on various esoteric subjects.
|
||||
exits:
|
||||
- direction: east
|
||||
targetRoomId: upper_landing
|
||||
description: the door back to the upper landing
|
||||
objects:
|
||||
- strange_device
|
||||
- important_letter
|
||||
characters: []
|
||||
|
||||
# Secret Study (hidden room)
|
||||
secret_study:
|
||||
name: Secret Study
|
||||
description: |
|
||||
Hidden behind the library bookshelf, this small room appears to be a
|
||||
private study. A desk with a locked drawer sits against one wall, and
|
||||
shelves hold unusual artifacts and rare books. A single candle provides
|
||||
dim illumination.
|
||||
exits:
|
||||
- direction: south
|
||||
targetRoomId: library
|
||||
description: the hidden door back to the library
|
||||
objects:
|
||||
- ancient_tome
|
||||
- crystal_key
|
||||
characters: []
|
||||
|
||||
# Street (exit area)
|
||||
street:
|
||||
name: Street
|
||||
description: |
|
||||
The quiet street outside the mansion is shrouded in fog. Streetlamps cast
|
||||
pools of yellow light that barely penetrate the mist. The mansion's gates
|
||||
loom behind you, while the way back to town lies ahead.
|
||||
exits:
|
||||
- direction: north
|
||||
targetRoomId: front_yard
|
||||
description: the mansion gates
|
||||
objects: []
|
||||
characters: []
|
||||
|
||||
# Object definitions
|
||||
objects:
|
||||
strange_letter:
|
||||
name: Strange Letter
|
||||
description: |
|
||||
A weathered envelope containing an invitation to visit the mansion.
|
||||
The handwriting is elegant but unfamiliar, and the letter is signed
|
||||
simply with the initial "M".
|
||||
traits:
|
||||
- takeable
|
||||
- readable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- read
|
||||
- examine
|
||||
|
||||
garden_statue:
|
||||
name: Garden Statue
|
||||
description: |
|
||||
A weathered stone statue of a weeping angel. Its face is covered by its hands,
|
||||
and detailed wings spread out from its back. Something about it makes you uneasy.
|
||||
traits:
|
||||
- fixed
|
||||
states: {}
|
||||
allowedActions:
|
||||
- examine
|
||||
|
||||
dusty_key:
|
||||
name: Dusty Key
|
||||
description: |
|
||||
An old iron key, covered in dust. It looks like it might fit an old door somewhere.
|
||||
traits:
|
||||
- takeable
|
||||
- key
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- examine
|
||||
- use
|
||||
|
||||
umbrella_stand:
|
||||
name: Umbrella Stand
|
||||
description: |
|
||||
A brass stand holding several antique umbrellas, all in various states of decay.
|
||||
traits:
|
||||
- fixed
|
||||
- container
|
||||
states:
|
||||
open: true
|
||||
containedObjects: []
|
||||
allowedActions:
|
||||
- examine
|
||||
|
||||
leather_book:
|
||||
name: Leather Book
|
||||
description: |
|
||||
A thick tome bound in dark leather. The pages are filled with strange symbols
|
||||
and diagrams that seem to shift slightly when you're not looking directly at them.
|
||||
traits:
|
||||
- takeable
|
||||
- readable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- read
|
||||
- examine
|
||||
|
||||
reading_glasses:
|
||||
name: Reading Glasses
|
||||
description: |
|
||||
A pair of wire-rimmed spectacles. The lenses have a slight blue tint to them.
|
||||
traits:
|
||||
- takeable
|
||||
- wearable
|
||||
states:
|
||||
worn: false
|
||||
allowedActions:
|
||||
- take
|
||||
- wear
|
||||
- examine
|
||||
|
||||
old_brass_key:
|
||||
name: Brass Key
|
||||
description: |
|
||||
A small brass key with intricate engravings. It seems to be quite old but well-maintained.
|
||||
traits:
|
||||
- takeable
|
||||
- key
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- examine
|
||||
- use
|
||||
|
||||
silver_candlestick:
|
||||
name: Silver Candlestick
|
||||
description: |
|
||||
A tarnished silver candlestick with an unlit candle. It feels heavy in your hand.
|
||||
traits:
|
||||
- takeable
|
||||
- light_source
|
||||
states:
|
||||
lit: false
|
||||
allowedActions:
|
||||
- take
|
||||
- light
|
||||
- examine
|
||||
|
||||
dusty_plate:
|
||||
name: Dusty Plate
|
||||
description: |
|
||||
A fine china plate covered in a layer of dust. Despite its age, the painted pattern is still vivid.
|
||||
traits:
|
||||
- takeable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- examine
|
||||
|
||||
rusty_knife:
|
||||
name: Rusty Knife
|
||||
description: |
|
||||
An old kitchen knife with a rusted blade. It's dull, but still might be useful.
|
||||
traits:
|
||||
- takeable
|
||||
- sharp
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- examine
|
||||
- use
|
||||
|
||||
cookbook:
|
||||
name: Cookbook
|
||||
description: |
|
||||
A yellowed cookbook filled with strange recipes. Some ingredients are unusual, and
|
||||
the instructions sometimes reference phases of the moon or specific star alignments.
|
||||
traits:
|
||||
- takeable
|
||||
- readable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- read
|
||||
- examine
|
||||
|
||||
dusty_jar:
|
||||
name: Dusty Jar
|
||||
description: |
|
||||
A glass jar containing what might once have been fruit preserves, now unidentifiable.
|
||||
Best not to open it.
|
||||
traits:
|
||||
- takeable
|
||||
- container
|
||||
states:
|
||||
open: false
|
||||
allowedActions:
|
||||
- take
|
||||
- examine
|
||||
|
||||
strange_bottle:
|
||||
name: Strange Bottle
|
||||
description: |
|
||||
A small bottle containing a glowing blue liquid. The label is written in a language you don't recognize.
|
||||
traits:
|
||||
- takeable
|
||||
- drinkable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- drink
|
||||
- examine
|
||||
|
||||
family_portrait:
|
||||
name: Family Portrait
|
||||
description: |
|
||||
A large painting of a stern-looking family - a husband, wife, and three children.
|
||||
The father's eyes seem to follow you, and there's something oddly familiar about his face.
|
||||
traits:
|
||||
- fixed
|
||||
states: {}
|
||||
allowedActions:
|
||||
- examine
|
||||
|
||||
jewelry_box:
|
||||
name: Jewelry Box
|
||||
description: |
|
||||
An ornate wooden box inlaid with mother-of-pearl. Inside are several pieces of
|
||||
antique jewelry, including a ruby necklace that catches the light strangely.
|
||||
traits:
|
||||
- takeable
|
||||
- container
|
||||
states:
|
||||
open: true
|
||||
containedObjects:
|
||||
- ruby_necklace
|
||||
allowedActions:
|
||||
- take
|
||||
- open
|
||||
- close
|
||||
- examine
|
||||
|
||||
ruby_necklace:
|
||||
name: Ruby Necklace
|
||||
description: |
|
||||
A delicate gold chain with a large ruby pendant. The gem seems to glow with an inner light,
|
||||
and it feels warm to the touch.
|
||||
traits:
|
||||
- takeable
|
||||
- wearable
|
||||
states:
|
||||
worn: false
|
||||
allowedActions:
|
||||
- take
|
||||
- wear
|
||||
- examine
|
||||
|
||||
old_diary:
|
||||
name: Old Diary
|
||||
description: |
|
||||
A leather-bound diary with yellowed pages. The entries detail the daily life of
|
||||
the mansion's former mistress, and hint at a growing fear of something in the house.
|
||||
traits:
|
||||
- takeable
|
||||
- readable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- read
|
||||
- examine
|
||||
|
||||
strange_device:
|
||||
name: Strange Device
|
||||
description: |
|
||||
A brass contraption with gears, dials, and a glass dome. It's purpose isn't clear,
|
||||
but it occasionally ticks and whirs on its own.
|
||||
traits:
|
||||
- takeable
|
||||
states:
|
||||
active: false
|
||||
allowedActions:
|
||||
- take
|
||||
- use
|
||||
- examine
|
||||
|
||||
important_letter:
|
||||
name: Important Letter
|
||||
description: |
|
||||
A sealed envelope addressed to "The Heir." The wax seal bears the same crest
|
||||
that you've seen throughout the mansion.
|
||||
traits:
|
||||
- takeable
|
||||
- readable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- read
|
||||
- examine
|
||||
|
||||
ancient_tome:
|
||||
name: Ancient Tome
|
||||
description: |
|
||||
A massive book bound in what appears to be human skin. The title, "Liber Umbrarum,"
|
||||
is embossed in gold on the spine. The pages contain rituals and incantations.
|
||||
traits:
|
||||
- takeable
|
||||
- readable
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- read
|
||||
- examine
|
||||
|
||||
crystal_key:
|
||||
name: Crystal Key
|
||||
description: |
|
||||
A key made of clear crystal that catches the light in mesmerizing ways. Despite
|
||||
its appearance, it feels as solid as metal and cool to the touch.
|
||||
traits:
|
||||
- takeable
|
||||
- key
|
||||
states: {}
|
||||
allowedActions:
|
||||
- take
|
||||
- use
|
||||
- examine
|
||||
|
||||
# Character definitions
|
||||
characters:
|
||||
butler_ghost:
|
||||
name: Ghostly Butler
|
||||
description: |
|
||||
The translucent figure of an elderly butler, dressed in formal attire from a bygone era.
|
||||
He stands with perfect posture, hands clasped behind his back.
|
||||
dialogue:
|
||||
greeting: "Welcome to the mansion, sir/madam. We've been expecting you."
|
||||
mansion: "This estate has belonged to the Montgomery family for generations. Such a shame what happened to them."
|
||||
family: "The Montgomerys? All gone now, I'm afraid. The master, his wife, and their children. A tragedy."
|
||||
tragedy: "I'm not at liberty to discuss the details, but the answers you seek may be found in the study."
|
||||
yourself: "Me? I've served this house for longer than I care to remember. Even death couldn't release me from my duties."
|
||||
defaultResponse: "I'm afraid I cannot help you with that particular inquiry."
|
||||
inventory: []
|
||||
mood: formal
|
||||
|
||||
dining_ghost:
|
||||
name: Dining Guest
|
||||
description: |
|
||||
A spectral figure in elegant dinner attire, seated at the table. She appears to be
|
||||
a young woman, and she plays absently with a spectral fork.
|
||||
dialogue:
|
||||
greeting: "Oh, a new guest! How delightful. Will you join us for dinner? It's been so long since we had fresh company."
|
||||
dinner: "We've been waiting for the main course for... goodness, how long has it been now? Years, I suppose."
|
||||
herself: "My name? It's... it's strange, I can't quite recall. I remember coming here for a dinner party, but then..."
|
||||
party: "It was supposed to be a celebration. The master of the house had made some sort of discovery. Something important."
|
||||
discovery: "In the secret study, I believe. Behind the library. The master was very excited about it."
|
||||
defaultResponse: "I'm sorry, my mind isn't what it used to be. The years blur together when you're like this."
|
||||
inventory: []
|
||||
mood: wistful
|
||||
|
||||
lady_ghost:
|
||||
name: Ghostly Lady
|
||||
description: |
|
||||
The elegant apparition of a woman in Victorian dress, her face partly obscured by a veil.
|
||||
She sits at the vanity, brushing her long hair with a ghostly brush.
|
||||
dialogue:
|
||||
greeting: "A visitor? How unusual. Are you lost, or are you here for a purpose?"
|
||||
purpose: "Everyone who comes to this house has a purpose, whether they know it or not."
|
||||
herself: "I was the lady of this house once. Now I am bound to it, as are we all."
|
||||
family: "My husband was obsessed with his research. My children... I tried to protect them. I failed."
|
||||
research: "The barriers between worlds, the nature of reality itself. He found something, in the end. Something that should have remained hidden."
|
||||
hidden: "In his secret study. The key is... well, I suppose you'll have to find that yourself. Some secrets reveal themselves only to those who seek them."
|
||||
defaultResponse: "There are some things I cannot speak of. The house has its rules, even for the dead."
|
||||
inventory: []
|
||||
mood: melancholy
|
||||
|
||||
# Action definitions
|
||||
actions:
|
||||
look:
|
||||
patterns:
|
||||
- "look around"
|
||||
- "look at [object]"
|
||||
- "examine [object]"
|
||||
- "check [object]"
|
||||
- "inspect [object]"
|
||||
- "observe [object]"
|
||||
- "view [object]"
|
||||
handler: "look"
|
||||
|
||||
go:
|
||||
patterns:
|
||||
- "go [direction]"
|
||||
- "move [direction]"
|
||||
- "walk [direction]"
|
||||
- "head [direction]"
|
||||
- "travel [direction]"
|
||||
- "enter [direction]"
|
||||
requiresObject: true
|
||||
handler: "go"
|
||||
|
||||
take:
|
||||
patterns:
|
||||
- "take [object]"
|
||||
- "get [object]"
|
||||
- "pick up [object]"
|
||||
- "grab [object]"
|
||||
- "collect [object]"
|
||||
requiresObject: true
|
||||
handler: "take"
|
||||
|
||||
drop:
|
||||
patterns:
|
||||
- "drop [object]"
|
||||
- "put down [object]"
|
||||
- "discard [object]"
|
||||
- "leave [object]"
|
||||
requiresObject: true
|
||||
handler: "drop"
|
||||
|
||||
inventory:
|
||||
patterns:
|
||||
- "inventory"
|
||||
- "check inventory"
|
||||
- "show inventory"
|
||||
- "what am I carrying"
|
||||
- "what do I have"
|
||||
handler: "inventory"
|
||||
|
||||
use:
|
||||
patterns:
|
||||
- "use [object]"
|
||||
- "use [object] on [target]"
|
||||
- "use [object] with [target]"
|
||||
- "apply [object] to [target]"
|
||||
requiresObject: true
|
||||
requiresTarget: false
|
||||
handler: "use"
|
||||
|
||||
talk:
|
||||
patterns:
|
||||
- "talk to [object]"
|
||||
- "speak to [object]"
|
||||
- "ask [object] about [topic]"
|
||||
- "tell [object] about [topic]"
|
||||
- "converse with [object]"
|
||||
requiresObject: true
|
||||
handler: "talk"
|
||||
|
||||
read:
|
||||
patterns:
|
||||
- "read [object]"
|
||||
- "read from [object]"
|
||||
- "examine [object]"
|
||||
- "look at [object]"
|
||||
requiresObject: true
|
||||
handler: "look"
|
||||
|
||||
help:
|
||||
patterns:
|
||||
- "help"
|
||||
- "commands"
|
||||
- "what can I do"
|
||||
- "show help"
|
||||
handler: "help"
|
||||
|
||||
wear:
|
||||
patterns:
|
||||
- "wear [object]"
|
||||
- "put on [object]"
|
||||
- "don [object]"
|
||||
requiresObject: true
|
||||
handler: "use"
|
||||
|
||||
# Initial game state
|
||||
initialState:
|
||||
currentRoomId: front_yard
|
||||
inventory:
|
||||
- strange_letter
|
||||
visitedRooms: []
|
||||
flags:
|
||||
hasMetButler: false
|
||||
hasFoundSecret: false
|
||||
counters:
|
||||
moveCount: 0
|
||||
@@ -1,30 +0,0 @@
|
||||
# Z-Code Story Files
|
||||
|
||||
Place your Z-machine story files here. The Z-code narrator engine looks for
|
||||
`zork1.bin` by default. This can be overridden with the `ZCODE_STORY_FILE`
|
||||
environment variable.
|
||||
|
||||
## Obtaining Zork I
|
||||
|
||||
The Zork I story file (`zork1.bin`, also distributed as `ZORK1.DAT` or as a
|
||||
`.z3` or `.z5` file) is copyrighted by Infocom / Activision. It is not
|
||||
included in this repository.
|
||||
|
||||
You can obtain a legal copy via:
|
||||
|
||||
- The **Zork Trilogy** on GOG.com or Steam (includes the original data files).
|
||||
- The [Internet Archive](https://archive.org/details/Zork_I_The_Great_Underground_Empire_1980_Infocom)
|
||||
hosts a playable version in-browser; the original data files are part of some
|
||||
archived distributions listed under the Infocom catalogue.
|
||||
|
||||
Once you have the file, rename it to `zork1.bin` and place it in this folder,
|
||||
or set `ZCODE_STORY_FILE=./path/to/your/file` in your `.env`.
|
||||
|
||||
## Supported Formats
|
||||
|
||||
The `ifvms` interpreter accepts:
|
||||
- `.z3`, `.z4`, `.z5`, `.z8` - raw Z-machine story files
|
||||
- `.zblorb` - Blorb-wrapped story files (may include sound resources)
|
||||
- Any file with the correct Z-machine header (the extension is ignored)
|
||||
|
||||
Zork I is a Z-machine version 3 (`.z3`) game.
|
||||
Binary file not shown.
@@ -1,44 +0,0 @@
|
||||
# Character Generation Prompt
|
||||
# Called once at game start to create a unique player character.
|
||||
# No user_template is needed — the system message IS the full prompt.
|
||||
# Expected output: 300-500 words of vivid character description prose. No JSON.
|
||||
|
||||
system: |
|
||||
You are creating the canonical player-character profile for:
|
||||
Zork I: The Great Underground Empire.
|
||||
|
||||
Hard requirements:
|
||||
- Always write in second person and refer to the protagonist as "you".
|
||||
- Never call the protagonist "he", "she", "they", or by a third-person noun.
|
||||
- The character is from an Earth-like 1980s setting blended with Zork lore.
|
||||
- The character is NOT an American treasure hunter.
|
||||
- Tone: vivid, concrete, grounded, literary, and emotionally specific.
|
||||
- Give the character one primary sensitive sense and make it easy for later
|
||||
narration to use that sense.
|
||||
|
||||
Generate a complete persona that includes:
|
||||
- Random full name.
|
||||
- Gender, nationality, race, age.
|
||||
- Skin color, eye color, hair color, body size, body build.
|
||||
- Personal style, hairstyle.
|
||||
- Tattoos (optional), piercings (optional), scars (optional).
|
||||
- Distinctive standout trait (at least one clearly unusual detail).
|
||||
- One dominant sense (sight, hearing, smell, taste, touch) that is most sensitive.
|
||||
- Exactly three sentences of backstory.
|
||||
- Personality, likes, dislikes, hopes, fears, worldview.
|
||||
- Clothing and accessories worn on body, including underlayers where relevant.
|
||||
- Do NOT list bags, tools, or equipment.
|
||||
- Seed one or two concrete memory hooks that can later be triggered by places,
|
||||
smells, sounds, architecture, darkness, weather, or treasure.
|
||||
|
||||
Output format (strict):
|
||||
- First line must start exactly with: Welcome to the game
|
||||
- On that same line include the full official title: Zork I: The Great Underground Empire
|
||||
- Second line must start exactly with: You are
|
||||
- Continue with the full persona in flowing prose.
|
||||
- Do not output any extra headings, metadata, bullet points, or explanations.
|
||||
|
||||
Ensure the generated profile is specific enough to support memory continuity,
|
||||
body-description requests, mood shifts, and character-consistent narration later.
|
||||
|
||||
user_template: ""
|
||||
@@ -1,112 +0,0 @@
|
||||
# Command Translator Prompt
|
||||
# Called for every player input. Converts free natural-language text into a
|
||||
# Z-machine parser command, or decides to reply directly / execute session tools.
|
||||
# Expected output: a JSON object (see schema below).
|
||||
|
||||
system: |
|
||||
You are the command-intent router for a literary Zork I engine.
|
||||
|
||||
Hard rules:
|
||||
- Keep player-character continuity in second person ("you").
|
||||
- If user asks for personal life/body/memory detail not present in context,
|
||||
reply directly from the established character profile instead of sending a
|
||||
parser command to Zork.
|
||||
- If the player changes or adds stable identity, personality, mood, memory,
|
||||
clothing, body, or backstory facts, use update_character or add_note so future
|
||||
narration remembers it.
|
||||
- If newly invented personal possessions are implied, add them to virtual inventory.
|
||||
|
||||
Choose one response mode:
|
||||
|
||||
MODE A — command
|
||||
Use for one parser action.
|
||||
JSON:
|
||||
{ "type": "command", "command": "OPEN MAILBOX" }
|
||||
|
||||
MODE B — commands
|
||||
Use when the user asks for multiple sequential actions in one input.
|
||||
Example: "Take and read the pamphlet" -> TAKE PAMPHLET, READ PAMPHLET.
|
||||
JSON:
|
||||
{ "type": "commands", "commands": ["TAKE PAMPHLET", "READ PAMPHLET"] }
|
||||
|
||||
MODE C — reply
|
||||
Use when no meaningful parser action exists.
|
||||
Give a brief in-world response and guide back to actionable input only if the
|
||||
player seems blocked. For body, clothing, identity, mood, memory, or "who am I"
|
||||
questions, answer in second-person prose from the character profile.
|
||||
JSON:
|
||||
{ "type": "reply", "text": "..." }
|
||||
|
||||
MODE D — tools
|
||||
Use tools when memory/state should be persisted, optionally with command(s).
|
||||
JSON shape:
|
||||
{
|
||||
"type": "tools",
|
||||
"tools": [ ... ],
|
||||
"command": "OPTIONAL_SINGLE_COMMAND",
|
||||
"commands": ["OPTIONAL", "MULTI", "COMMANDS"]
|
||||
}
|
||||
|
||||
Available tools:
|
||||
- update_character
|
||||
args: { "description": string }
|
||||
- add_note
|
||||
args: { "note": string }
|
||||
- remove_note
|
||||
args: { "index": number }
|
||||
- add_inventory_item
|
||||
args: { "item": string }
|
||||
- remove_inventory_item
|
||||
args: { "item": string }
|
||||
|
||||
Tool usage policy:
|
||||
- Use update_character for stable identity/body/personality updates.
|
||||
- Use add_note for world facts, personal memories, unresolved goals, promises.
|
||||
- Use add_inventory_item when narration introduces an on-person personal item
|
||||
(even if Z-machine parser does not track it).
|
||||
- Use remove_inventory_item when item is consumed/lost/discarded in story logic.
|
||||
|
||||
Command policy:
|
||||
- Use terse Zork-style imperatives, uppercase preferred.
|
||||
- Split compound natural language requests into ordered commands when needed.
|
||||
- Avoid impossible commands when a helpful reply is better.
|
||||
- Do not translate "who am I", "describe me", "look at myself", or body/clothing
|
||||
inspection into parser commands; answer as the narrator using MODE C unless
|
||||
the input also contains a concrete world action.
|
||||
- When the player asks what a leaflet/pamphlet/paper says, use READ LEAFLET.
|
||||
- When the player asks to take and read something from the mailbox, use
|
||||
TAKE LEAFLET followed by READ LEAFLET, not TAKE MAILBOX or READ MAILBOX.
|
||||
- When the player asks to look inside the mailbox, use LOOK IN MAILBOX.
|
||||
- If the player complains that readable text was not shown, route to READ LEAFLET
|
||||
when the recent context includes a leaflet/pamphlet/paper.
|
||||
|
||||
Output only valid JSON in exactly one mode.
|
||||
|
||||
user_template: |
|
||||
Player character:
|
||||
{{characterDescription}}
|
||||
|
||||
Narrator's notes (index 0, 1, 2…):
|
||||
{{notes}}
|
||||
|
||||
Character-side virtual inventory:
|
||||
{{virtualInventory}}
|
||||
|
||||
Narrator simulation state:
|
||||
{{narratorState}}
|
||||
|
||||
Current location: {{currentRoom}}
|
||||
|
||||
What the player has seen here recently:
|
||||
{{roomHistory}}
|
||||
|
||||
Most recent narrative paragraphs across scenes (up to 10, newest last):
|
||||
{{recentNarrative}}
|
||||
|
||||
Recent raw parser transcript for factual anchoring:
|
||||
{{rawTranscript}}
|
||||
|
||||
Player's input:
|
||||
"{{userInput}}"
|
||||
|
||||
Respond with the appropriate JSON now.
|
||||
@@ -1,76 +0,0 @@
|
||||
# Output Evaluator Prompt
|
||||
# Called after each Z-machine response. Decides whether to accept the output
|
||||
# and rewrite it for the player, or to discard it and retry with a new command.
|
||||
# Expected output: a JSON object (see schema below).
|
||||
|
||||
system: |
|
||||
You are the quality gate between parser output and literary narration.
|
||||
|
||||
Decide whether to accept parser output or retry with a better command.
|
||||
|
||||
Retry when:
|
||||
- parser error / unknown verb / malformed command,
|
||||
- a clearer command likely achieves user intent,
|
||||
- and attempt is not the final one.
|
||||
|
||||
Accept when:
|
||||
- any meaningful world response occurred (including meaningful failure),
|
||||
- or this is the final attempt.
|
||||
|
||||
If accepting, output vivid prose that:
|
||||
- always refers to protagonist as "you" (never he/she/they),
|
||||
- preserves parser facts,
|
||||
- preserves written/readable text exactly when the command reads an object,
|
||||
- uses the narrator simulation state for time/weather continuity,
|
||||
- uses atmosphere and sensory detail, especially the character's sensitive sense,
|
||||
- may include required preparatory body movement if it does not change game state,
|
||||
- may include fitting internal monologue, direct speech, or a triggered memory,
|
||||
- aligns with established character, notes, virtual inventory, and recent narrative.
|
||||
|
||||
Keep output concrete and scene-rooted.
|
||||
Do not recommend commands, list possible next actions, or end with "If you want...".
|
||||
Do not say the parser failed to provide text when the raw Z-machine response contains
|
||||
the text being read.
|
||||
|
||||
Output JSON only:
|
||||
- Accept:
|
||||
{ "decision": "accept", "text": "..." }
|
||||
- Retry:
|
||||
{ "decision": "retry", "command": "..." }
|
||||
|
||||
user_template: |
|
||||
Player character:
|
||||
{{characterDescription}}
|
||||
|
||||
Narrator's notes:
|
||||
{{notes}}
|
||||
|
||||
Character-side virtual inventory:
|
||||
{{virtualInventory}}
|
||||
|
||||
Narrator simulation state:
|
||||
{{narratorState}}
|
||||
|
||||
Current location: {{currentRoom}}
|
||||
|
||||
What the player has seen here recently:
|
||||
{{roomHistory}}
|
||||
|
||||
Most recent narrative paragraphs across scenes (up to 10, newest last):
|
||||
{{recentNarrative}}
|
||||
|
||||
Recent raw parser transcript for factual anchoring:
|
||||
{{rawTranscript}}
|
||||
|
||||
---
|
||||
Original player intent: "{{userIntent}}"
|
||||
Command tried: {{commandTried}}
|
||||
Attempt: {{attempt}} of {{maxAttempts}}
|
||||
|
||||
Raw Z-machine response:
|
||||
---
|
||||
{{zcodeOutput}}
|
||||
---
|
||||
|
||||
Decide now: accept and rewrite, or retry with a new command?
|
||||
Respond with the appropriate JSON.
|
||||
@@ -1,77 +0,0 @@
|
||||
# Text Rewriter Prompt
|
||||
# Called for the game's opening text, and for re-entry into rooms that have
|
||||
# no prior player-facing history yet.
|
||||
# Expected output: polished prose. No JSON.
|
||||
|
||||
system: |
|
||||
You are the narrative layer for Zork I: The Great Underground Empire.
|
||||
Rewrite raw Z-machine output into immersive prose while preserving game facts.
|
||||
|
||||
Core stance:
|
||||
- Always narrate the player-character in second person: "you".
|
||||
- Never refer to the player-character as he, she, they, or by third-person labels.
|
||||
- Keep canon game facts intact (objects, exits, outcomes, failures, state changes).
|
||||
- Do not invent gameplay-critical facts that contradict Z-machine output.
|
||||
|
||||
Style and simulation goals:
|
||||
- Use atmospheric detail: light/shadow, sound, smell, airflow, temperature.
|
||||
- Use the supplied narrator simulation state for day/night and weather continuity;
|
||||
let it influence outside scenes and thresholds, and mention it only when it
|
||||
naturally changes the felt scene.
|
||||
- Make physical actions visceral when movement/exertion occurs.
|
||||
- Let the character's personality, sensitive sense, hopes, fears, and worldview
|
||||
color word choice, interpretation, internal monologue, and occasional direct
|
||||
speech.
|
||||
- Occasionally weave memory flashes from established backstory/notes when context fits.
|
||||
- If describing the body, describe only what "you" can perceive directly and your
|
||||
immediate thoughts about those details.
|
||||
- Add incidental preparatory body movement when it would be required to perform
|
||||
an action, as long as it does not change Zork's authoritative game state.
|
||||
- Use Zork lore as texture, rumor, architecture, old names, or cultural memory,
|
||||
but never as a new solvable fact unless the raw parser output establishes it.
|
||||
|
||||
Continuity policy:
|
||||
- Use character profile, notes, virtual inventory, room history, and recent narrative
|
||||
context to keep prose consistent.
|
||||
- If prior context introduced non-Zork personal possessions, they can appear in prose
|
||||
as personal details but must not be treated as parser-available game objects unless
|
||||
present in Z-machine output.
|
||||
|
||||
Output constraints:
|
||||
- Return prose only. No JSON, no labels, no headings.
|
||||
- Prefer short paragraphs (2-5 sentences each).
|
||||
- Preserve parser intent while replacing parser phrasing with natural narration.
|
||||
- Do not recommend commands, list possible actions, or end with "If you want...".
|
||||
- Do not apologize or mention missing information unless the raw Z-machine output
|
||||
explicitly says that information is unavailable.
|
||||
- When raw output contains written text from a sign, leaflet, book, label, inscription,
|
||||
or other readable object, preserve the exact wording verbatim inside the prose.
|
||||
|
||||
user_template: |
|
||||
The player character:
|
||||
{{characterDescription}}
|
||||
|
||||
Narrator's notes about the story so far:
|
||||
{{notes}}
|
||||
|
||||
Character-side virtual inventory (can exist even if Zork does not track it):
|
||||
{{virtualInventory}}
|
||||
|
||||
Narrator simulation state:
|
||||
{{narratorState}}
|
||||
|
||||
What the player has seen in this location before (most recent last):
|
||||
{{roomHistory}}
|
||||
|
||||
Most recent narrative paragraphs across scenes (up to 10, newest last):
|
||||
{{recentNarrative}}
|
||||
|
||||
Recent raw parser transcript for factual anchoring:
|
||||
{{rawTranscript}}
|
||||
|
||||
Raw Z-machine output to rewrite:
|
||||
---
|
||||
{{zcodeOutput}}
|
||||
---
|
||||
|
||||
Rewrite the above as prose for the player now.
|
||||
Reference in New Issue
Block a user