Remove obsolete generated assets and dead code
All checks were successful
Build Org Website / build (push) Successful in 43s

This commit is contained in:
gitea-actions
2026-08-19 10:53:30 +01:00
parent 2ee6575539
commit d12edea8de
269 changed files with 58 additions and 85836 deletions

View File

@@ -274,7 +274,6 @@ The published HTML is static, but some browser modules rely on same-origin APIs:
| Notes board | `pages/notes.js` | `/api/notes` |
| Wird tracker | `pages/wird-tracker.js` | `/api/wird`, `/api/wird/motalah`, `/api/calibre/books` |
| Competency board | `pages/competency-status-board.js` | `/api/competencies/items...` |
| Princess Lima RPG progress | `pages/princess-lima-game.js` | Device-local `localStorage` state |
These APIs are not implemented here. Production routing must serve `output/` and proxy `/api/` to the appropriate backend. When changing an endpoint contract, coordinate the static client and its external service.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -379,11 +379,6 @@
"title": "Working on Eid day",
"url": "/blogs/2026/05-may/working-on-eid-day-27-05-26.html"
},
{
"slug": "07-06-26-week-review",
"title": "[07-06-2026] - Weekly Review",
"url": "/blogs/2026/06-june/07-06-week-review.html"
},
{
"slug": "14-06-26-week-review",
"title": "[14-06-2026] - Weekly Review",
@@ -414,6 +409,31 @@
"title": "[12-07-2026] - Weekly Review",
"url": "/blogs/2026/07-july/12-07-week-review.html"
},
{
"slug": "19-07-26-week-review",
"title": "[19-07-2026] - Weekly Review",
"url": "/blogs/2026/07-july/19-07-week-review.html"
},
{
"slug": "26-07-26-week-review",
"title": "[26-07-2026] - Weekly Review",
"url": "/blogs/2026/07-july/26-07-week-review.html"
},
{
"slug": "02-08-26-week-review",
"title": "[02-08-2026] - Weekly Review",
"url": "/blogs/2026/08-august/02-08-week-review.html"
},
{
"slug": "09-08-26-week-review",
"title": "[09-08-2026] - Weekly Review",
"url": "/blogs/2026/08-august/09-08-week-review.html"
},
{
"slug": "16-08-26-week-review",
"title": "[16-08-2026] - Weekly Review",
"url": "/blogs/2026/08-august/16-08-week-review.html"
},
{
"slug": "publish-pages",
"title": "How to publish pages using Org Publish",

View File

@@ -1,14 +0,0 @@
{
"first_spark": "Make Lima laugh in the palace courtyard.",
"lantern_reader": "Solve the library cipher.",
"true_aim": "Score four or more bullseyes.",
"kitchen_conspiracy": "Complete the recipe without a mistake.",
"two_left_feet": "Finish the dance, graceful or otherwise.",
"garland_for_all": "Complete A Garland for Everyone.",
"letters_home": "Complete The Bookseller's Letters.",
"thoughtful_gift": "Give Lima a gift.",
"open_book": "Reach Deep Trust.",
"royal_favourite": "Reach Deep Family Approval.",
"moonrise": "Complete the story.",
"every_current": "Unlock all four endings."
}

View File

@@ -1,71 +0,0 @@
{
"version": 1,
"images": [
{"id": "courtyard", "type": "background", "url": "/assets/games/two-rivers/images/backgrounds/courtyard.webp", "prompt": "prompts/backgrounds.md#palace-courtyard"},
{"id": "library", "type": "background", "url": "/assets/games/two-rivers/images/backgrounds/library.webp", "prompt": "prompts/backgrounds.md#royal-library"},
{"id": "garden", "type": "background", "url": "/assets/games/two-rivers/images/backgrounds/garden.webp", "prompt": "prompts/backgrounds.md#moon-garden"},
{"id": "market", "type": "background", "url": "/assets/games/two-rivers/images/backgrounds/market.webp", "prompt": "prompts/backgrounds.md#old-marketplace"},
{"id": "pavilion", "type": "background", "url": "/assets/games/two-rivers/images/backgrounds/pavilion.webp", "prompt": "prompts/backgrounds.md#riverside-pavilion"},
{"id": "z", "type": "character", "url": "/assets/games/two-rivers/images/characters/z.webp", "prompt": "prompts/characters.md#z"},
{"id": "lima", "type": "character", "url": "/assets/games/two-rivers/images/characters/lima.webp", "prompt": "prompts/characters.md#lima"},
{"id": "anwara", "type": "npc", "url": "/assets/games/two-rivers/images/characters/anwara.webp", "prompt": "prompts/characters/supporting-cast.md#keeper-anwara"},
{"id": "saira", "type": "npc", "url": "/assets/games/two-rivers/images/characters/saira.webp", "prompt": "prompts/characters/supporting-cast.md#saira"},
{"id": "nadia", "type": "npc", "url": "/assets/games/two-rivers/images/characters/nadia.webp", "prompt": "prompts/characters/supporting-cast.md#nadia"},
{"id": "rayhan", "type": "npc", "url": "/assets/games/two-rivers/images/characters/rayhan.webp", "prompt": "prompts/characters/supporting-cast.md#rayhan"},
{"id": "mira", "type": "npc", "url": "/assets/games/two-rivers/images/characters/mira.webp", "prompt": "prompts/characters/supporting-cast.md#mira"},
{"id": "ishan", "type": "npc", "url": "/assets/games/two-rivers/images/characters/ishan.webp", "prompt": "prompts/characters/supporting-cast.md#ishan"},
{"id": "inkstone", "type": "item", "url": "/assets/games/two-rivers/images/items/inkstone.webp", "prompt": "prompts/items/inkstone.md"},
{"id": "brass_compass", "type": "item", "url": "/assets/games/two-rivers/images/items/brass_compass.webp", "prompt": "prompts/items/brass-compass.md"},
{"id": "poetry_book", "type": "item", "url": "/assets/games/two-rivers/images/items/poetry_book.webp", "prompt": "prompts/items/poetry-book.md"},
{"id": "embroidered_ribbon", "type": "item", "url": "/assets/games/two-rivers/images/items/embroidered_ribbon.webp", "prompt": "prompts/items/embroidered-ribbon.md"},
{"id": "spiced_tea", "type": "item", "url": "/assets/games/two-rivers/images/items/spiced_tea.webp", "prompt": "prompts/items/spiced-tea.md"},
{"id": "archery_charm", "type": "item", "url": "/assets/games/two-rivers/images/items/archery_charm.webp", "prompt": "prompts/items/archery-charm.md"},
{"id": "folio_ribbon", "type": "item", "url": "/assets/games/two-rivers/images/items/folio_ribbon.webp", "prompt": "prompts/items/folio-ribbon.md"},
{"id": "lantern_rubbing", "type": "item", "url": "/assets/games/two-rivers/images/items/lantern_rubbing.webp", "prompt": "prompts/items/lantern-rubbing.md"},
{"id": "anwara_note", "type": "item", "url": "/assets/games/two-rivers/images/items/anwara_note.webp", "prompt": "prompts/items/anwara-note.md"},
{"id": "founders_record", "type": "item", "url": "/assets/games/two-rivers/images/items/founders_record.webp", "prompt": "prompts/items/founders-record.md"},
{"id": "jasmine", "type": "item", "url": "/assets/games/two-rivers/images/items/jasmine.webp", "prompt": "prompts/items/jasmine.md"},
{"id": "tuberose", "type": "item", "url": "/assets/games/two-rivers/images/items/tuberose.webp", "prompt": "prompts/items/tuberose.md"},
{"id": "marigold", "type": "item", "url": "/assets/games/two-rivers/images/items/marigold.webp", "prompt": "prompts/items/marigold.md"},
{"id": "rose", "type": "item", "url": "/assets/games/two-rivers/images/items/rose.webp", "prompt": "prompts/items/rose.md"},
{"id": "bakul", "type": "item", "url": "/assets/games/two-rivers/images/items/bakul.webp", "prompt": "prompts/items/bakul.md"},
{"id": "letter_1", "type": "item", "url": "/assets/games/two-rivers/images/items/letter_1.webp", "prompt": "prompts/items/letter-1.md"},
{"id": "letter_2", "type": "item", "url": "/assets/games/two-rivers/images/items/letter_2.webp", "prompt": "prompts/items/letter-2.md"},
{"id": "letter_3", "type": "item", "url": "/assets/games/two-rivers/images/items/letter_3.webp", "prompt": "prompts/items/letter-3.md"},
{"id": "ending-scholar", "type": "cg", "url": "/assets/games/two-rivers/images/cg/scholar.webp", "prompt": "prompts/cg.md#scholars-promise"},
{"id": "ending-laughter", "type": "cg", "url": "/assets/games/two-rivers/images/cg/laughter.webp", "prompt": "prompts/cg.md#laughter-after-midnight"},
{"id": "ending-road", "type": "cg", "url": "/assets/games/two-rivers/images/cg/road.webp", "prompt": "prompts/cg.md#road-beyond-palace"},
{"id": "ending-families", "type": "cg", "url": "/assets/games/two-rivers/images/cg/families.webp", "prompt": "prompts/cg.md#two-families"},
{"id": "garland", "type": "cg", "url": "/assets/games/two-rivers/images/cg/garland.webp", "prompt": "prompts/cg.md#garland"},
{"id": "cg-library", "type": "cg", "url": "/assets/games/two-rivers/images/cg/library.webp", "prompt": "prompts/cg.md#library"}
],
"audio": [
{"id": "morning", "type": "music", "url": "/assets/games/two-rivers/audio/music/morning.webm", "urls": ["/assets/games/two-rivers/audio/music/morning.webm", "/assets/games/two-rivers/audio/music/morning.mp3"], "source": "/assets/audio/princess-lima/village-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "palace", "type": "music", "url": "/assets/games/two-rivers/audio/music/palace.webm", "urls": ["/assets/games/two-rivers/audio/music/palace.webm", "/assets/games/two-rivers/audio/music/palace.mp3"], "source": "/assets/audio/princess-lima/victory-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "garden", "type": "music", "url": "/assets/games/two-rivers/audio/music/garden.webm", "urls": ["/assets/games/two-rivers/audio/music/garden.webm", "/assets/games/two-rivers/audio/music/garden.mp3"], "source": "/assets/audio/princess-lima/forest-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "marketplace", "type": "music", "url": "/assets/games/two-rivers/audio/music/marketplace.webm", "urls": ["/assets/games/two-rivers/audio/music/marketplace.webm", "/assets/games/two-rivers/audio/music/marketplace.mp3"], "source": "/assets/audio/princess-lima/village-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "festival", "type": "music", "url": "/assets/games/two-rivers/audio/music/festival.webm", "urls": ["/assets/games/two-rivers/audio/music/festival.webm", "/assets/games/two-rivers/audio/music/festival.mp3"], "source": "/assets/audio/princess-lima/victory-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "romantic", "type": "music", "url": "/assets/games/two-rivers/audio/music/romantic.webm", "urls": ["/assets/games/two-rivers/audio/music/romantic.webm", "/assets/games/two-rivers/audio/music/romantic.mp3"], "source": "/assets/audio/princess-lima/forest-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "sad", "type": "music", "url": "/assets/games/two-rivers/audio/music/sad.webm", "urls": ["/assets/games/two-rivers/audio/music/sad.webm", "/assets/games/two-rivers/audio/music/sad.mp3"], "source": "/assets/audio/princess-lima/mountain-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "night", "type": "music", "url": "/assets/games/two-rivers/audio/music/night.webm", "urls": ["/assets/games/two-rivers/audio/music/night.webm", "/assets/games/two-rivers/audio/music/night.mp3"], "source": "/assets/audio/princess-lima/fortress-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "victory", "type": "music", "url": "/assets/games/two-rivers/audio/music/victory.webm", "urls": ["/assets/games/two-rivers/audio/music/victory.webm", "/assets/games/two-rivers/audio/music/victory.mp3"], "source": "/assets/audio/princess-lima/victory-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "ending", "type": "music", "url": "/assets/games/two-rivers/audio/music/ending.webm", "urls": ["/assets/games/two-rivers/audio/music/ending.webm", "/assets/games/two-rivers/audio/music/ending.mp3"], "source": "/assets/audio/princess-lima/victory-theme.wav", "licence": "Original site-owned instrumental; local derivative encodes"},
{"id": "birds", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/birds.webm", "urls": ["/assets/games/two-rivers/audio/ambience/birds.webm", "/assets/games/two-rivers/audio/ambience/birds.mp3"], "source": "/assets/audio/princess-lima/forest-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "water", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/water.webm", "urls": ["/assets/games/two-rivers/audio/ambience/water.webm", "/assets/games/two-rivers/audio/ambience/water.mp3"], "source": "/assets/audio/princess-lima/forest-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "wind", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/wind.webm", "urls": ["/assets/games/two-rivers/audio/ambience/wind.webm", "/assets/games/two-rivers/audio/ambience/wind.mp3"], "source": "/assets/audio/princess-lima/mountain-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "crowd", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/crowd.webm", "urls": ["/assets/games/two-rivers/audio/ambience/crowd.webm", "/assets/games/two-rivers/audio/ambience/crowd.mp3"], "source": "/assets/audio/princess-lima/village-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "garden-insects", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/garden-insects.webm", "urls": ["/assets/games/two-rivers/audio/ambience/garden-insects.webm", "/assets/games/two-rivers/audio/ambience/garden-insects.mp3"], "source": "/assets/audio/princess-lima/forest-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "library", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/library-room.webm", "urls": ["/assets/games/two-rivers/audio/ambience/library-room.webm", "/assets/games/two-rivers/audio/ambience/library-room.mp3"], "source": "/assets/audio/princess-lima/mountain-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "rain", "type": "ambience", "url": "/assets/games/two-rivers/audio/ambience/rain.webm", "urls": ["/assets/games/two-rivers/audio/ambience/rain.webm", "/assets/games/two-rivers/audio/ambience/rain.mp3"], "source": "/assets/audio/princess-lima/fortress-theme.wav", "licence": "Original site-owned ambience derivative"},
{"id": "ui", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/ui.webm", "urls": ["/assets/games/two-rivers/audio/sfx/ui.webm", "/assets/games/two-rivers/audio/sfx/ui.mp3"], "source": "/assets/audio/princess-lima/quest.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "pickup", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/pickup.webm", "urls": ["/assets/games/two-rivers/audio/sfx/pickup.webm", "/assets/games/two-rivers/audio/sfx/pickup.mp3"], "source": "/assets/audio/princess-lima/pickup.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "puzzle", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/puzzle.webm", "urls": ["/assets/games/two-rivers/audio/sfx/puzzle.webm", "/assets/games/two-rivers/audio/sfx/puzzle.mp3"], "source": "/assets/audio/princess-lima/puzzle.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "archery", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/archery.webm", "urls": ["/assets/games/two-rivers/audio/sfx/archery.webm", "/assets/games/two-rivers/audio/sfx/archery.mp3"], "source": "/assets/audio/princess-lima/attack.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "cooking", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/cooking.webm", "urls": ["/assets/games/two-rivers/audio/sfx/cooking.webm", "/assets/games/two-rivers/audio/sfx/cooking.mp3"], "source": "/assets/audio/princess-lima/hit.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "dance", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/dance.webm", "urls": ["/assets/games/two-rivers/audio/sfx/dance.webm", "/assets/games/two-rivers/audio/sfx/dance.mp3"], "source": "/assets/audio/princess-lima/step.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "footstep", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/footstep.webm", "urls": ["/assets/games/two-rivers/audio/sfx/footstep.webm", "/assets/games/two-rivers/audio/sfx/footstep.mp3"], "source": "/assets/audio/princess-lima/step.wav", "licence": "Original site-owned sound effect derivative"},
{"id": "page-turn", "type": "sfx", "url": "/assets/games/two-rivers/audio/sfx/page-turn.webm", "urls": ["/assets/games/two-rivers/audio/sfx/page-turn.webm", "/assets/games/two-rivers/audio/sfx/page-turn.mp3"], "source": "/assets/audio/princess-lima/door.wav", "licence": "Original site-owned sound effect derivative"}
]
}

View File

@@ -1,22 +0,0 @@
{
"z": {
"name": "Z",
"age": 27,
"pronouns": "he/him",
"role": "A Pakistani visiting scholar and amateur archer",
"expressions": ["warm", "wry", "thoughtful", "flustered", "determined", "tender"]
},
"lima": {
"name": "Princess Lima",
"age": 26,
"pronouns": "she/her",
"role": "A Bengali princess and curator of the Festival of Two Rivers",
"expressions": ["warm", "playful", "regal", "curious", "vulnerable", "tender", "triumphant"]
},
"anwara": {"name": "Keeper Anwara", "age": 58, "role": "Senior keeper of the royal archive"},
"saira": {"name": "Saira", "age": 49, "role": "Lima's aunt and chair of the festival council"},
"nadia": {"name": "Nadia", "age": 34, "role": "A bookseller and collector of letters"},
"rayhan": {"name": "Rayhan", "age": 31, "role": "The festival's cheerful head cook"},
"mira": {"name": "Mira", "age": 29, "role": "A gardener and garland artist"},
"ishan": {"name": "Ishan", "age": 45, "role": "Master of ceremonies"}
}

View File

@@ -1,96 +0,0 @@
{
"delegation_walk": {
"start": "one",
"nodes": {
"one": {"speaker": "lima", "expression": "curious", "text": "Before the council turns you into a visiting title with polished shoes, walk with me. The courtyard makes more sense from its edges. Those blue banners were dyed by a family near the eastern canal; the gold ones came with your delegation. I wanted the colours to meet without pretending they had always been the same.", "next": "two"},
"two": {"speaker": "z", "expression": "thoughtful", "text": "At home, people sometimes speak of hospitality as though it means erasing the seam. My mother says a good host lets you see where the cloth was joined, because that is where the work and affection live. I think she would approve of your banners—and ask who climbed the ladder to hang them.", "next": "three"},
"three": {"speaker": "lima", "expression": "playful", "text": "I climbed the first ladder. Ishan discovered me, delivered a speech about royal ankles, and assigned three guards to the remaining banners. Being a princess is frequently the art of doing something useful before protocol notices. Being a scholar, I assume, is doing something reckless and adding footnotes afterward.", "next": "four"},
"four": {"speaker": "z", "expression": "wry", "text": "Only the finest footnotes. Mine would record that the curator had excellent balance, questionable respect for ceremonial ladders, and a smile capable of making a witness forget the relevant safety regulation.", "choices": [
{"id": "flirt", "text": "Admit that the smile is distracting.", "effects": [{"type": "relationship", "key": "romance", "amount": 4}, {"type": "relationship", "key": "humour", "amount": 2}], "next": "five"},
{"id": "candour", "text": "Say you admire how she credits the makers.", "effects": [{"type": "relationship", "key": "respect", "amount": 4}, {"type": "relationship", "key": "trust", "amount": 2}], "next": "five"},
{"id": "adventure", "text": "Offer to hold the next ladder.", "effects": [{"type": "relationship", "key": "adventure", "amount": 4}, {"type": "relationship", "key": "comfort", "amount": 2}], "next": "five"}
]},
"five": {"speaker": "lima", "expression": "warm", "text": "That answer may earn you a second circuit of the courtyard. Look there: cooks testing clay ovens, gardeners threading garlands, copyists checking name cards. The court calls this a royal festival because the palace pays for the pavilion. I call it a city festival because the city supplies every reason anyone comes.", "next": "six"},
"six": {"speaker": "z", "expression": "thoughtful", "text": "Then the exhibition should name hands, not only patrons. In Lahore I studied a travel album praised for a governors taste. The margins named the paper maker, the binder, and the woman who repaired it after a flood. Those small names changed the whole object. Suddenly history had a crowded room behind it.", "next": "seven"},
"seven": {"speaker": "lima", "expression": "vulnerable", "text": "That is what I am trying to build here, though some relatives prefer an uncluttered family legend. I can argue with them in committee. What frightens me is becoming fluent in their language and forgetting why I began. If you see me polishing away a difficult truth, will you tell me before I become impossible?", "next": "eight"},
"eight": {"speaker": "z", "expression": "tender", "text": "I will tell you privately, with evidence, tea, and an escape route from the committee. In return, if I start treating people like an interesting archive instead of people, you may confiscate my notebook. Temporarily. I have grown attached to it.", "next": "nine"},
"nine": {"speaker": "lima", "expression": "playful", "text": "Agreed. Though I reserve the right to ransom the notebook for another dangerously flattering footnote. Come—the library bell is about to sound. Whatever waits inside, I am glad the delegation sent the scholar who notices seams.", "effects": [{"type": "relationship", "key": "comfort", "amount": 3}, {"type": "relationship", "key": "trust", "amount": 3}, {"type": "flag", "id": "delegation_understanding"}]}
}
},
"library_search": {
"start": "one",
"nodes": {
"one": {"speaker": "anwara", "expression": "thoughtful", "text": "Search as conservators, not hunters. A hunter asks what was taken. A conservator asks what changed around the absence. The velvet beneath the folio is uncreased, the cabinet lock is unmarked, and the humidity paper was replaced at dawn by someone who understood why it mattered.", "next": "two"},
"two": {"speaker": "lima", "expression": "determined", "text": "So the person had access, knowledge, and enough patience to move the folio without bruising the binding. That narrows the suspects to an uncomfortable number of people I trust. I dislike mysteries that begin by making suspicion feel intelligent.", "next": "three"},
"three": {"speaker": "z", "expression": "thoughtful", "text": "Suspicion is only one tool. The cabinet smells faintly of vetiver and rain, but the room is dry. The folio may have been wrapped in a cooling cloth before it moved. Whoever did this was protecting it even while disobeying you.", "next": "four"},
"four": {"speaker": "anwara", "expression": "warm", "text": "Good. The final leaf was repaired with starch paste after the monsoon of my apprenticeship. Heat makes that repair tighten. Festival lamps, a crowded pavilion, and an hour of speeches would be a poor climate for it. Write that in your notebook before romance makes you careless, young scholar.", "next": "five"},
"five": {"speaker": "lima", "expression": "playful", "text": "Keeper, we have known each other for less than an afternoon. At least allow him time to become careless on his own merits.", "choices": [
{"id": "professional", "text": "Promise professional concentration, mostly.", "effects": [{"type": "relationship", "key": "humour", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 2}], "next": "six"},
{"id": "honest", "text": "Say that care and attraction can coexist.", "effects": [{"type": "relationship", "key": "trust", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 3}], "next": "six"},
{"id": "folio", "text": "Return gently to the evidence.", "effects": [{"type": "relationship", "key": "respect", "amount": 4}], "next": "six"}
]},
"six": {"speaker": "z", "expression": "determined", "text": "The replacement humidity paper is cut from a ledger page. Its watermark matches the festival accounts on the western desk. Someone wanted us to notice the paper but not immediately. There are pinpricks along one edge—five, two, seven, one—too deliberate for ordinary filing.", "next": "seven"},
"seven": {"speaker": "lima", "expression": "curious", "text": "Shelf numbers. Five is river histories, two is household accounts, seven is poetry, one is gardening. Anwara taught me that route when I was twelve. She called it the path by which a palace remembers it is fed, watered, criticised, and loved.", "next": "eight"},
"eight": {"speaker": "anwara", "expression": "vulnerable", "text": "I taught many children many routes. Some lessons are remembered only when an emergency gives them teeth. Follow the shelves. Read the marginal names. And if the trail asks you to choose between a perfect ceremony and an honest history, understand that the choice was present long before the folio vanished.", "next": "nine"},
"nine": {"speaker": "z", "expression": "thoughtful", "text": "This is not a thiefs escape path. It is a curators argument arranged as evidence. We will follow it without disturbing the repair, and we will keep separate notes about what we know, what we infer, and what we merely fear.", "next": "ten"},
"ten": {"speaker": "lima", "expression": "warm", "text": "Separate notes, shared tea, no accusations without proof. You are remarkably calming for a man who arrived carrying a bow case and a reputation for inconvenient questions. Stay close. The poetry shelf has a rolling ladder, and Ishan has already expressed his views on my ankles.", "effects": [{"type": "relationship", "key": "respect", "amount": 3}, {"type": "relationship", "key": "comfort", "amount": 3}, {"type": "flag", "id": "search_complete"}]}
}
},
"garden_walk": {
"start": "one",
"nodes": {
"one": {"speaker": "mira", "expression": "warm", "text": "The moon garden is not planted for a single country or a single season. Jasmine opens beside tuberose; bakul waits for warmer air; marigolds carry daylight into evening. A garland works because each flower keeps its own scent while accepting the same thread.", "next": "two"},
"two": {"speaker": "lima", "expression": "thoughtful", "text": "My grandmother used that image in speeches. She usually left out the gardeners who chose which flowers could survive beside one another. Metaphors become very tidy when the labour is removed.", "next": "three"},
"three": {"speaker": "z", "expression": "warm", "text": "Then let us keep the labour in view. My aunt grows jasmine in pots she moves twice a day to chase shade. She would laugh at any poet who called fragrance effortless. She would also ask why I had not yet offered to carry your basket.", "next": "four"},
"four": {"speaker": "lima", "expression": "playful", "text": "Because you suspected I would make you earn the privilege. Correctly. Tell me something true while we walk—something your official biography omitted. Visiting scholars are always reduced to institutions, awards, and one respectable hobby.", "choices": [
{"id": "failure", "text": "Describe the tournament where every arrow missed.", "effects": [{"type": "relationship", "key": "trust", "amount": 4}, {"type": "relationship", "key": "humour", "amount": 2}], "next": "five"},
{"id": "family", "text": "Talk about loud family breakfasts.", "effects": [{"type": "relationship", "key": "comfort", "amount": 4}, {"type": "relationship", "key": "familyApproval", "amount": 2}], "next": "five"},
{"id": "desire", "text": "Admit you wanted this journey to change you.", "effects": [{"type": "relationship", "key": "adventure", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 3}], "next": "five"}
]},
"five": {"speaker": "z", "expression": "vulnerable", "text": "The polished version makes me sound certain. I am not. I came because I was tired of being praised for questions that never required me to risk an answer. I wanted to meet people who could disagree with my work and still invite me to dinner afterward.", "next": "six"},
"six": {"speaker": "lima", "expression": "tender", "text": "That sounds less like uncertainty than hunger. I know it. Everyone praises my exhibitions for balance, which sometimes means I have placed every difficult fact where no guest must look at it for long. This folio may be asking whether I want approval more than truth.", "next": "seven"},
"seven": {"speaker": "z", "expression": "thoughtful", "text": "Truth without care can become another performance of power. Care without truth becomes decoration. Perhaps the work is to refuse both shortcuts. We can protect the page, credit the founders, and let the court feel the discomfort it has postponed.", "next": "eight"},
"eight": {"speaker": "lima", "expression": "warm", "text": "You say 'we' very easily. I notice that I like it. I also notice you have carried my basket for half the path without asking again, which is either considerate or a cunning strategy to stand close enough that our shoulders keep touching.", "next": "nine"},
"nine": {"speaker": "z", "expression": "wry", "text": "A serious researcher does not discard a successful method merely because the subject has identified it. For the record, the shoulder contact appears mutually reproducible.", "next": "ten"},
"ten": {"speaker": "lima", "expression": "playful", "text": "Peer review can wait until after the archery trial. If you impress me, I may permit a larger sample. If you miss every target, I will still be impressed by the honesty of your earlier confession. Either way, the garden seems determined to keep us on the same path.", "effects": [{"type": "relationship", "key": "comfort", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 3}, {"type": "flag", "id": "garden_walk_complete"}]}
}
},
"market_founders": {
"start": "one",
"nodes": {
"one": {"speaker": "nadia", "expression": "determined", "text": "People imagine censorship as a locked door. More often it is a filing choice. Put a cooks letter under household accounts, a gardeners poem under seasonal instructions, a travellers sketch under customs records, and soon no scholar thinks to gather them. Nothing is destroyed. Everything is made lonely.", "next": "two"},
"two": {"speaker": "z", "expression": "thoughtful", "text": "The folio gathers those lonely records. Its border motifs match the letters: the cooks copper ladle, the gardeners five-petal seal, the boatwomans knotted rope. The royal dedication was added later in a different hand. The festival began below the line where official histories usually stop reading.", "next": "three"},
"three": {"speaker": "lima", "expression": "vulnerable", "text": "My family did support it eventually. That matters, but it is not the same as founding it. I can already hear the council offering a tasteful plaque to the unnamed citizens while keeping the royal story at the centre. Gratitude can be used to make theft sound gracious.", "next": "four"},
"four": {"speaker": "rayhan", "expression": "warm", "text": "Then do not serve history as garnish. My kitchen still cooks the founders river rice: mustard from one bank, dried fruit brought by travellers from the west, fish or aubergine depending on the household. No single pot owns the dish. The recipe survives because people keep arguing lovingly over it.", "next": "five"},
"five": {"speaker": "z", "expression": "warm", "text": "That argument sounds familiar. At family tables, authenticity is often whoever speaks loudest until an aunt produces a stained notebook. Perhaps the public presentation should work like that notebook: specific names, specific work, no grand claim that smooths away difference.", "choices": [
{"id": "public", "text": "Recommend naming every known founder publicly.", "effects": [{"type": "relationship", "key": "respect", "amount": 4}, {"type": "relationship", "key": "familyApproval", "amount": 1}], "next": "six"},
{"id": "community", "text": "Invite descendants and guilds to tell the story.", "effects": [{"type": "relationship", "key": "trust", "amount": 3}, {"type": "relationship", "key": "familyApproval", "amount": 3}], "next": "six"},
{"id": "protect", "text": "Put preservation before spectacle.", "effects": [{"type": "relationship", "key": "comfort", "amount": 3}, {"type": "relationship", "key": "respect", "amount": 3}], "next": "six"}
]},
"six": {"speaker": "nadia", "expression": "curious", "text": "All three can coexist if the palace gives up being the only narrator. Display a facsimile, keep the fragile page in controlled light, and place the letters beside present-day voices. Let visitors see how evidence, memory, and living practice correct one another.", "next": "seven"},
"seven": {"speaker": "lima", "expression": "determined", "text": "The council will say there is no time. I will remind them that urgency was created by announcing an unveiling before conservation approval. I signed that schedule. I can admit the mistake in the same voice I use to correct it.", "next": "eight"},
"eight": {"speaker": "z", "expression": "tender", "text": "I will stand beside you, but I will not turn your admission into my heroic interruption. You discovered the conflict, listened to the keepers, and changed the exhibition. Partnership should make courage easier without stealing its name.", "next": "nine"},
"nine": {"speaker": "lima", "expression": "tender", "text": "Be careful. That is the sort of sentence a woman remembers while pretending to examine a nineteenth-century spice ledger. Stand beside me tonight and I may ask you to remain there after the speeches, when partnership has fewer witnesses and considerably less formal clothing.", "next": "ten"},
"ten": {"speaker": "rayhan", "expression": "playful", "text": "I heard nothing. I am only a cook standing three steps away with excellent hearing. Come test the founders dish. Cooperation under pressure reveals character, and if the two of you keep looking at each other like that, at least the rice deserves supervision.", "effects": [{"type": "relationship", "key": "trust", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 4}, {"type": "flag", "id": "founders_plan"}]}
}
},
"pavilion_waiting": {
"start": "one",
"nodes": {
"one": {"speaker": "ishan", "expression": "determined", "text": "The pavilion is full. Guild representatives are seated along the river side, the court delegation faces the stage, and three rival newspapers have discovered the phrase 'missing royal treasure.' I can delay the opening twelve minutes with music and perhaps five more by complimenting the ambassadors shawl.", "next": "two"},
"two": {"speaker": "saira", "expression": "thoughtful", "text": "Use ten. We should not behave as though truth is an emergency to be hidden behind entertainment. Lima, the council is divided, but no one disputes that the original cannot endure the lamps. The remaining question is whether we name the concealment and the mistaken history ourselves.", "next": "three"},
"three": {"speaker": "lima", "expression": "determined", "text": "We do. Anwara protected the folio through an improper act prompted by our improper schedule. I will not punish her publicly to preserve my authority. We will show the conservation images, read the founders names, and invite the market guilds to correct the record as research continues.", "next": "four"},
"four": {"speaker": "z", "expression": "thoughtful", "text": "The evidence supports that account. I can explain the repair, the mismatched dedication, and the letters without claiming certainty where gaps remain. The most persuasive thing we can do is let the audience see the method, including the point where our first assumptions failed.", "next": "five"},
"five": {"speaker": "saira", "expression": "warm", "text": "You have both chosen a difficult path with unusual grace. Z, a visiting scholar can leave after making trouble and call it principle. You have stayed for the repair. That distinction matters to families, even modern ones who pretend not to conduct interviews over tea.", "choices": [
{"id": "families", "text": "Say that staying for the repair is the point.", "effects": [{"type": "relationship", "key": "familyApproval", "amount": 5}, {"type": "relationship", "key": "comfort", "amount": 2}], "next": "six"},
{"id": "lima", "text": "Say that Lima made staying an easy choice.", "effects": [{"type": "relationship", "key": "romance", "amount": 5}, {"type": "relationship", "key": "trust", "amount": 2}], "next": "six"},
{"id": "work", "text": "Commit to the continuing research.", "effects": [{"type": "relationship", "key": "respect", "amount": 5}, {"type": "relationship", "key": "adventure", "amount": 2}], "next": "six"}
]},
"six": {"speaker": "lima", "expression": "flustered", "text": "Aunt Saira, if this is an interview, you might have warned me before allowing him to answer so well. I have a speech to deliver and would prefer not to do it while visibly imagining future tea tables.", "next": "seven"},
"seven": {"speaker": "saira", "expression": "playful", "text": "A curator should be able to manage competing interpretations. Besides, the entire market has managed to notice what you two believe remains subtle. Do not worry—the newspapers are still occupied with the missing-treasure headline.", "next": "eight"},
"eight": {"speaker": "z", "expression": "tender", "text": "After the speech, may I have the first dance? This is partly strategic. If I stumble publicly, the scandal may distract everyone from the archive. If I do not, I would like one memory tonight that belongs to us before it becomes an exhibition note.", "next": "nine"},
"nine": {"speaker": "lima", "expression": "tender", "text": "You may have the first dance and the private memory. You may even have the truth: I have been saving that dance since the garden, when you called our shoulders a reproducible result. Do not make me regret rewarding such terrible scholarship.", "next": "ten"},
"ten": {"speaker": "ishan", "expression": "warm", "text": "Your twelve minutes have become two. The river lamps are lit, the facsimile is in place, and the musicians are waiting. Whatever changes after tonight, the story will no longer belong to a single house. Take your positions—and, for all our sakes, save the kissing until after the council vote.", "effects": [{"type": "relationship", "key": "familyApproval", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 3}, {"type": "flag", "id": "pavilion_ready"}]}
}
}
}

View File

@@ -1,199 +0,0 @@
{
"courtyard_preparations": {
"start": "banners",
"nodes": {
"banners": {"speaker": "lima", "expression": "curious", "text": "The indigo banners belong on the riverward arches, but three ministers have moved them because blue is apparently insufficiently regal. This is what curating means: defending colour choices against men who own ceremonial hats.", "next": "z_notices"},
"z_notices": {"speaker": "z", "expression": "wry", "text": "In Lahore, a committee once spent two meetings deciding whether a catalogue ribbon was blue or philosophically teal. I survived by bringing tea and agreeing with the eldest librarian.", "choices": [
{"text": "Offer to help restore Lima's original arrangement.", "next": "help", "effects": [{"type": "relationship", "key": "respect", "amount": 3}, {"type": "relationship", "key": "comfort", "amount": 2}]},
{"text": "Suggest hiding the ministers' hats until they surrender.", "next": "hats", "effects": [{"type": "relationship", "key": "humour", "amount": 4}]},
{"text": "Admit that the curator makes indigo look dangerously persuasive.", "next": "indigo", "effects": [{"type": "relationship", "key": "romance", "amount": 4}]}
]},
"help": {"speaker": "lima", "expression": "warm", "text": "You take the river side; I will take the palace side. If anyone objects, look scholarly and mention preservation standards. People become wonderfully obedient when afraid of footnotes.", "next": "work"},
"hats": {"speaker": "lima", "expression": "playful", "text": "Tempting. Yet Aunt Saira says diplomacy means allowing people to keep one dignity each. We shall permit the hats and reclaim the arches.", "next": "work"},
"indigo": {"speaker": "lima", "expression": "playful", "text": "That line was either shameless or culturally observant. I will decide after you carry the heavier banner stand.", "next": "work"},
"work": {"speaker": "z", "expression": "warm", "text": "They work shoulder to shoulder while musicians tune beyond the gate. Lima explains how each banner carries a different river poem; Z notices she quotes the boatwoman's verse before the king's.", "next": "founders"},
"founders": {"speaker": "lima", "expression": "thoughtful", "text": "My catalogue begins with rulers because the archive begins with rulers. But festivals are made by people who cook, mend boats, grow flowers, and stay awake arranging banners. I wish the records remembered them as clearly as the songs do.", "effects": [{"type": "relationship", "key": "trust", "amount": 3}, {"type": "discoverGift", "id": "poetry_book"}]}
}
},
"ishan_protocol": {
"start": "warning",
"nodes": {
"warning": {"speaker": "ishan", "text": "Master Z, a word of survival. At sunset you will be introduced to the council. Bow to Saira, nod to the ministers, and do not call the royal genealogist's speech 'surprisingly brief.' He considers that an insult.", "next": "reply"},
"reply": {"speaker": "z", "expression": "wry", "text": "How does he feel about 'mercifully finite'?", "choices": [
{"text": "Promise impeccable diplomatic restraint.", "next": "restraint", "effects": [{"type": "relationship", "key": "familyApproval", "amount": 3}]},
{"text": "Ask which protocol Lima ignores when nobody watches.", "next": "lima", "effects": [{"type": "relationship", "key": "humour", "amount": 2}, {"type": "relationship", "key": "romance", "amount": 2}]}
]},
"restraint": {"speaker": "ishan", "text": "Excellent. You have the solemn face for it. Keep that expression when the trumpets miss their entrance and we may all preserve our employment.", "next": "kindness"},
"lima": {"speaker": "ishan", "text": "Her Highness ignores any protocol that places a tedious person between her and a useful book. I did not tell you this. I especially did not tell you she has already asked where you are staying.", "next": "kindness"},
"kindness": {"speaker": "ishan", "text": "One serious instruction: the public pavilion is for everyone. The palace is host, not owner. Lima has fought for that distinction since she was seventeen. Stand beside her on it and the city will notice.", "effects": [{"type": "relationship", "key": "respect", "amount": 2}]}
}
},
"anwara_memory": {
"start": "dust",
"nodes": {
"dust": {"speaker": "anwara", "text": "Do not wipe that dust away. It is clean dust, which is rarer than clean politics. It tells me the eastern cabinet has not been opened since yesterday.", "next": "lesson"},
"lesson": {"speaker": "lima", "expression": "warm", "text": "Anwara taught me to read dust before she taught me the alphabet. I spent a month believing every shelf was a sentence.", "next": "z"},
"z": {"speaker": "z", "expression": "thoughtful", "text": "Perhaps it is. Absence has grammar. A moved book leaves a pale verb behind; a missing folio creates an accusation.", "choices": [
{"text": "Ask Anwara who requested access to the manuscript.", "next": "access", "effects": [{"type": "relationship", "key": "trust", "amount": 3}]},
{"text": "Ask why the final folio matters to Lima personally.", "next": "personal", "effects": [{"type": "relationship", "key": "comfort", "amount": 3}]}
]},
"access": {"speaker": "anwara", "text": "The council, the conservators, the curator, and me. Too many keys for certainty; too few for coincidence. Yesterday a minister asked whether heat could make old ink appear brighter. I disliked the question.", "next": "warning"},
"personal": {"speaker": "lima", "expression": "vulnerable", "text": "My mother read its dedication at the first festival I remember. She said a country becomes honest when ordinary names are spoken in royal rooms. After she died, the folio became the sound of her voice.", "next": "warning"},
"warning": {"speaker": "anwara", "text": "The glass case is new. Its lamps are stronger than the conservators approved. If anyone values spectacle above the page, the manuscript will not survive their admiration.", "effects": [{"type": "flag", "id": "lamp_warning"}, {"type": "relationship", "key": "respect", "amount": 2}]}
}
},
"library_balcony": {
"start": "rain",
"nodes": {
"rain": {"speaker": "lima", "expression": "thoughtful", "text": "Rain on the library roof used to frighten me. The ceiling leaked above the military histories, and I imagined every dead general swimming indignantly through the catalogue.", "next": "z"},
"z": {"speaker": "z", "expression": "wry", "text": "A useful image. Most military histories would improve if the generals had to tread water while explaining themselves.", "next": "laugh"},
"laugh": {"speaker": "lima", "expression": "playful", "text": "There. You have done it again—made irreverence sound like scholarship. Is that a visiting-scholars' technique, or are you uniquely troublesome?", "choices": [
{"text": "Say the trouble appears only around her.", "next": "around", "effects": [{"type": "relationship", "key": "romance", "amount": 5}, {"type": "relationship", "key": "humour", "amount": 2}]},
{"text": "Confess that unfamiliar places make humour feel like a bridge.", "next": "bridge", "effects": [{"type": "relationship", "key": "trust", "amount": 4}, {"type": "relationship", "key": "comfort", "amount": 3}]}
]},
"around": {"speaker": "lima", "expression": "tender", "text": "How inconvenient for us both. She leans against the balcony rail close enough that his sleeve brushes hers, then makes no effort to move.", "next": "home"},
"bridge": {"speaker": "lima", "expression": "warm", "text": "Then I am glad you crossed. A palace can make guests feel observed instead of welcomed. With you, I keep forgetting which of us is supposed to be impressive.", "next": "home"},
"home": {"speaker": "z", "expression": "thoughtful", "text": "He tells her about evenings of cardamom tea, cousins arguing over cricket, his mother's precise opinions on hospitality, and the quiet loneliness of being praised for travelling far from everyone who knows how he takes breakfast.", "next": "answer"},
"answer": {"speaker": "lima", "expression": "vulnerable", "text": "I understand the loneliness of being known publicly and guessed at privately. Stay after the festival, if you can. Not forever. Just long enough that neither of us has to guess.", "effects": [{"type": "relationship", "key": "comfort", "amount": 5}, {"type": "relationship", "key": "romance", "amount": 4}, {"type": "discoverGift", "id": "spiced_tea"}]}
}
},
"mira_garland": {
"start": "empty",
"nodes": {
"empty": {"speaker": "mira", "text": "The communal arch is bare because the palace florist sent only roses. Beautiful, expensive, and completely wrong. This garland should smell like five neighbourhoods, not one drawing room.", "next": "flowers"},
"flowers": {"speaker": "mira", "text": "Jasmine for welcome, tuberose for evening, marigold for shared work, rose for affection, and bakul for memory. None belongs to one family. Together they belong to the festival.", "next": "lima"},
"lima": {"speaker": "lima", "expression": "determined", "text": "We will find every one. Put the palace roses aside for the ministers' table; they may enjoy being arranged with their peers.", "choices": [
{"text": "Volunteer to gather the flowers with Lima.", "next": "volunteer", "effects": [{"type": "relationship", "key": "adventure", "amount": 3}, {"type": "relationship", "key": "familyApproval", "amount": 2}]},
{"text": "Tell Mira the garland is living historical evidence.", "next": "evidence", "effects": [{"type": "relationship", "key": "respect", "amount": 3}]}
]},
"volunteer": {"speaker": "mira", "text": "Good. A scholar who can identify a flower is worth three who merely classify it. Her Highness knows the garden; you carry the basket and try not to stare at her.", "next": "promise"},
"evidence": {"speaker": "mira", "text": "Exactly. History that wilts by morning still matters. Perhaps especially then. Gather carefully, scholar; the roots must remain for next year's story.", "next": "promise"},
"promise": {"speaker": "z", "expression": "warm", "text": "Z accepts the basket. Lima's hand closes over the other handle. For several steps neither admits that the path is wide enough to carry it separately.", "effects": [{"type": "quest", "id": "garland", "action": "start"}, {"type": "relationship", "key": "romance", "amount": 2}]}
}
},
"garden_history": {
"start": "mosaic",
"nodes": {
"mosaic": {"speaker": "z", "expression": "thoughtful", "text": "The mosaic repeats the manuscript's four symbols, but flowers replace the royal seals. Whoever designed this wanted the clue understood by gardeners, not courtiers.", "next": "lima"},
"lima": {"speaker": "lima", "expression": "curious", "text": "My tutors called it decorative. Mira calls it a planting calendar. Anwara called both answers incomplete and refused to explain why.", "next": "sequence"},
"sequence": {"speaker": "z", "expression": "determined", "text": "Jasmine opens at welcome, tuberose carries into dusk, marigold marks the communal feast, and bakul keeps its fragrance after falling. Dawn, evening, fire, memory.", "choices": [
{"text": "Invite Lima to press the first flower with you.", "next": "together", "effects": [{"type": "relationship", "key": "comfort", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 3}]},
{"text": "Ask whether she enjoys being proved right by a wall.", "next": "wall", "effects": [{"type": "relationship", "key": "humour", "amount": 3}]}
]},
"together": {"speaker": "lima", "expression": "tender", "text": "Their fingertips meet over the stone jasmine. The mechanism clicks, but Lima looks at him rather than the opening seam. “Remarkably effective scholarship,” she murmurs.", "next": "note"},
"wall": {"speaker": "lima", "expression": "playful", "text": "Immensely. Walls interrupt less than ministers and apologise more gracefully. This one may even reveal a secret compartment.", "next": "note"},
"note": {"speaker": "z", "expression": "thoughtful", "text": "Inside is Anwara's note: The straightest arrow is useless when the target is false. Beneath it rests an old brass range token stamped with a boatwoman's name.", "effects": [{"type": "relationship", "key": "trust", "amount": 3}]}
}
},
"archery_after": {
"start": "retrieve",
"nodes": {
"retrieve": {"speaker": "lima", "expression": "playful", "text": "Lima retrieves the last arrow and examines the target with theatrical gravity. “The hay has submitted. The kingdom is safe.”", "next": "z"},
"z": {"speaker": "z", "expression": "wry", "text": "I had hoped for a medal. Or at least a curator's favourable annotation.", "choices": [
{"text": "Ask her to correct your stance at very close range.", "next": "stance", "effects": [{"type": "relationship", "key": "romance", "amount": 5}, {"type": "relationship", "key": "comfort", "amount": 2}]},
{"text": "Offer to teach her the draw you learned from your aunt.", "next": "teach", "effects": [{"type": "relationship", "key": "respect", "amount": 4}, {"type": "relationship", "key": "adventure", "amount": 3}]}
]},
"stance": {"speaker": "lima", "expression": "tender", "text": "She steps behind him, one hand at his elbow and one at his waist. “Your stance is perfectly adequate,” she says near his ear. “I am correcting your unbearable confidence.”", "next": "token"},
"teach": {"speaker": "lima", "expression": "warm", "text": "He adjusts her grip only after asking. She mirrors the unfamiliar draw, releases, and strikes the inner ring. Her delight is immediate and wholly unroyal.", "next": "token"},
"token": {"speaker": "z", "expression": "thoughtful", "text": "The range ledger names the token's owner: Samira the boatwright, winner of the first riverside contest and one of the signatures omitted from the court catalogue.", "effects": [{"type": "item", "id": "founders_record"}, {"type": "relationship", "key": "trust", "amount": 2}]}
}
},
"nadia_letters": {
"start": "shelf",
"nodes": {
"shelf": {"speaker": "nadia", "text": "If you are looking for respectable books, try the front table. If you are looking for truthful ones, help me move this crate before the inspectors notice.", "next": "letters"},
"letters": {"speaker": "nadia", "text": "Three letters were filed under royal invitations because nobody read past the seals. They describe cooks feeding strikers, gardeners lending boats, and travellers carrying poems between the rivers.", "next": "lima"},
"lima": {"speaker": "lima", "expression": "determined", "text": "Those letters should have been in the festival archive. My office requested all founder material last winter.", "choices": [
{"text": "Defend Nadia's caution without dismissing Lima's frustration.", "next": "balance", "effects": [{"type": "relationship", "key": "trust", "amount": 4}, {"type": "relationship", "key": "respect", "amount": 3}]},
{"text": "Point out that mistrust of the palace was historically earned.", "next": "earned", "effects": [{"type": "relationship", "key": "adventure", "amount": 3}, {"type": "relationship", "key": "respect", "amount": 2}]}
]},
"balance": {"speaker": "z", "expression": "thoughtful", "text": "Nadia protected vulnerable evidence; Lima tried to bring it into public care. Neither intention repairs the gap alone. They need a process the market can trust and the archive must honour.", "next": "agreement"},
"earned": {"speaker": "z", "expression": "determined", "text": "A seal once removed ordinary names from the record. Another seal cannot demand confidence by decree. Let the booksellers decide how copies are made and credited.", "next": "agreement"},
"agreement": {"speaker": "nadia", "text": "Copies first, originals later, and a market witness at every catalogue meeting. Agree to that and I will show you where the last two letters wandered.", "effects": [{"type": "quest", "id": "letters", "action": "start"}, {"type": "relationship", "key": "familyApproval", "amount": 2}]}
}
},
"rayhan_kitchen": {
"start": "steam",
"nodes": {
"steam": {"speaker": "rayhan", "text": "Excellent, educated hands. Wash them. The council doubled the guest list and halved my warning. We are making fragrant rice for two hundred people and one princess who keeps stealing pistachios.", "next": "lima"},
"lima": {"speaker": "lima", "expression": "playful", "text": "Allegations without witnesses. Z, as a scholar, you understand the importance of evidence.", "next": "z"},
"z": {"speaker": "z", "expression": "wry", "text": "There is pistachio dust on your sleeve and an expression of profound guiltlessness. The evidence is unusually charming.", "choices": [
{"text": "Take Lima's side and demand a formal tasting.", "next": "taste", "effects": [{"type": "relationship", "key": "humour", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 2}]},
{"text": "Ask Rayhan about the founders' communal meal.", "next": "history", "effects": [{"type": "relationship", "key": "respect", "amount": 3}]}
]},
"taste": {"speaker": "rayhan", "text": "A tasting. Naturally. Stand close together so I can mistrust you efficiently. Rice first, saffron second, citrus third, pistachio last.", "next": "recipe"},
"history": {"speaker": "rayhan", "text": "The first meal used whatever five streets could spare. The palace supplied plates only after discovering everyone had already eaten. Remember that when someone calls generosity a royal invention.", "next": "recipe"},
"recipe": {"speaker": "lima", "expression": "warm", "text": "Foundation, gold, brightness, green. She ties an apron around Z and leaves her hands at his waist one heartbeat longer than the knot requires. “For scholarship,” she says.", "effects": [{"type": "discoverGift", "id": "spiced_tea"}, {"type": "relationship", "key": "comfort", "amount": 2}]}
}
},
"market_walk": {
"start": "crowd",
"nodes": {
"crowd": {"speaker": "lima", "expression": "warm", "text": "In the palace every silence becomes a rumour. Here I can disappear between a spice seller and a family arguing over sweets. It is the closest thing I have to privacy.", "next": "z"},
"z": {"speaker": "z", "expression": "thoughtful", "text": "You are not very well disguised. Three vendors bowed, two children waved, and that woman gave me a look suggesting she has already planned our wedding menu.", "next": "laugh"},
"laugh": {"speaker": "lima", "expression": "playful", "text": "That is Farida. She plans everyone's wedding menu. Last month she married two customers because they reached for the same mango.", "choices": [
{"text": "Ask what Farida would serve at theirs.", "next": "wedding", "effects": [{"type": "relationship", "key": "romance", "amount": 6}, {"type": "relationship", "key": "humour", "amount": 3}]},
{"text": "Say you like seeing the city know and love her.", "next": "known", "effects": [{"type": "relationship", "key": "comfort", "amount": 5}, {"type": "relationship", "key": "familyApproval", "amount": 3}]}
]},
"wedding": {"speaker": "lima", "expression": "tender", "text": "Lima stops walking. “You move quickly for a man who took ten minutes to choose a library chair.” Then, softer: “Saffron sweets. Farida believes optimism should stain the fingers.”", "next": "hand"},
"known": {"speaker": "lima", "expression": "vulnerable", "text": "Loved is easier here because they knew me before the speeches. They remember when I fell into the fountain chasing a paper boat. I want you to know that version too.", "next": "hand"},
"hand": {"speaker": "z", "expression": "warm", "text": "A surge in the crowd presses them together. Z offers his hand; Lima takes it, and keeps it after the street widens. Neither mentions the unnecessary duration.", "effects": [{"type": "relationship", "key": "trust", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 3}, {"type": "discoverGift", "id": "brass_compass"}]}
}
},
"garland_complete": {
"start": "finished",
"nodes": {
"finished": {"speaker": "mira", "text": "Five neighbourhoods, five fragrances, and not one palace rose in command. Hold the far end, both of you. A communal garland should be lifted by more than one pair of hands.", "next": "lift"},
"lift": {"speaker": "lima", "expression": "triumphant", "text": "The arch rises above the market entrance. Children call the flower names while Mira knots each stem into the next. The crowd applauds itself rather than the palace.", "next": "z"},
"z": {"speaker": "z", "expression": "warm", "text": "This is the festival Anwara was trying to protect: not an object beneath glass, but memory practised together.", "choices": [
{"text": "Give the public credit when Saira arrives.", "next": "credit", "effects": [{"type": "relationship", "key": "familyApproval", "amount": 5}, {"type": "relationship", "key": "respect", "amount": 3}]},
{"text": "Quietly tuck one fallen jasmine into Lima's hair.", "next": "jasmine", "effects": [{"type": "relationship", "key": "romance", "amount": 5}, {"type": "relationship", "key": "comfort", "amount": 3}]}
]},
"credit": {"speaker": "saira", "text": "Then the programme will name every contributing street. Tradition is not weakened by accurate credits; only vanity is.", "next": "memory"},
"jasmine": {"speaker": "lima", "expression": "tender", "text": "She turns her face into his palm before propriety can object. “There,” she says. “Now the arrangement contains one dangerously observant scholar.”", "next": "memory"},
"memory": {"speaker": "mira", "text": "Mira sends them away with jasmine-scented fingers and the knowledge that the first founders used this same sequence to mark safe meeting places.", "effects": [{"type": "unlockCG", "id": "garland"}]}
}
},
"letters_complete": {
"start": "three",
"nodes": {
"three": {"speaker": "nadia", "text": "All three. A cook's account, a gardener's map, and a traveller's letter home. Read the signatures aloud; they have waited long enough.", "next": "names"},
"names": {"speaker": "z", "expression": "thoughtful", "text": "Amina Rahman, who fed the night crews. Debu Sen, who opened the garden gates. Samira Qureshi, who carried verses upstream and returned with another language in the margins.", "next": "lima"},
"lima": {"speaker": "lima", "expression": "vulnerable", "text": "My catalogue reduced them to 'local assistance.' Two words where three lives should be. I signed that edition.", "choices": [
{"text": "Remind her that responsibility includes correction, not self-punishment.", "next": "correct", "effects": [{"type": "relationship", "key": "trust", "amount": 5}, {"type": "relationship", "key": "comfort", "amount": 4}]},
{"text": "Offer to write the corrected entry beside her.", "next": "beside", "effects": [{"type": "relationship", "key": "respect", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 3}]}
]},
"correct": {"speaker": "z", "expression": "warm", "text": "You inherited an archive designed to overlook them. Your responsibility is not to have been born knowing better; it is to change what the next curator inherits.", "next": "copy"},
"beside": {"speaker": "z", "expression": "tender", "text": "Two chairs, one desk, several arguments over commas. I can imagine worse futures. Lima's answering smile makes the bookseller suddenly fascinated by another shelf.", "next": "copy"},
"copy": {"speaker": "nadia", "text": "The private reading room is yours until moonrise. Make the copy together. Leave the door open for propriety if you must; the shelves have heard better gossip.", "effects": [{"type": "unlockCG", "id": "library"}, {"type": "relationship", "key": "familyApproval", "amount": 3}]}
}
},
"ishan_stage": {
"start": "programme",
"nodes": {
"programme": {"speaker": "ishan", "text": "The council has rewritten the programme four times. At present the folio is unveiled, praised, illuminated, praised again, and possibly cooked by the lamps before dessert.", "next": "lima"},
"lima": {"speaker": "lima", "expression": "determined", "text": "Then there will be no unveiling. We will display a facsimile, keep the original in controlled light, and give the founders' descendants the stage.", "next": "risk"},
"risk": {"speaker": "saira", "text": "Several ministers will call that humiliation. They expected the palace to own the revelation.", "choices": [
{"text": "Frame preservation as honour rather than retreat.", "next": "honour", "effects": [{"type": "relationship", "key": "respect", "amount": 4}, {"type": "relationship", "key": "familyApproval", "amount": 3}]},
{"text": "Let the ministers be embarrassed by accurate history.", "next": "embarrassed", "effects": [{"type": "relationship", "key": "adventure", "amount": 4}, {"type": "relationship", "key": "humour", "amount": 2}]}
]},
"honour": {"speaker": "z", "expression": "determined", "text": "A fragile page is not honoured by being sacrificed to applause. The facsimile lets everyone read it; the original survives to correct us again.", "next": "ready"},
"embarrassed": {"speaker": "lima", "expression": "triumphant", "text": "At last, a festival entertainment I can endorse. Ishan, place their reserved seats where they can hear every omitted name clearly.", "next": "ready"},
"ready": {"speaker": "ishan", "text": "The descendants are waiting, the facsimile is mounted, and the lamps are safely dim. Your Highness, Master Z—the stage is yours.", "effects": [{"type": "relationship", "key": "trust", "amount": 2}]}
}
},
"dance_after": {
"start": "breath",
"nodes": {
"breath": {"speaker": "lima", "expression": "tender", "text": "They leave the dancers beneath a storm of petals. Lima is breathless, laughing, and still holding both his hands. “You followed beautifully,” she says. “Even when you did not.”", "next": "z"},
"z": {"speaker": "z", "expression": "flustered", "text": "I was conducting field research into whether a princess will catch a scholar who misses a turn.", "next": "result"},
"result": {"speaker": "lima", "expression": "playful", "text": "And your findings?", "choices": [
{"text": "She catches him, but keeps him longer than necessary.", "next": "keeps", "effects": [{"type": "relationship", "key": "romance", "amount": 6}, {"type": "relationship", "key": "comfort", "amount": 3}]},
{"text": "Further trials require somewhere quieter.", "next": "quieter", "effects": [{"type": "relationship", "key": "humour", "amount": 3}, {"type": "relationship", "key": "adventure", "amount": 2}, {"type": "relationship", "key": "romance", "amount": 4}]}
]},
"keeps": {"speaker": "lima", "expression": "tender", "text": "“A serious methodological concern.” Her thumb traces his knuckles. “We should discuss it beside the river, where nobody will interrupt the peer review.”", "next": "leave"},
"quieter": {"speaker": "lima", "expression": "playful", "text": "“At last, rigorous scholarship.” She steals him from the pavilion while Ishan heroically redirects three councillors and an aunt who is not fooled at all.", "next": "leave"},
"leave": {"speaker": "z", "expression": "warm", "text": "They walk toward the moonlit steps as music softens behind them, the public argument safely alive and the private answer waiting by the water.", "effects": [{"type": "relationship", "key": "trust", "amount": 2}]}
}
}
}

View File

@@ -1,220 +0,0 @@
{
"arrival": {
"start": "first",
"nodes": {
"first": {
"speaker": "lima",
"expression": "curious",
"text": "You must be Z. The scholar who corrected three footnotes in our festival catalogue before breakfast.",
"next": "reply"
},
"reply": {
"speaker": "z",
"expression": "wry",
"text": "Two footnotes. The third was merely being watched very closely.",
"choices": [
{"text": "I was hoping to impress the curator.", "next": "flirt", "effects": [{"type": "relationship", "key": "romance", "amount": 5}, {"type": "relationship", "key": "humour", "amount": 4}, {"type": "achievement", "id": "first_spark"}]},
{"text": "Accuracy is a form of respect.", "next": "respect", "effects": [{"type": "relationship", "key": "respect", "amount": 6}, {"type": "relationship", "key": "trust", "amount": 3}]},
{"text": "I panic-edit when beautiful royalty reads over my shoulder.", "next": "flirt", "effects": [{"type": "relationship", "key": "romance", "amount": 6}, {"type": "relationship", "key": "comfort", "amount": 3}, {"type": "achievement", "id": "first_spark"}]}
]
},
"flirt": {
"speaker": "lima",
"expression": "playful",
"text": "Careful. If you keep speaking that plainly, I may arrange for you to stand very close to me all week.",
"next": "business"
},
"respect": {
"speaker": "lima",
"expression": "warm",
"text": "Then we agree. History deserves precision—especially when powerful people prefer decoration.",
"next": "business"
},
"business": {
"speaker": "lima",
"expression": "regal",
"text": "Come. I want you to see the Moonlit Manuscript before the doors open. Its last folio carries the festival's oldest dedication.",
"effects": [{"type": "flag", "id": "met_lima"}, {"type": "relationship", "key": "adventure", "amount": 2}, {"type": "discoverGift", "id": "inkstone"}]
}
}
},
"saira": {
"start": "welcome",
"nodes": {
"welcome": {
"speaker": "saira",
"text": "So you are the visiting scholar. Lima has mentioned your footnotes twice, which is once more than she mentions most diplomats.",
"choices": [
{"text": "Her catalogue deserved the attention.", "next": "good", "effects": [{"type": "relationship", "key": "familyApproval", "amount": 5}, {"type": "relationship", "key": "respect", "amount": 2}]},
{"text": "Only the footnotes? I must work harder.", "next": "bold", "effects": [{"type": "relationship", "key": "humour", "amount": 3}, {"type": "relationship", "key": "romance", "amount": 2}]}
]
},
"good": {"speaker": "saira", "text": "A diplomatic answer. Fortunately, your expression ruined it. I think I shall like you.", "effects": [{"type": "discoverGift", "id": "embroidered_ribbon"}]},
"bold": {"speaker": "saira", "text": "Bold. I see why she smiled after breakfast. Do try not to cause an international incident before supper.", "effects": [{"type": "discoverGift", "id": "embroidered_ribbon"}]}
}
},
"missing_folio": {
"start": "case",
"nodes": {
"case": {
"speaker": "lima",
"expression": "determined",
"text": "The seal is intact, the glass unbroken, and the final folio is gone. Someone with a keeper's key removed it.",
"next": "ribbon"
},
"ribbon": {
"speaker": "z",
"expression": "thoughtful",
"text": "Not quite gone. This indigo thread was caught beneath the frame. The knot marks a reading order: dawn, rain, lantern, moon.",
"choices": [
{"text": "Ask Lima what she thinks before proposing a theory.", "next": "together", "effects": [{"type": "relationship", "key": "respect", "amount": 5}, {"type": "relationship", "key": "trust", "amount": 4}]},
{"text": "Suggest a secret keeper's trail.", "next": "trail", "effects": [{"type": "relationship", "key": "adventure", "amount": 5}, {"type": "relationship", "key": "trust", "amount": 2}]},
{"text": "Observe that mysteries improve an already excellent first date.", "next": "date", "effects": [{"type": "relationship", "key": "humour", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 5}]}
]
},
"together": {
"speaker": "lima",
"expression": "warm",
"text": "You ask instead of announcing. That is rarer in this palace than any illuminated folio. I think Anwara wants us to follow.",
"next": "close"
},
"trail": {
"speaker": "lima",
"expression": "curious",
"text": "Anwara taught me that knot when I was twelve. If she left it, the disappearance is a message—not a theft.",
"next": "close"
},
"date": {
"speaker": "lima",
"expression": "playful",
"text": "A first date usually includes tea. Solve my missing-manuscript problem and I may permit a scandalous second cup.",
"next": "close"
},
"close": {
"speaker": "z",
"expression": "warm",
"text": "Then we begin with four shelves and one lantern. Stay close—the scholarship may become dangerous.",
"effects": [{"type": "item", "id": "folio_ribbon"}, {"type": "quest", "id": "letters", "action": "start"}, {"type": "discoverGift", "id": "poetry_book"}]
}
}
},
"garden_confidence": {
"start": "bench",
"nodes": {
"bench": {
"speaker": "lima",
"expression": "vulnerable",
"text": "Everyone assumes confidence is effortless when one wears a crown. Mostly it means learning where to hide the trembling.",
"choices": [
{"text": "Offer your hand without filling the silence.", "next": "hand", "effects": [{"type": "relationship", "key": "comfort", "amount": 7}, {"type": "relationship", "key": "trust", "amount": 5}, {"type": "relationship", "key": "romance", "amount": 3}]},
{"text": "Tell her courage is action taken while trembling.", "next": "courage", "effects": [{"type": "relationship", "key": "respect", "amount": 5}, {"type": "relationship", "key": "adventure", "amount": 4}]},
{"text": "Confess that she makes you forget several useful words.", "next": "words", "effects": [{"type": "relationship", "key": "humour", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 7}]}
]
},
"hand": {
"speaker": "lima",
"expression": "tender",
"text": "Her fingers settle between yours. “You are surprisingly good at silence, Z. Do not become proud; I still prefer your voice.”",
"effects": [{"type": "discoverGift", "id": "spiced_tea"}]
},
"courage": {
"speaker": "lima",
"expression": "determined",
"text": "Then let us tremble efficiently. There is a clue at the archery range—and I intend to beat you to it.",
"effects": [{"type": "discoverGift", "id": "archery_charm"}]
},
"words": {
"speaker": "lima",
"expression": "playful",
"text": "Only several? I had hoped to be devastating. Sit nearer. Perhaps proximity will improve my performance.",
"effects": [{"type": "discoverGift", "id": "brass_compass"}]
}
}
},
"anwara_truth": {
"start": "meeting",
"nodes": {
"meeting": {
"speaker": "anwara",
"text": "You followed every thread. Good. I hid the folio because the council planned to display it beneath hot lamps until its pigments flaked away.",
"next": "history"
},
"history": {
"speaker": "anwara",
"text": "But protection was not my only reason. The dedication names cooks, boatwrights, poets, gardeners, and travellers as the festival's founders. The court catalogue names only kings.",
"next": "lima"
},
"lima": {
"speaker": "lima",
"expression": "determined",
"text": "You should have trusted me with the truth.",
"choices": [
{"text": "Anwara was wrong to act alone, but right to protect the folio.", "next": "balanced", "effects": [{"type": "relationship", "key": "trust", "amount": 5}, {"type": "relationship", "key": "respect", "amount": 5}, {"type": "relationship", "key": "familyApproval", "amount": 3}]},
{"text": "The public deserves the complete history tonight.", "next": "public", "effects": [{"type": "relationship", "key": "adventure", "amount": 6}, {"type": "relationship", "key": "respect", "amount": 3}]},
{"text": "Let Lima decide; it is her risk and responsibility.", "next": "decide", "effects": [{"type": "relationship", "key": "trust", "amount": 7}, {"type": "relationship", "key": "romance", "amount": 3}]}
]
},
"balanced": {"speaker": "anwara", "text": "A precise rebuke. You would have made a formidable keeper."},
"public": {"speaker": "lima", "expression": "triumphant", "text": "Then tonight the founders recover their names—and the council learns that truth survives poor lighting."},
"decide": {"speaker": "lima", "expression": "tender", "text": "Thank you. Not for agreeing—for remembering that the choice is mine. We reveal it, carefully and completely."}
}
},
"resolution": {
"start": "stage",
"nodes": {
"stage": {
"speaker": "saira",
"text": "The council is listening, Lima. How shall the folio be presented?",
"choices": [
{"text": "As a shared text, studied before it is celebrated.", "next": "scholar", "effects": [{"type": "bias", "id": "scholar", "amount": 12}, {"type": "relationship", "key": "respect", "amount": 6}]},
{"text": "With the founders' descendants telling the story.", "next": "families", "effects": [{"type": "bias", "id": "families", "amount": 12}, {"type": "relationship", "key": "familyApproval", "amount": 7}]},
{"text": "As the first clue in a travelling exhibition.", "next": "road", "effects": [{"type": "bias", "id": "road", "amount": 12}, {"type": "relationship", "key": "adventure", "amount": 7}]},
{"text": "Briefly. Then we dance before the speeches breed.", "next": "laughter", "effects": [{"type": "bias", "id": "laughter", "amount": 12}, {"type": "relationship", "key": "humour", "amount": 7}]}
]
},
"scholar": {"speaker": "lima", "expression": "warm", "text": "Z and I will prepare the first public edition together. I expect lively arguments in the margins."},
"families": {"speaker": "lima", "expression": "regal", "text": "The palace will lend the page; the city will supply the voices. That is how the festival began."},
"road": {"speaker": "lima", "expression": "triumphant", "text": "Let the folio travel both rivers. History should meet the people who inherited it."},
"laughter": {"speaker": "lima", "expression": "playful", "text": "A compelling scholarly principle. I second the motion—especially the dancing."}
}
},
"moonrise": {
"start": "river",
"nodes": {
"river": {
"speaker": "lima",
"expression": "tender",
"text": "The city is still arguing about the folio. You realise this means the festival succeeded.",
"next": "z"
},
"z": {
"speaker": "z",
"expression": "warm",
"text": "I have been distracted from the historical significance by the way moonlight keeps taking your side.",
"choices": [
{"text": "Ask whether she would object to being kissed.", "next": "kiss", "effects": [{"type": "relationship", "key": "trust", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 9}]},
{"text": "Tell her you do not want this night to be an ending.", "next": "promise", "effects": [{"type": "relationship", "key": "comfort", "amount": 5}, {"type": "relationship", "key": "romance", "amount": 8}]},
{"text": "Suggest investigating the dangerous proximity of her smile.", "next": "kiss", "effects": [{"type": "relationship", "key": "humour", "amount": 4}, {"type": "relationship", "key": "romance", "amount": 8}]}
]
},
"kiss": {
"speaker": "lima",
"expression": "playful",
"text": "“I would object only to further delay.” She catches his collar, and the river, the music, and every carefully prepared sentence disappear.",
"next": "after"
},
"promise": {
"speaker": "lima",
"expression": "tender",
"text": "“Good. I have several mornings in mind.” Her kiss is warm, certain, and entirely unconcerned with the waiting palace.",
"next": "after"
},
"after": {
"speaker": "z",
"expression": "flustered",
"text": "Much later, when the pavilion lanterns burn low, Z remembers that he once came here to correct footnotes.",
"effects": [{"type": "achievement", "id": "moonrise"}, {"type": "ending"}]
}
}
}
}

View File

@@ -1,22 +0,0 @@
{
"scholar": {
"title": "The Scholar's Promise",
"weights": {"respect": 0.35, "trust": 0.25, "comfort": 0.2, "romance": 0.2},
"epilogue": "They begin with letters—long, argumentative, tender letters—until two desks become one shared library. Lima calls it diplomacy. Z calls it losing every debate beautifully."
},
"laughter": {
"title": "Laughter After Midnight",
"weights": {"humour": 0.35, "comfort": 0.3, "romance": 0.2, "adventure": 0.15},
"epilogue": "Their courtship becomes a minor scandal of badly concealed smiles, midnight tea, and solemn meetings ruined by private jokes. Neither of them makes the slightest effort to improve."
},
"road": {
"title": "The Road Beyond the Palace",
"weights": {"adventure": 0.35, "trust": 0.25, "humour": 0.2, "romance": 0.2},
"epilogue": "At first light they leave with two horses, one map, and no agreement about the route. Lima brings books. Z brings snacks. The horizon learns to expect them."
},
"families": {
"title": "Two Families, One Table",
"weights": {"familyApproval": 0.35, "respect": 0.25, "comfort": 0.2, "romance": 0.2},
"epilogue": "The first shared supper runs past midnight: recipes exchanged, stories improved in the telling, and two families pretending not to notice whose hands remain joined beneath the table."
}
}

View File

@@ -1,13 +0,0 @@
{
"gifts": [
{"id": "inkstone", "name": "Carved Inkstone", "hint": "For someone who writes in every margin.", "effects": {"respect": 5, "romance": 3}},
{"id": "brass_compass", "name": "Brass Star Compass", "hint": "For a curious traveller who dislikes standing still.", "effects": {"adventure": 5, "romance": 3}},
{"id": "poetry_book", "name": "Book of River Poems", "hint": "For a reader with an inconveniently warm smile.", "effects": {"comfort": 4, "romance": 5}},
{"id": "embroidered_ribbon", "name": "Embroidered Ribbon", "hint": "A small festival keepsake in indigo and gold.", "effects": {"familyApproval": 4, "romance": 3}},
{"id": "spiced_tea", "name": "Tea Blend", "hint": "Cardamom, citrus peel, and an excuse to linger.", "effects": {"comfort": 5, "humour": 2}},
{"id": "archery_charm", "name": "Archer's Charm", "hint": "For someone who claimed she was not competitive.", "effects": {"adventure": 4, "humour": 4}}
],
"clues": ["folio_ribbon", "lantern_rubbing", "anwara_note", "founders_record"],
"flowers": ["jasmine", "tuberose", "marigold", "rose", "bakul"],
"letters": ["letter_1", "letter_2", "letter_3"]
}

View File

@@ -1,106 +0,0 @@
{
"courtyard": {
"name": "Palace Courtyard",
"act": "Act I · The Missing Folio",
"background": "courtyard",
"music": "palace",
"ambience": "birds",
"actors": [{"id": "ishan", "x": 0.5}, {"id": "saira", "x": 0.84}],
"spawn": 0.14,
"objective": "Meet Lima beside the exhibition tables.",
"hotspots": [
{"id": "courtyard_preparations", "x": 0.3, "label": "Help arrange the festival banners", "dialogue": "courtyard_preparations", "once": true},
{"id": "ishan_protocol", "x": 0.5, "label": "Ask Ishan about festival protocol", "dialogue": "ishan_protocol", "once": true},
{"id": "lima_arrival", "x": 0.68, "label": "Speak with Lima", "dialogue": "arrival", "once": true},
{"id": "delegation_walk", "x": 0.76, "label": "Walk the courtyard edge with Lima", "dialogue": "delegation_walk", "requires": ["dialogue:arrival"], "once": true},
{"id": "saira_welcome", "x": 0.84, "label": "Greet Aunt Saira", "dialogue": "saira", "once": true},
{"id": "to_library", "x": 0.94, "label": "Enter the royal library", "goto": "library", "requires": ["dialogue:arrival", "dialogue:delegation_walk", "dialogue:courtyard_preparations", "dialogue:ishan_protocol"]}
]
},
"library": {
"name": "Royal Library",
"act": "Act I · The Missing Folio",
"background": "library",
"music": "morning",
"ambience": "library",
"actors": [{"id": "anwara", "x": 0.16}],
"spawn": 0.1,
"objective": "Examine the empty display and solve Anwara's lantern cipher.",
"hotspots": [
{"id": "anwara_memory", "x": 0.16, "label": "Inspect the eastern cabinet with Anwara", "dialogue": "anwara_memory", "once": true},
{"id": "empty_case", "x": 0.3, "label": "Examine the empty case", "dialogue": "missing_folio", "once": true},
{"id": "library_search", "x": 0.4, "label": "Search the altered shelves", "dialogue": "library_search", "requires": ["dialogue:missing_folio"], "once": true},
{"id": "letter_one", "x": 0.48, "label": "Recover a misfiled letter", "collect": "letter_1", "quest": "letters", "once": true},
{"id": "library_balcony", "x": 0.6, "label": "Step onto the rain balcony with Lima", "dialogue": "library_balcony", "requires": ["dialogue:missing_folio"], "once": true},
{"id": "cipher", "x": 0.73, "label": "Solve the lantern cipher", "puzzle": "cipher", "requires": ["dialogue:missing_folio"], "once": true},
{"id": "to_garden", "x": 0.94, "label": "Follow the clue to the moon garden", "goto": "garden", "requires": ["flag:cipher_solved", "dialogue:anwara_memory", "dialogue:library_search", "dialogue:library_balcony"]}
]
},
"garden": {
"name": "Moon Garden",
"act": "Act II · A City of Clues",
"background": "garden",
"music": "garden",
"ambience": "water",
"actors": [{"id": "mira", "x": 0.08}],
"spawn": 0.08,
"objective": "Find the flowers named in the folio and test the old archery clue.",
"hotspots": [
{"id": "mira_garland", "x": 0.08, "label": "Ask Mira about the communal garland", "dialogue": "mira_garland", "once": true},
{"id": "flower_jasmine", "x": 0.16, "label": "Gather jasmine", "collect": "jasmine", "quest": "garland", "once": true},
{"id": "flower_tuberose", "x": 0.3, "label": "Gather tuberose", "collect": "tuberose", "quest": "garland", "once": true},
{"id": "garden_talk", "x": 0.56, "label": "Sit with Lima", "dialogue": "garden_confidence", "once": true},
{"id": "garden_walk", "x": 0.6, "label": "Carry Mira's basket with Lima", "dialogue": "garden_walk", "requires": ["dialogue:garden_confidence"], "once": true},
{"id": "garden_history", "x": 0.64, "label": "Study the founders' flower mosaic", "dialogue": "garden_history", "requires": ["dialogue:garden_confidence"], "once": true},
{"id": "flower_sequence", "x": 0.7, "label": "Solve the flower mosaic", "puzzle": "flower_sequence", "requires": ["dialogue:garden_history"], "once": true},
{"id": "archery", "x": 0.79, "label": "Try the moonlit archery trial", "minigame": "archery", "requires": ["flag:flower_sequence_solved"], "once": true},
{"id": "archery_after", "x": 0.87, "label": "Review the range ledger with Lima", "dialogue": "archery_after", "requires": ["minigame:archery"], "once": true},
{"id": "to_market", "x": 0.94, "label": "Continue to the old marketplace", "goto": "market", "requires": ["minigame:archery", "dialogue:archery_after", "dialogue:mira_garland", "dialogue:garden_walk"]}
]
},
"market": {
"name": "Old Marketplace",
"act": "Act II · A City of Clues",
"background": "market",
"music": "marketplace",
"ambience": "crowd",
"actors": [{"id": "nadia", "x": 0.08}, {"id": "rayhan", "x": 0.81}, {"id": "anwara", "x": 0.91}],
"spawn": 0.08,
"objective": "Ask the market's keepers what the court history forgot.",
"hotspots": [
{"id": "nadia_letters", "x": 0.08, "label": "Speak with Nadia the bookseller", "dialogue": "nadia_letters", "once": true},
{"id": "flower_marigold", "x": 0.18, "label": "Gather marigold", "collect": "marigold", "quest": "garland", "once": true},
{"id": "flower_rose", "x": 0.3, "label": "Gather a garden rose", "collect": "rose", "quest": "garland", "once": true},
{"id": "flower_bakul", "x": 0.42, "label": "Gather bakul blossom", "collect": "bakul", "quest": "garland", "once": true},
{"id": "letter_two", "x": 0.53, "label": "Recover a bookseller's letter", "collect": "letter_2", "quest": "letters", "once": true},
{"id": "letter_three", "x": 0.62, "label": "Recover the final letter", "collect": "letter_3", "quest": "letters", "once": true},
{"id": "market_walk", "x": 0.67, "label": "Walk through the market with Lima", "dialogue": "market_walk", "once": true},
{"id": "gift", "x": 0.72, "label": "Choose a gift for Lima", "gift": true, "once": true},
{"id": "garland_complete", "x": 0.75, "label": "Raise the completed communal garland", "dialogue": "garland_complete", "requires": ["quest:garland"], "once": true},
{"id": "letters_complete", "x": 0.78, "label": "Read the recovered founders' letters", "dialogue": "letters_complete", "requires": ["quest:letters"], "once": true},
{"id": "market_founders", "x": 0.79, "label": "Plan how to credit the festival founders", "dialogue": "market_founders", "requires": ["dialogue:nadia_letters", "dialogue:market_walk"], "once": true},
{"id": "rayhan_kitchen", "x": 0.81, "label": "Join Rayhan at the festival kitchen", "dialogue": "rayhan_kitchen", "once": true},
{"id": "cooking", "x": 0.85, "label": "Help Rayhan finish the festival dish", "minigame": "cooking", "requires": ["dialogue:rayhan_kitchen"], "once": true},
{"id": "anwara_truth", "x": 0.91, "label": "Confront Keeper Anwara", "dialogue": "anwara_truth", "requires": ["minigame:cooking"], "once": true},
{"id": "to_festival", "x": 0.97, "label": "Carry the truth to the riverside", "goto": "pavilion", "requires": ["dialogue:anwara_truth", "dialogue:nadia_letters", "dialogue:market_walk", "dialogue:market_founders"]}
]
},
"pavilion": {
"name": "Riverside Festival Pavilion",
"act": "Act III · Moonrise",
"background": "pavilion",
"music": "festival",
"ambience": "crowd",
"actors": [{"id": "ishan", "x": 0.28}, {"id": "saira", "x": 0.4}],
"spawn": 0.08,
"objective": "Choose how the true story will be told.",
"hotspots": [
{"id": "ishan_stage", "x": 0.28, "label": "Prepare the public presentation", "dialogue": "ishan_stage", "once": true},
{"id": "pavilion_waiting", "x": 0.38, "label": "Wait with the council before the unveiling", "dialogue": "pavilion_waiting", "requires": ["dialogue:ishan_stage"], "once": true},
{"id": "resolution", "x": 0.48, "label": "Address the festival council", "dialogue": "resolution", "requires": ["dialogue:ishan_stage", "dialogue:pavilion_waiting"], "once": true},
{"id": "dance", "x": 0.72, "label": "Join Lima for the moonrise dance", "minigame": "dance", "requires": ["dialogue:resolution"], "once": true},
{"id": "dance_after", "x": 0.82, "label": "Catch your breath with Lima", "dialogue": "dance_after", "requires": ["minigame:dance"], "once": true},
{"id": "moonrise", "x": 0.9, "label": "Walk with Lima by the river", "dialogue": "moonrise", "requires": ["dialogue:dance_after"], "once": true}
]
}
}

View File

@@ -1,14 +0,0 @@
{
"garland": {
"name": "A Garland for Everyone",
"description": "Gather five flowers for Mira's communal festival garland.",
"target": 5,
"reward": {"familyApproval": 8, "comfort": 3, "cg": "garland"}
},
"letters": {
"name": "The Bookseller's Letters",
"description": "Recover three letters that record the festival's forgotten founders.",
"target": 3,
"reward": {"trust": 5, "respect": 6, "cg": "library"}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

Some files were not shown because too many files have changed in this diff Show More