Prepare Ink Coolify release branch

This commit is contained in:
2026-05-19 15:25:23 +02:00
parent 9111dedaa2
commit 90f81ee1b7
90 changed files with 68 additions and 14215 deletions
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
-706
View File
@@ -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
-30
View File
@@ -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: ""
-112
View File
@@ -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.
-76
View File
@@ -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.
-77
View File
@@ -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.