JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<<setheader "SMYRNA · NORTH-QUARTER STREETS" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/641d182a-9ca3-4be2-9e59-20c24d48c491/Merchant_Quarter_Spotter.jpg?content-type=image%2Fjpeg">> /* v2.00.11 (06 Jul): overlay REMOVED — near-duplicated Fang's "Rooftop watcher / Five behind" dialogue below. With the dialogue carrying the beat, the overlay was redundant clutter that slowed the player by making them read the same information twice. Passage-transition clears _sceneOverlay to '' by default (line ~13231), so no explicit clear needed. */ /* v1.01.11 (02 Jul): "Skinny" → "Big Sword" — reuses Fortune's street-sighting coinage ("Blond, long hair, big sword") so the intersection blocker is a KNOWN face being redeployed to herd them, not an anonymous new descriptor. Art not authoritative (author ruling); Story Bible / art reconciliation banked in Todo (which of the three carries the big sword). */ /* Spotter scene composition — two visible war-band members: - Vidūnė (rooftop watcher, Story Bible war-band §11): middle rooftop area, clear of the party panel UI chrome at left 0-30%. She's the one Lawrence has to hunt down after the retreat. - Tihomir (front-rank breaker): at the intersection edge, inboard from the alchemist's-wear building. Positions are best-guess; render-check for tuning. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"33%","bottom":"69.5%","width":"5%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"63%","bottom":"30%","width":"7%","stagger":"-0.3s","pose":"ready"}' >> <<soctrack "scene_enter" "Chase_B3_B2">> /* v2.10.48 (03 June 2026): Clare’s acknowledgment of the warm B1 reply ("got you. i\u2019ll quiet down.") moved here from a respondImmediate on the B1_warm chip. The respondImmediate fired with delayMs:1800 on the PRIOR passage and raced the "Keep moving" advance — if the player advanced before 1800ms, Clare’s line landed late / orphaned on the next paint (playtest 03 June). Tying it to this passage’s top guarantees it lands in order on a fresh paint. Gated on _socMomentFired("B1_warm") so it ONLY fires on the warm path — the aware ("k") and defer paths must not get it. NOTE: both B1_warm cluster sites (B2_Aggressive_Engage + B3) advance here, so this single conditional covers both. */ /* ─── Clare check-in — DISENGAGEMENT-TRIGGERED (v1.01.10, 02 Jul) ───────────── First authored reach-out/repair pair of the Disengagement Signal spec (crude Option-A trigger; real accumulator revisit ~July 15). Fires ONLY if the Clare whisper exchange is still OPEN — i.e. Ishani ignored a cluster (still pending) or actively chose silence (defer). Players who engaged (thanks / k / 👍-ack) never see it: Clare has her answer, she doesn't re-push. This is what makes "fortune you good?" a TRUE trust/empathy beat — Clare noticing you went quiet across real elapsed play — instead of the forced same-paint non-sequitur it was (don't-push immediately followed by a push). No settab: the whisper dot invites; the player discovers the check-in on their own terms (02-Jul no-forced-tab principle). The general chat-silence clause ([TUNE], see _lastChipAnswerTurn) is logically redundant for THIS beat (not-closed ⟺ pending ∨ defer here) and deliberately omitted; it joins in the July-15 system. */ <<if not window._socMomentFired("clare_heads_up_warm") and not window._socMomentFired("clare_heads_up_curt") and not window._socMomentFired("clare_dontpush_ack")>> <<if window._socMomentFired("clare_heads_up_defer") or window._socMomentFired("clare_dontpush_silent") or window._socMomentFired("clare_dontpush_seen")>> /* v2.00.14 (07 Jul) — 2b-i-clean: ADDED clare_dontpush_seen as a third trigger (saw-but-didn't-answer). The seen-moment is stamped when Clare's don't-push whisper is marked read (reducer, ~L10710); evaluated HERE on B3_B2 entry, i.e. at passage-advance, never on a timer (no-attention-timers principle). Three-way now: answered→no re-check (ack suppresses via the outer guard); explicit decline (defer/silence)→re-check; SAW+advanced-without-answering→re-check (this add); never-saw-it→no re-check (no seen-moment; queue holds msg 1). 2b-i-clean accepted: a false-positive here is WARM (Clare gently checks in), not punitive, so seen+advanced is a safe trigger; tune if playtest disagrees. --- prior (v2.00.09 M2-c): gate on EXPLICIT decline only (defer OR silence), dropping the old \.length clause. That clause conflated "cluster pending" with "player disengaged" — but a locked/unseen surface leaves a cluster pending the player never saw, so the re-check fired (and applied its trust/bond deltas) against someone who never had the chance to answer. With the M1 cluster-queue now holding msg 1 durably answerable, "never looked yet" is handled by the queue; "you good?" fires ONLY on a real signal that the player chose not to respond. Answered -> no re-check; explicitly declined -> re-check (Clare notices, deltas apply); never-saw-it -> no re-check (queue holds msg 1). */ <<whisper "clare" "fortune you good?" "now">> <<whisperreply '{"icon":"💚","text":"yeah just need to focus rn","stat":"ishaniClareBond","delta":10,"momentId":"B1_warm","replyTo":"clare","respondImmediate":{"from":"clare","text":"got you. i\u2019ll quiet down.","delayMs":1800,"replyTo":"you"}}' '{"icon":"⚪","text":"fine","stat":"ishaniClareBond","delta":5,"momentId":"B1_aware","replyTo":"clare","respondImmediate":{"from":"clare","text":"k","delayMs":2200,"replyTo":"you"},"journal":{"title":"she didn\u2019t push","body":"said i was fine. i\u2019m not, clare knows but left it so i don\u2019t have to explain myself to everyone.","tag":"[REL] chase · B1 · aware"}}' '{"icon":"⏸","text":"don\u2019t reply \u2014 keep playing","defer":true,"momentId":"B1_defer","replyTo":"clare","journal":{"title":"kept my head down","body":"i missed clare\u2019s ping, was caught up in the game. nice that i didn\u2019t get harassed for not responding right away.","tag":"[REL] chase · B1 · defer"}}' >> <</if>> <</if>> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.00.09 (06 Jul): was Beat-Boxer — chase-track contamination. Canon (Music Arch v6.3 §2.5): the whole chase is Legacy through the Lawrence drop (line-1687 Heartbeat motif layers under Legacy’s outro at B5). Beat-Boxer is the DOCK-COMBAT track only. Legacy now runs unbroken B1→B5, handing to Save Tonight at B4_LawrenceAppears (already planted, v1.01.11). This passage is pre-Lawrence chase, so: Legacy continues. */ /* In-world beat: Fang manages Fortune's nervous system through dry tactical banter while they walk. Operator-competent register; the warm-mentor "kid" register from the prior passage is banked but surfaces once at the end as a small redirect-to-action. */ <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Rooftop watcher. Means they don't think they need to chase. Slow your breathing."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Okay."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Five. Probably means they're all here. That's a lot for me. Embarrassing for them. If we live, you can tell people you were worth a war band."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Slow down, walk like you belong here. (pointing) Fountain's to the right."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (nervous laugh) "Where are they leading us to?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Somewhere they think they can win."</div> /* ─── Consent moment B2 (Song Min-jae directorial) — GUILD chat surface ──── v2.6: rewritten from chasechoice-in-prose + 3 branch passages to a single <<guildreply>> chip cluster. Song Min-jae's directorial push is public (guild chat); replies are public too. Chips render in the guild tab. */ <<chatpush "minjae" "now" "don't have fun without me.">> /* v1.01.09 (02 Jul): removed <<settab "guild">>. Forcing the tab to guild so the player "sees" the incoming chip cluster is vestigial (pre-dot). The derived guild dot now signals unanswered chips; the player discovers and answers on their own terms. Forcing the jump takes away agency and the joy of discovery. Chips still populate _guildReplyPending regardless of active tab, so the beat is fully functional wherever the player is. (Same cleanup as the earlier settab "whisper" removal.) */ <<guildreply '{"icon":"👍","text":"copy","stat":"minjaeTrust","delta":10,"momentId":"B2_follow","respondImmediate":{"who":"minjae","text":"good","delayMs":1800,"surface":"guild"}}' '{"icon":"👌","text":"got it"}' '{"icon":"😏","text":"wouldn\u2019t dream of it","stat":"ishaniMinjaeBond","delta":2,"momentId":"B2_playful_peer","replyTo":"minjae","respondImmediate":{"who":"minjae","text":"that\u2019s the spirit","delayMs":1600,"surface":"guild"}}' '{"icon":"⏸","text":"don’t reply, keep playing","defer":true,"momentId":"B2_defer","replyTo":"minjae"}' >> <<advance "Keep moving" "Demo4_B3_Choice">>
<<setchat "bubble">> /* v1.01.11 (02 Jul): the B3_Choice-top "got you. i'll quiet down." anchor is DELETED. It lost the final beat for LATE answerers — chips persist across passages, so answering warm after this passage rendered meant the gate had already evaluated false (caught in playtest: author answered at Dead-End Alley, paused a minute, no line). CORRECTION to the v1.01.10 comment: the v1.01.05 passage guard does NOT drop a raced respondImmediate — the respondImmediate path has its OWN guard-with-fallback (fires in-place if still on the trigger passage, else queues to pendingWhispers atPassage '*next*' — deliver-now-or-next-paint, never lost). That is exactly the Option-C mechanism, already built since ~v2.10.x. The closing beat now rides the B1_warm chip as respondImmediate (delayMs 1800): answer-and-linger → Clare replies in ~2s (real-texting feel); answer-and-advance → lands next paint. In-flight saves from v1.01.10 (warm already consumed) won't retro-heal; all fresh runs deliver. */ <<setheader "SMYRNA · NORTH-QUARTER STREETS" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/80cda41e-8f4c-4004-9ca0-4bd3d9539283/Merchant_Quarter_Fountain_Square.png?content-type=image%2Fpng">> /* Fountain-square scene: final-herding moment before the dead-end alley. Player sees 5 war-band members scattered across the street ahead (Svetomir leader + 3 spear-line + Hrafnkell pair-anchor) plus both rooftop spotters (Vidūnē + Igor). The 5 behind (Thordis + 3 pair- anchors + 1 spear-line) stay off-screen — still herding from behind. All positions/sizes are best-guess; render-check needed. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"38%","bottom":"25%","width":"12%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"65%","bottom":"25%","width":"12%","stagger":"-0.2s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"55%","bottom":"16%","width":"14%","stagger":"-0.4s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"48%","bottom":"38%","width":"11%","stagger":"-0.6s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"42%","bottom":"18%","width":"14%","stagger":"-0.8s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"70%","bottom":"24%","width":"14.4%","stagger":"-1.0s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"80%","bottom":"18%","width":"14%","stagger":"-1.2s","pose":"ready"}' >> <<soctrack "scene_enter" "Chase_B3_Choice">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.00.09 (06 Jul): was Beat-Boxer — chase-track contamination. Canon (Music Arch v6.3 §2.5): the whole chase is Legacy through the Lawrence drop (line-1687 Heartbeat motif layers under Legacy’s outro at B5). Beat-Boxer is the DOCK-COMBAT track only. Legacy now runs unbroken B1→B5, handing to Save Tonight at B4_LawrenceAppears (already planted, v1.01.11). This passage is pre-Lawrence chase, so: Legacy continues. */ /* GUILD BUDDY-COP BEAT (25 Jun 2026). Jeff/Clare two-hander over the choice — "life happening around the decision." Buddy-cop dynamic: Jeff bravado → Clare flat straight-man bluff-call ("when.") → Jeff caught, gropes, folds ("...uhh.... in movies?"). No zinger from Clare — the absence of a punchline is what makes it read as four-year friendship rather than a comedy bit; Jeff's fumble makes him losable/warm (aspirational-craft drama student whose bravado outruns experience). Staggered so the bluff-call → fold gap is the LONGEST (the "caught" pause landing in real time, echoing the dots). Fires on the GUILD tab while the player reads the three options; tonal contrast with any tender Clare/MJ whisper thread is a feature. */ <<chatpush "jeff" "now" "three on the ground, two on the roofs. i've seen worse." 800>> <<chatpush "clare" "now" "when." 1800>> <<chatpush "jeff" "now" "...uhh.... in movies?" 3000>> <<chatbeat "clare" "typing" 3800>> <<chatpush "clare" "now" "Jeff" 4800>> /* v1.01.05 (01 Jul): timing COMPRESSED 1.5/3.5/6/8/10.5s → 0.8/1.8/3/3.8/4.8s (~10.5s → ~4.8s total). Rationale (author direction): this banter does early CHARACTERIZATION work (teaching who Jeff/Clare are), so more players should catch the full arc — bravado → bluff-call → caught-fold → payoff — before a fast choice-click ends it. The passage guard (delayed chatpush/chatbeat) now drops any beat that outlives the passage, so a fast-clicker cleanly sees a prefix and nothing bleeds forward. Relative rhythm preserved: the bluff-call ("when.") → fold ("in movies?") gap (1.0s) and the typing → "Jeff" payoff gap (1.0s) remain the beat's longest pauses, so the "caught" landing still reads. PRINCIPLE (banked): once the player has been TAUGHT the banter convention, later texture beats can go guard-only (no compression) and simply reward players who dwell. Compression is the early-teaching exception, not the rule. */ <div class="d4-choices"> <<chasechoice "aggressive" "dex" "Charge left. Let the vampires believe they've trapped us." "Demo4_Chase_B4">> <<chasechoice "tactical" "flow" "Overturn the produce carts behind us, then dive left." "Demo4_Chase_B4">> <<chasechoice "trickster" "end" "Cut the cart bindings on our way past. Goods scatter. They have to slow down and pick a clear path." "Demo4_Chase_B4">> </div>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/c679384e-407a-4d97-b996-c4df197c971b/Lawrence_Standing_1400s_Front_filigree.png?content-type=image%2Fpng","left":"75%","bottom":"50%","width":"9.2%","pose":"still"}' >> <<soctrack "scene_enter" "Chase_B4_LawrenceAppears">> /* v2.11.03: added missing soctrack — Lawrence's appearance is the demo's central recognition moment and was generating no telemetry event. Every playtest path passes through this passage. */ <<setoverlay "<p>You hear something hit the rooftop. You look up.<br>The vampire from the road appears on a rooftop.</p>">> /* v2.11.04: Jeff private-whisper repair beat. Fires ~1.5s after this scene paints (passage-entry anchored, independent of B4 chip timing) so it reads as Jeff's own immediate impulse, not a Clare-prompted apology. GATED (v2.11.04 fix): only fires if the player actually triggered the public gallows joke — i.e. picked the 😬 "oh gawd, we're dead." chip at B4, which fires Jeff's "makes for a short session tonight." line and records momentId "B4_chat_gallows_jeff_repair". Without this gate the private apology fired UNCONDITIONALLY, so a player who picked a different B4 chip got Jeff apologizing for a joke that never happened (orphaned apology). Same _socMomentFired gating pattern used for the B1_warm "got you" whisper (line ~42) and the closing-surface moment tallies (line ~5066). Chips are bound to Jeff's thread (replyTo:"jeff") and self-gate: buildReplyZone only shows them once the whisper makes Jeff's the active thread, so they appear WITH the whisper, not before it. Stat gradient +3/+2/-1: warmth rewarded, curt "thanks" reads slightly distancing. */ <<if window._socMomentFired("B4_chat_gallows_jeff_repair")>><<whisperafter "jeff" 1500 "hey, gallows humor's how i keep my head when it's bad. wasn't thinking about it being your first. my bad.">> /* v2.11.06 (17 June 2026): Jeff sends a quiet 👍 acknowledgment after any of Ishani's three NON-defer replies, via respondImmediate (who:"jeff", bare emoji, 1200ms, replyTo:"you" so it lands in his thread). No text — the 👍 is conversation-closing, deliberately not baiting a re-reply. Bond bump rides on the chip as stat2/delta2 (+1 ishaniJeffBond) since respondImmediate carries no stat; kept separate from the existing delta (1/2/3) so the closing-surface curation reads "her reply's weight" and "Jeff's ack landed" as distinct events rather than inflating her line. Defer chip (B4_whisper_jeff_repair_defer) intentionally gets NO acknowledgment — a 👍 on silence is incoherent. NOTE: the 👍 lands as unread and pings the Whisper tab dot like any inbound whisper; if that reads as "thread reopened" on the build, switch acknowledgment-class whispers to a read:true variant. */ <<whisperreply '{"icon": "\ud83e\udef6", "text": "s\u2019okay", "stat": "ishaniJeffBond", "delta": 1, "stat2": "ishaniJeffBond", "delta2": 1, "respondImmediate": {"who": "jeff", "text": "\ud83d\udc4d", "delayMs": 1200, "replyTo": "you"}, "momentId": "B4_whisper_jeff_repair_warm", "replyTo": "jeff", "journal": {"title": "Jeff apologized", "body": "jeff apologized for his gallows humor. waved it off. clare vouched for this guild and he meant it kind, so i\u2019m giving him the benefit of the doubt.", "tag": "[REL] chase \u00b7 B4 \u00b7 jeff-whisper-repair"}}' '{"icon": "\ud83d\udc9b", "text": "it\u2019s fine, don\u2019t worry", "stat": "ishaniJeffBond", "delta": 2, "stat2": "ishaniJeffBond", "delta2": 1, "respondImmediate": {"who": "jeff", "text": "\ud83d\udc4d", "delayMs": 1200, "replyTo": "you"}, "momentId": "B4_whisper_jeff_repair_reassure", "replyTo": "jeff", "journal": {"title": "Jeff\u2019s okay", "body": "jeff apologized for his gallows humor. told him not to worry about it. that\u2019s nice. and unexpected.", "tag": "[REL] chase \u00b7 B4 \u00b7 jeff-whisper-repair"}}' '{"icon": "\ud83d\ude02", "text": "it was pretty funny, actually", "stat": "ishaniJeffBond", "delta": 3, "stat2": "ishaniJeffBond", "delta2": 1, "respondImmediate": {"who": "jeff", "text": "\ud83d\udc4d", "delayMs": 1200, "replyTo": "you"}, "momentId": "B4_whisper_jeff_repair_funny", "replyTo": "jeff", "journal": {"title": "Jeff\u2019s okay", "body": "jeff apologized for his gallows humor. it was funny and nice to have him joke with me.", "tag": "[REL] chase \u00b7 B4 \u00b7 jeff-whisper-repair"}}' '{"icon": "\u23f8", "text": "don\u2019t respond", "defer": true, "momentId": "B4_whisper_jeff_repair_defer", "replyTo": "jeff"}' >><</if>> /* v2.10.39: New passage inserted 20 May per author direction. Architecturally this is the *recognition moment* the opening overlay's "...and the vampire told you to meet him at Mo Stór..." has been pointing at since the demo opened. Fortune has been carrying him as thought-stream; here, the thought walks onto a rooftop. The body-action staging is load-bearing: two overlay paragraphs sequence the player's experience as sound → look → recognize, which is the cinema of recognition. PARTY ROSTER (narrative rationale — still canon): the demo's emotional architecture is Fortune-and-Fang as the established unit; Lawrence is the disruption, not the third member. He joins the party later (Mo Stór entry or after), not here. NOTE (v2.11.10, 23 Jun 2026): the old setparty/roster- slot mechanic that this comment used to describe (an "unknown" third slot, the _partySlots system) has been REMOVED — the in-fiction party-card pane is display:none and The Table (the IRL guild panel) is the live roster surface. No party-slot bookkeeping remains; only the narrative rationale above stands. LAWRENCE SPRITE STAGING (single passage with mid-scene transition): Lawrence appears STANDING (sword sheathed at his side, asset: Lawrence_standing_period_garb_sword.png). Banter happens through Fang's third line. After "What's their reason this time?", the <<swapactor>> macro fires and transitions the sprite to Lawrence_sword_drawn_right.png. The draw IS the decision — his body answers Fang's question before his mouth does. "Same as last time." lands immediately after, sword-already-drawn. Decision and declaration in the same beat. Per Story Bible §3.7 Lawrence is "competence, restraint, political weight, and charm." The single-passage transition makes RESTRAINT VISIBLE (he chose not to draw first) and RELEASED VISIBLE (he draws when words won't be enough). Restraint we see released is more dramatic than restraint we infer. SWAPACTOR MACRO: SHIPPED (v2.10.39+, hardened through v2.10.44). The <<swapactor>> call below renders a real crossfade. Earlier versions of this note warned the macro was spec-only (SOC_swapactor_macro_spec_v0_1.md) and would no-op until the engine shipped — that is STALE; the macro is implemented and battle-tested (DOM-paint deferral via setTimeout(0), stale-closure passage guard, and defensive by-ID re-resolve at write-time so it composes safely with fadeoutactors in the same passage). If an actor is removed mid-flight the swap degrades to a clean no-op (never an error), but for this sequence Lawrence is never removed, so the crossfade lands. The <<setactors>> call above uses the macro's required "id" field — this is backward compatible with the existing setactors usage elsewhere in the demo (those calls without "id" are simply unaddressable by swapactor, which is fine). Lawrence sprite positioning: 72% left, 30% bottom, 6.5% width — placing his feet on the right-side rooftop per author's annotated screenshot. Expect 1-2 render-check iterations to nail the position against the actual alley-fight art's rooftop line. Lawrence speaker label: "???:" NOT "Lawrence:" — Fortune recognizes the vampire-individual at the rooftop (same coat as the bandit raid; same face; vampires are as facially diverse as humans, so this is a specific-person recognition, not a species-match), but she does not know his NAME. Identity and species are separate knowledge layers in the demo's canon. She knows what he is; she does not know who he is. His name will land only when someone speaks it to her (likely Fang or Marcus at Mo Stór). The "???:" labels at B5/B6 (lines ~1186, 1260, 1262, 1264) are therefore CORRECT and should remain — they track the identity layer, not the species layer. Earlier draft commentary in this file (now corrected) incorrectly framed Fortune as knowing his name; that framing has been retracted. The visual recognition is reinforced by a magic-system mechanic: per author canon 20 May, cast spells remain connected to their caster and "recognize" the caster when in proximity. Lawrence charmed Fortune at the bandit raid (the charm IS the gravitational pull she has been carrying for three weeks; the opening overlay's "...and the vampire told you to meet him at Mo Stór..." is the charm's voice in her body, not just memory of an instruction). v2.10.48 (03 June) NOTE: an earlier-this-session removal of that overlay line was REVERTED — the line is load-bearing setup for Lawrence's "(hint of surprise) You came." payoff in Demo4_Chase_B6. Without the summons planted at the opening, "you came" pays off nothing. The line stays in the opening overlay. When Lawrence appears on the rooftop, the charm-on-Fortune resonates with its caster's proximity. Recognition is therefore eyes + spell-resonance — not "starts to suspect," not tentative, but immediate. The drop and war-band fight don't CONFIRM the recognition; they confirm the recognition was correct to act on. See parking lot Entry 004 for the full magic-system canon. Author canon (revised 20 May): - SPECIES known visually from the bandit raid (no exposition beat needed; vampires are a visibly distinct species) - INDIVIDUAL recognized at the rooftop (clothing + face match, PLUS charm-caster resonance per parking lot Entry 004) - NAME unknown until someone introduces him - RELATIONAL CONTEXT (Fang's 40-year history with him) unknown to Fortune; she has only the cryptic chase-banter hints to go on. MJ "hold my beer" is gamer-coded-generic on its face, but its *speech act* — Lawrence's pilot posting it AT the moment of Lawrence's rooftop entrance — is the director-mode declaration. Per Story Bible §3.7, MJ plays Lawrence "loud tonight." The line itself is anyone-in-the-guild; the timing is MJ-as-Lawrence-pilot. Clare's laugh emoji is guild-lead social glue — she receives MJ's performance, which keeps the table warm during high-tension in-world action. Ishani's chip (😂 / silent) lets the player consent to join the laugh or stay focused in-world. The laugh chip bumps ishaniMinjaeBond +2 (receiving his performance is a small bond gesture); silent is no bond change. */ <<chatpush "minjae" "now" "hold my beer">> <<chatpush "clare" "now" "😂">> <<guildreply '{"icon":"","text":"😂","stat":"ishaniMinjaeBond","delta":2,"momentId":"B4_lawrence_laugh","replyTo":"guild","journal":{"title":"laughed with the team","body":"min-jae said \u2019hold my beer\u2019 right as lawrence dropped off the roof. fortune and fang are backed into a dead-end alley against a whole war band. i\u2019m laughing at my kitchen table. didn\u2019t expect that.","tag":"[REL] chase · B4 · lawrence-laugh"}}' '{"icon":"⏸","text":"hold position","defer":true,"momentId":"B4_lawrence_silent","replyTo":"guild","journal":{"title":"eyes up","body":"min-jae said hold my beer. clare laughed. i watched.","tag":"[REL] chase · B4 · lawrence-silent"}}' >> <<soundprompt "footfall" "Sharp ceramic tile impact on the rooftop. Brief. The kind of sound that makes you look before you decide to.">> <<soundprompt "music-cue" "Legacy gives way to the Heartbeat motif as Lawrence lands — the score registers him. Per Music Architecture: the Heartbeat-plant pays off HERE (Lawrence's arrival through the end of the alley), not at the later tavern reveal. v4.12 canon shift 27 May 2026.">> /* v2.10.44 (27 May 2026): Heartbeat (2PM) enters as the music box at Lawrence's arrival and carries through the end of the alley sequence (B5 → B6 → B7). Per author canon 27 May: Heartbeat's home moved here from the (now-removed) Mo Stór tapestry-reveal cue. Lawrence's drop is the emotional pivot of the chase, and the soundprompt's "the music registers him" beat literally describes this transition. The heartbeat-as-her-actual-heartbeat canon (chase B6 soundprompt) fits a high-adrenaline arrival far better than a quiet tavern reveal. */ <<music "Save Tonight" "Lee Jun-Ho acoustic commission (wishlist)" "" "">> /* v1.01.11 (02 Jul): Lawrence window unified to Save Tonight (Lee Jun-Ho acoustic commission) from Lawrence-appears through his departure to tail the war band (B4_LawrenceAppears → B7). Replaces Heartbeat/TOXIC in-window; executes the music-session ruling removing TOXIC from the rooftop→departure sequence. Commission pattern (empty URL) per the Forestella precedent. */ <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (looking up) "Nice of you to join us."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "I was in the neighborhood. Thought I'd drop by."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (points her sword at the war band) "What's their reason this time?"</div> <<swapactor "lawrence" "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d4dde662-fa07-4847-a818-76d804f93b5f/Lawrence_Sword_Draw_Front.png?content-type=image%2Fpng" "crossfade" 1800 1500>> <<soundprompt "blade" "Sword clearing scabbard. Sharp. The metal of his answer arriving before the words do.">> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "Same as last time."</div> <<sceneadvance "Lawrence drops." "Demo4_Chase_B5">>
<<setchat "pane" "force">> /* v2.00.04 — GUILD CHAT ARRIVES. The D2 opening (Beat1_Debt) forces chatMode 'off', so The Table is hidden through the debt beat + kitchen. This is the game-entry moment where it comes back on — "you've joined the guild." FORCE is required: setchat is a no-op without it (pane state is player-owned), so the prior bare <<setchat "pane">> never fired and the pane stayed stuck-off through the whole chase. guild surface is unlocked by default (StoryInit); whisper/ journal/roster stay locked (progressive disclosure) until their own <<unlocksurface>> calls. Old comment about "reverts to bubble at Beat 2" was stale — that Beat 2 (Lawrence glimpse) was deleted in the v2.00.03 merge. */ <<setheader "SMYRNA · MERCHANT QUARTER" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/57f48ae7-689c-4054-8dc7-7c132dd2528a/Merchant_Quarter_Chase.png?content-type=image%2Fpng">> /* v2.11.05 (16 June 2026): background swapped to Merchant_Quarter_Chase.png — a flat, side-on merchant-quarter plate (continuous building backdrop, central well, cobblestone street running across the bottom ~18% of frame). This reverts the v2.10.17 swap (which had moved B1 to Aggressive_arrival.jpg). Actor anchoring re-tuned for the new plate: the old bottom:5% was calibrated for the high aerial-recession Aggressive_arrival layout; on this flat plate the groundline sits low, so figures drop to bottom:1% to plant their feet in the cobblestone band and clear the curb line (per author: back feet were clipping the curb at 3%). v2.11.05b: Fang moved right (32%→37%) so Fortune (rendered second = on top) overlaps Fang's trailing edge — hides the cloak frame-cut and reads as the pair running together. Fortune left unchanged at 46%; both at bottom:1%. v2.11.05c: pair shifted as a locked unit toward image-right (+15 each: Fang 37→52%, Fortune 46→61%) for cinematic lead room. The figures run toward image-LEFT (see Fang_Run_Bam_Left sprite), so seating their mass on the right third opens the street AHEAD of them on the left — running into space, not trapped against the frame edge. Overlap/occlusion and bottom anchor unchanged. Both figures also shrunk 12% (Fang 22%→19.4%, Fortune 28%→24.6%) to read at the right scale against this background; the Fortune-marginally-smaller depth cue is preserved. NOTE: left/horizontal placement unchanged (Fang 32%, Fortune 46%) — on this symmetrical centered plate the pair sits just left of the central well; revisit horizontal placement separately if recomposition is wanted. v2.6: Fang is L8 and ahead (slightly left, larger, foreground z-layer). Fortune is L2 and behind (slightly right, marginally smaller, depth cue). Both bottom-anchored to sit on the cobblestone road. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8514aa8d-24a1-43ee-a9c1-1fe204471b84/Fang_Run_Bam_Left.png?content-type=image%2Fpng","left":"52%","bottom":"1%","width":"19.4%"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/155807fb-781a-4428-9aa1-5be8c626245f/Fortune_Running_Sword.png?content-type=image%2Fpng","left":"61%","bottom":"1%","width":"24.6%","stagger":"-0.3s"}' >> <<soctrack "scene_enter" "Chase_B1">> /* ─── Chase track: Legacy (NEXZ) ─────────────────────────────────────── v2.10.44 (27 May 2026): Ghost Town plays at the kitchen-seam (Desire) passage; Legacy is the chase track and starts cleanly HERE at the first chase beat — no crossfade-from-Ghost-Town pill. Legacy carries through the chase until Heartbeat (2PM) enters at Lawrence's arrival (B4). Per Game Bible §9.2: one track plays at a time. */ <<music "Legacy" "NEXZ" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> <<chatpush "minjae" "now" "lawrence is heading into town. brb">> <<chatpush "minjae" "now" "rough day. need to run something stupid tonight.">> <<chatpush "clare" "now" "💀 fang and fortune are running for their lives. classic tuesday. ishani, you ready?">> <<chatpush "jeff" "now" "marcus is in the tavern waiting for y'all">> <<guildreply '{"icon":"💀","text":"lmao same. in.","stat":"ishaniClareBond","delta":5,"momentId":"ishani_coldopen_guild_warm_solidarity","replyTo":"clare","respondImmediate":{"who":"jeff","text":"oh, we\u2019re in for an evening, huh?","delayMs":2200,"surface":"guild"}}' '{"icon":"▶","text":"starting","momentId":"ishani_coldopen_guild_neutral_ready","replyTo":"guild","respondImmediate":{"who":"jeff","text":"oh, we\u2019re in for an evening, huh?","delayMs":1800,"surface":"guild"}}' '{"icon":"🫡","text":"hey Min-jae, hope tonight helps","stat":"ishaniMinjaeBond","delta":2,"momentId":"ishani_coldopen_guild_warm_mj","replyTo":"minjae","respondImmediate":{"who":"jeff","text":"oh, we\u2019re in for an evening, huh?","delayMs":1800,"surface":"guild"}}' '{"icon":"⏸","text":"don\u2019t post, just log in","defer":true,"momentId":"ishani_coldopen_guild_lurk","replyTo":"guild"}' >> <<whisper "clare" "hey, fyi, mj is dealing with personal stuff tonight. don't take whatever he does too seriously." "now">> /* v2.6: reply chips. Four options including the canonical "defer" (Wait-or-Type heritage from Demo 3 Scene 3). Each non-defer option carries a stat delta against $ishaniClareBond (consent-architecture scale: 1-100, baseline 50). Defer doesn't apply a delta but does track the non-reply state for future de-escalation behavior. */ /* v2.6: reply chips with response paths. - "thanks for the heads up" → DEFERRED. Clare comes back to it post-chase at Mo Stór arrival, naming what Ishani's care meant. - "is he okay?" → IMMEDIATE, fast (1500ms). A real question gets a fast answer — Clare reads the concern, doesn't make Ishani wait. - "k" → NO response. Clare reads the signal and gives space. - defer → NO response. Player chose silence; system honors it. Demo 4 establishes the pattern (warm/concerned/curt/silent → varied response timing). Tutorial principle: responses are fairly immediate in this opening beat so the player learns the system is alive. Later beats can lean harder into asymmetric timing. */ <<whisperreply '{"icon":"💛","text":"thanks for the heads up","stat":"ishaniClareBond","delta":5,"momentId":"clare_heads_up_warm","replyTo":"clare","respondDeferred":{"from":"clare","text":"btw thx for not being weird about him tonight 🙏","atPassage":"Demo4_MoStor_Arrival","replyTo":"you"}}' '{"icon":"🤔","text":"is he okay?","stat":"ishaniClareBond","delta":3,"momentId":"clare_heads_up_concerned","replyTo":"clare","respondImmediate":{"from":"clare","text":"yeah just tired. don\u2019t push","delayMs":1500,"replyTo":"you","thenReply":[{"icon":"","text":"👍","stat":"ishaniClareBond","delta":3,"momentId":"clare_dontpush_ack","replyTo":"clare"},{"icon":"⏸","text":"don\u2019t reply","defer":true,"momentId":"clare_dontpush_silent","replyTo":"clare","journal":{"title":"let it sit","body":"clare said don\u2019t push, so i didn\u2019t. left it there.","tag":"[REL] chase · B1 · dontpush-silent"}}]}}' '{"icon":"😐","text":"k","stat":"ishaniClareBond","delta":-2,"momentId":"clare_heads_up_curt","replyTo":"clare"}' '{"icon":"⏸","text":"do not respond right now","defer":true,"momentId":"clare_heads_up_defer","replyTo":"clare"}' >> <<artprompt "B1-establish" "Wide shot. Smyrna merchant quarter, mid-afternoon, sun angled low and warm. Narrow stone street between two-story plastered buildings; awnings stretched over spice stalls and fabric racks. Foreground mid-action: Fortune (per Story Bible §3.1 — South Asian / Indian-presenting, 5'8\", lean-but-muscular working body, age 30, warm brown skin, strong elegant facial features, long black hair worn loose past her shoulders in this scene OR styled into a braid for combat; light-tan turban / head-wrap with fabric trailing as a scarf around her neck and shoulders; lamellar/scale-coat brown leather armor with rivets and articulated shoulder pauldrons, crossed leather chest straps, belt rig with brown leather satchel and water-skin, curved Central-Asian saber sheathed at right hip, knee-high leather boots; visual anchor Fortune_Original.png) and Fang (werewolf in human form, born in Kazakh territory; presents as early-to-mid 40s, actually 240+ years old; high cheekbones, fair-to-light-brown skin, jet-black hair worn in a single thick braid, narrow eye shape with epicanthic fold, tall ~6ft, working body; Sherri-Dindal-coded vocally — visual is Central Asian working-guard; Florentine dual-blade carry — Samarkand short sword primary on right hip, curved Joseon hip-blade off-hand on left, both sheathed crossways; wolf-puppy in chest sling) both mid-stride, running TOWARD camera. Behind them, ~10–12 paces back: three figures pursuing — long coats, controlled gait, NOT panicked. Period-accurate Smyrna texture: Greek and Turkish merchants in background, baskets, brass coffee pot, hanging string of dried peppers. Bystanders not yet reacting. Style: Studio Ghibli adventure crossed with Persona 5 motion lines — sun on stone, dust kicked up by feet. Aspect 16:9." true>> <<soundprompt "ambient" "Smyrna merchant quarter mid-afternoon: footfalls running on stone (multiple — Fortune + Fang foreground, three pursuers behind in mid-distance), background market hum (Greek and Turkish merchants haggling but indistinct, brass clinking, hanging-bell wind chimes from awnings, occasional canvas flap), no shouting/alarm. Sound design rule: pursuers do NOT shout. The wrongness is the silence.">> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (ahead, through the dust) "...the spice street, I said NOT the ...."</div> <!-- §1 NEAR-MISS (not separation). The crowd-surge breaks them apart for a beat, then Fang closes back to Fortune's shoulder. Buddy-cop: Fang stays co-present through the chase (every B2 branch assumes it). Fortune's working-guard threat call-out is now answered by Fang, not lost into a void. --> <div class="d4-prose"><p>A cart lurches sideways. The crowd breaks the wrong way and you lose the line of her for a breath, then she's back at your shoulder, matching your pace.</p></div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Three. Vampires. Blond, long hair, big sword."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "I see them. Stay on me."</div> <div class="d4-choices"> <<chasechoice "aggressive" "" "Turn and face them. Together." "Demo4_Chase_B2_Aggressive">> <<chasechoice "tactical" "" "Put the stall between you and them. Cover the runners." "Demo4_Chase_B2_Tactical">> <<chasechoice "trickster" "" "Cut their angle before they close." "Demo4_Chase_B2_Trickster">> </div> <!-- TIMER PULLED (v1.00.03, 23 Jun 2026): the <<chasetimer>> shrinking-bar was removed here. It pressures READING speed, which is a mismatch with text-heavy choices (railroaded before the player could read 3 triage-verbs). Gated on a later medium-moment (full animation OR a looping-audio track). Full design + the working macro/CSS code are preserved in SOC_Timer_CarryForward.md so we don't reinvent it. (v1.00.04, 24 Jun: the earlier "separation spine" that once carried the frantic beat was removed when the chase moved to Path A buddy-cop — Fang stays co-present. Frantic now comes from the near-miss prose + the boxed-in threat read, carried via CONTENT, not a clock.) -->
<<setchat "bubble">> <<setlocation "merchant_quarter">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/dfc13afb-800d-4af8-a1d4-5e02a022d831/Merchant_Quarter_Aggressive_Sidestreet.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Chase_B2_Aggressive">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.10.45: music moved above dialogue — was rendering below the dialogue block. Matches B1 canonical position (music after scene-setup, before content). */ /* v2.10.38: Background swapped from Merchant_Quarter_Aggressive_arrival.jpg (open town square) to Merchant_Quarter_Aggressive_Sidestreet.png (narrow alley with a deep stone arch at the vanishing point). Per author 18 May: the Aggressive-path first beat is canonically the moment Fortune+Fang round the corner into the alley and find Stari Krov holding the far exit. The sidestreet image's deep arch IS the canonical capture-formation staging — the three vampires are positioned at the alley's mouth-out (under and just in front of the arch), holding the only forward exit. Sceneprose "Fang's hand has not moved to her sword" reads correctly against this geometry (no immediate engagement; Fang is reading, not committing). <<setlocation>> kept for header consistency (still SMYRNA · MERCHANT QUARTER · Mid-afternoon · DEMO 5 · §1). <<setscene>> after it overrides only the image. Header/chapter metadata still flows from the location dictionary; only the visual changes. v2.10.38: Three-vampire sprite positioning (Tihomir / Zlata / Eyvindr, left-to-right per Story Bible §5.6.4 Fang sweep) recalibrated from author's marker-dot annotation on 18 May. Horizontal positions landed correctly: left:40/47/53. v2.10.38: Sprite SIZING recalibrated per author render-check 18 May. Width scaled up from 4.5-5% → 6-6.5% to match the visual reference: vampires should be "as tall, or just a bit taller than the doorway visible just to the right of Zlata" — i.e., the framed building opening on the half-timbered building face at the right side of the alley (~17-18% of image height). At 6-6.5% width, sprites render at ~17-18% of image height, matching that doorway. Bottom values nudged (38/40 → 36/38) to keep feet on the same ground-line now that the sprites are taller; without this, the taller sprite's feet would float above the ground plane. Canonical realworld scale: vampires are 6' to 6'4" per character bible, so they SHOULD read as marginally taller than a typical period doorway. Horizontal positions (left: 40/47/53) preserved from v2.10.38 — they read correctly per render. Center vampire (Zlata) still slightly deeper than her flankers (bottom 38 vs 36) producing the shallow inverted-V "holding the exit" formation. Tactical's sprite positioning is now decoupled — it continues to inherit side-street placeholder geometry (which still uses the pre-swap merchant-quarter image). Sprite calibration for Tactical will need a separate recalibration pass when side-street art lands. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"40%","bottom":"36%","width":"6.5%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"47%","bottom":"38%","width":"6%","stagger":"-0.2s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"53%","bottom":"36%","width":"6.5%","stagger":"-0.4s","pose":"ready"}' >> /* v2.10.21: B2_Aggressive REWRITE per author direction 13 May. Three prior versions of this passage's body: - Pre-2.10.18: minimal <<setoverlay>> with one line — "Breaker. Closer. A third one you cannot see — the holder." (cut from a longer prose paragraph in the 10 May audit per chat 0d7d9678). - v2.10.18: 4-beat actionarc (target acquisition → execute → consequence → Fang names formation roles). REVERTED — re-introduced exactly the telling-not-showing the 10 May audit removed. - v2.10.20: still showing v2.10.18 actionarc (was actually-rendered for first time after the v2.10.20 routing fix made the passage reachable). Author caught "Fang renames vampires that Fortune just named differently 30 seconds ago" and the floating-vampire sprite bug at this point. v2.10.21 architecture: the scene is dialogue, not cinematic. Fang sees six total vampires (three in front now, three pursuing from behind), does the formation math out loud, recognizes Stari Krov colors, and names herself as the target. Player learns "Stari Krov" as a word without knowing what it means — that weight gets paid off at Mo Stór briefing + Lawrence's "answer is still no" line. Register-rule preserved: we are never in Fang's head (only Ishani's). Fang's recognition of the coats is DIALOGUE — her teaching Fortune what she's seeing, not narrator-interiority. The journal entry that would normally land this beat is DEFERRED to a later passage where Fortune has enough context to write it (probably post-Lawrence-coat- slice or Mo Stór). Adding the journal entry here would force Fortune to know what Stari Krov is before Fang has finished naming them. No actionarc — dialogue with sceneprose beat, paced through normal passage flow. The 10 May audit principle holds: prose surface should not narrate what the art is meant to show. Here, the art shows three vampires waiting; the dialogue is *Fang's read of what the art means*, which is information the art alone cannot convey. That distinction is the audit's load-bearing test, and this passage passes it. */ <!-- Relocated from B1: Min-jae/Clare guild interrupt opens the post-choice beat so it reads, instead of flashing under the choice. Texture only, never load-bearing. v1.01.16 (03 Jul): one-time guard ($chase.mjRunPushed). The pair was copy-pasted into all three sibling B2 branches; append-only chat + cross-branch Back-nav surfaced the pair twice in one playthrough. Guard makes it push once regardless of which branch(es) render or re-render. Flag lives on $chase (resets on restart via StoryInit). Identical block in all three B2 branches. --> <<if not $chase.mjRunPushed>> <<chatpush "minjae" "now" "Run. I'm coming.">> <<chatpush "clare" "now" "mj wait, they've got the whole quarter boxed">> <<set $chase.mjRunPushed to true>> <</if>> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "...three in front. Three behind."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "That's six. Which means there are six more I can't see."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Twelve. That's Stari Krov."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Stari Krov?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Those are their colors. I haven't seen them in forty years."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (hand on her sword hilt) "This isn't a robbery. They're here for me."</div> <<chatpush "clare" "now" "uhh">> <<chatpush "minjae" "now" "Then I'm definitely coming.">> /* v1.01.02 (01 Jul): was a duplicate "Run. I'm coming." (already pushed at the relocated interrupt ~line 625). Changed to a distinct post-reveal MJ beat reacting to the Stari Krov naming — the "then" acknowledges the reveal without MJ over-explaining what he knows. Kills the content duplicate the dedup guard couldn't catch (non-adjacent + curly-vs-straight apostrophe mismatch). */ /* v2.10.38: MJ line was "that's a lot of them" (per v2.10.21 changelog comment further down, rationale: "Neither knows what Stari Krov is"). Canon correction per author direction 18 May: MJ IS a vampire, knows the clan, and knows why they're after Fang. "that's a lot of them" read as ignorant. "Run. I'm coming." reads as informed urgency — AND communicates game-state to the player (Fang+Fortune-vs-12 is not survivable) via in-character action rather than engine narration. Slight cringe of the MJ-protector instinct is intentional; the chip responses calibrate Ishani's stance toward it (see <<guildreply>> below). */ /* v2.10.38: Foley cue (Fang clipping pursuer across collarbone) removed — the dialogue rewrite no longer stages an on-screen clip moment, so the cue was orphaned (describing an action that doesn't happen in the new prose). Journal entry moved into Demo4_Chase_B2_Aggressive_Dive — it now fires only when the player picks Dive, not unconditionally. */ /* v2.10.38: <<guildreply>> chip cluster at the recognition beat. Parallel-planes architecture: chips render in the right pane (IRL guild chat surface) while the chase choice renders in the prose column (in-world action surface). Both run independently — player can comment in chat before/after/while picking the chase choice, or skip either surface entirely. The chase choice advances the passage; the chip cluster fires chat reactions but doesn't gate progression. Chip 2 is the load-bearing canon plant: Clare-the-pilot identifies Stari Krov as having been after "a friend of mine" — meaning Lawrence (a friend of Fang's, blurred through pilot/character identity per the canonical pilot-character blurring). Players who track this learn that the Demo3 vampire is connected to what's happening now. The line lands offhand; the canon-conscious player gets the chill. Chip 4 (defer): scared-grimace emoji, no text. Silence-with-affect per consent architecture — the player IS reacting, just not committing words to chat. No respondImmediate; the table absorbs. */ <<guildreply '{"icon":"🫥","text":"Min-jae be careful","stat":"ishaniMinjaeBond","delta":2,"stat2":"lawrenceTrust","delta2":2,"momentId":"B2_Aggressive_care_for_mj","replyTo":"minjae","respondImmediate":{"who":"minjae","text":"i\u2019ll be fine","delayMs":1500,"surface":"guild"}}' '{"icon":"👀","text":"clare, what does fang know that i don\u2019t?","stat":"fangTrust","delta":3,"stat2":"ishaniClareBond","delta2":2,"momentId":"B2_Aggressive_ask_clare","replyTo":"clare","respondImmediate":{"who":"clare","text":"vampire clan that\u2019s after mj\u2019s character","delayMs":1900,"surface":"guild"}}' '{"icon":"💀","text":"did not expect to fight vampires tonight","stat":"ishaniClareBond","delta":2,"momentId":"B2_Aggressive_register_mirror","replyTo":"guild","respondImmediate":{"who":"jeff","text":"Oh, this will be exciting.","delayMs":1700,"surface":"guild"}}' '{"icon":"😬","text":"","defer":true,"momentId":"B2_Aggressive_grimace_defer","replyTo":"guild"}' >> <div class="d4-choices"> <<chasechoice "aggressive" "" "Engage the three in front." "Demo4_Chase_B2_Aggressive_Engage">> <<chasechoice "tactical" "" "Dive left down the side street." "Demo4_Chase_B2_Aggressive_Dive">> </div>
<<setchat "bubble">> <<setlocation "merchant_quarter">> <<setheader "SMYRNA · MERCHANT QUARTER" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/dfc13afb-800d-4af8-a1d4-5e02a022d831/Merchant_Quarter_Aggressive_Sidestreet.png?content-type=image%2Fpng">> /* Engage branch — merged scene at the alley. Player engaged the three vampires at B2_Aggressive's choice. The action accelerates: Fang's war-band-naming PLUS Clare's recognition PLUS the Clare whisper check-in all land in one beat. Header stays MERCHANT QUARTER (the alley is still the scene; we haven't advanced location). Sprite positions match B2_Aggressive parent (left 40/47/53, bottom 36/38/36, width 6.5/6/6.5%) — vampires at the threat positions the player just saw them at. Scene reads as "facing the threat," matching the dialogue (Fortune asks the personal question; Fang answers with humor; Fortune banks the story for later). Clare's "...oh / oh that's bad" chat reactions read Fang's war-band naming, not the formation art, so they land cleanly in the alley context. v2.10.44 (26 May 2026): the prior <<setoverlay>> line — "They give ground as you advance. Always the same distance. Always out of sword range." — was narrator-voice carrying tactical truth Fortune can observe but doesn't yet have the experience to name. Per Standing Rule A8 (in-world is primary) and Story Bible §15 (no internal data-processing narration), this kind of observational truth belongs in dialogue, not overlay. Converted to a three-beat exchange that ALSO makes the aggressive-choice consequence visible (Fortune presses, war band gives ground) before Fang names what she's clocked. Reads as: Fortune acts on her commit → Fang clocks the threat's response → Fortune asks → Fang names the diagnostic. Fang's "(eyes on the vampires)" parenthetical is load-bearing per Story Bible §3.8 (Fang reads situations through the people she's working with). She doesn't need to watch Fortune — they've been caravan guards together long enough; she knows how Fortune moves. What she needs to know is what the threat is doing. Her attention is diagnostic. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"40%","bottom":"36%","width":"6.5%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"47%","bottom":"38%","width":"6%","stagger":"-0.2s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"53%","bottom":"36%","width":"6.5%","stagger":"-0.4s","pose":"ready"}' >> <<soctrack "scene_enter" "Chase_B2_Aggressive_Engage">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> <<chatpush "clare" "now" "...oh">> <<chatpush "clare" "now" "oh that's bad">> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (steps in, blade up)</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (eyes on the vampires) "Hm."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "What?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "They gave ground. They're not engaging."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Why is Stari Krov after you?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Long story. They're a war band whose matriarch is pissed at me."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "I want to hear that story later."</div> <<declareintent "fang_stari_krov_story">> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Sure thing, kid."</div> <<journalentry "stari krov" "so a whole war band's matriarch is 'pissed at' fang. there's a story there and i hope we get somewhere i can ask for it tonight, so i don't forget. clare will just tell me to wait. :-(" "[PLOT] chase · B2 · stari-krov-question">> /* v2.10.47 (31 May 2026): rewrote from off-voice to-do note ("Need to find out more about the Stari Krov clan.") to Ishani-voice curiosity-about-Fang per Journal Entry Rubric §"Chase/Mo Stór audit" banked fix. Keeps the [PLOT] thread-function (matriarch grudge, story pending) but carries it as Ishani noticing, not a research task. v2.10.45 intent note still applies: intent tracked via <<declareintent "fang_stari_krov_story">> on line 656. */ /* ─── Consent moment B1 (Clare check-in) — IRL chat surface ──────────── Migrated from the former Demo4_Chase_B3 passage in the v2.10.38 merge. Type 2 register (friend-checking-on-friend, intimate). Whisper not Guild, per the v2.10.11 cross-tab-context fix. After the player picks a chip (or defers), they advance via the "Keep moving" button when ready. Pace ownership stays with the player. */ /* v1.01.10 (02 Jul): the "fortune you good?" re-check REMOVED from here (both branch copies). It fired in the SAME paint as "don't push" — Clare saying don't-push then immediately pushing read as a forced non-sequitur (author, playtest 02 Jul). The check-in is now a DISENGAGEMENT-TRIGGERED beat at the reconverged Demo4_B3_B2: fires only if Ishani left Clare unanswered or chose silence, after real elapsed play — a true trust/empathy moment (Clare noticing you went quiet), and the first authored reach-out/repair pair of the Disengagement Signal spec (crude Option-A trigger; real accumulator ~July 15). This move also EXECUTES the banked de-dup (the beat now lives once at B3_B2). */ <<advance "Keep moving" "Demo4_B3_B2">>
<<setchat "bubble">> <<setlocation "merchant_quarter">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/2bc12997-4ff4-436f-939e-c7a98783a1d8/Merchant_Quarter_Aggressive_arrival.jpg?content-type=image%2Fjpeg">> /* Dive branch from B2_Aggressive. Fortune broke left; the three front-rank vampires (Tihomir/Zlata/Eyvindr) are mid-alley, looking the wrong way (where she was, not where she went). Positions are best-guess from author marker-dots; render-check for tuning. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"48%","bottom":"50%","width":"5.5%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"56%","bottom":"51%","width":"5%","stagger":"-0.3s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"51%","bottom":"45%","width":"5.7%","stagger":"-0.6s","pose":"ready"}' >> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> <<soctrack "scene_enter" "Chase_B2_Aggressive_Dive">> /* v2.11.03: added missing soctrack — Dive sub-branch was completely dark; players who broke left generated no scene_enter. */ <<sceneprose "You break left. Fang follows without hesitation. The three in front are still looking at where you were.">> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Was that?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Vampires. Plural."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "How many?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Twelve. Probably twelve."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "I haven't seen a war band since Novgorod."</div> <<set $arrivedB3Via = "dive">> <<advance "Keep moving" "Demo4_Chase_B3">>
<<setchat "bubble">> <<setlocation "coopers_alley">> <<soctrack "scene_enter" "Chase_B2_Tactical">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.10.45: music moved above dialogue — was rendering below the dialogue block. Matches B1 canonical position. */ /* v2.10.39: Three-vampire sprite sizing/positioning recalibrated per author render-check 20 May. Width shrunk 10% (5% → 4.5%) and the two left vampires (Tihomir, Zlata) moved forward into the street (bottom 55% → 48%/50%) per author arrow annotations. Eyvindr (right) unchanged in position; only shrunk. Cluster x at 38/46/56, asymmetric bottoms 48/50/55 producing a forward-leaning wedge — Tihomir as point stepping toward the overturned cart, Zlata mid, Eyvindr anchoring back-right. Read goal: less "line of three NPCs," more "they have already taken the street." See Aggressive sprite-comment for the iterative calibration history prior to this. Per author direction 13 May: all three visible; the dialogue reads their *positioning* (containment posture, holding the alley exit) rather than imagining offscreen others. This is canonically valid — the three vampires are positioned ACROSS the alley mouth ahead of Fortune and Fang, blocking, not closing. The other nine remain unseen (canon: rooftop watchers + flanking pair- anchors elsewhere in the formation), but Tactical's reveal does not require Fang to surface that count — only to read the *intent* of the three visible. Transparent-bg URLs per 13 May image-cleanup batch. NOTE: positioning shared with Aggressive only because the coopers_alley LOCATION currently uses the merchant-quarter placeholder image; when the side-street art lands, sprite positioning here will need separate recalibration. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"38%","bottom":"48%","width":"4.5%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"46%","bottom":"50%","width":"4.5%","stagger":"-0.2s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"56%","bottom":"55%","width":"4.5%","stagger":"-0.4s","pose":"ready"}' >> /* v2.10.22: B2_Tactical REWRITE per author direction 13 May. Reverts v2.10.18 actionarc + pre-v2.10.18 static overlay. Both prior versions used the side-street *experiment* framing (lead pursuer follows; other two go around → herding-reveal). v2.10.22 keeps the alley terrain but lands the herding-reveal through the *visible* three vampires' positioning rather than offscreen-pursuer logic — per author direction that all three sprites are visible here. ARCHITECTURAL NOTE — branch-distinct reveal-stack per Game Bible §7 (Asymmetric Knowledge) + Demo 4 Story Bible §496 (Knowledge-as- character) + Style Sheet §9 (Information Is Earned). The canon-rule: players who make different choices learn different information. This is structural, not incidental. Branch-distinct reveal-stack at B2: - Aggressive: Fang reads FORMATION SIZE (does the math 3+3=6, infers 12 total, names Stari Krov, names herself as target). Player learns: 'twelve / Stari Krov / they want Fang.' - Tactical: Fang reads FORMATION INTENT (the three vampires' posture is containment, not closing; herding, not chasing; capture, not kill). Player learns: 'herding / containment / they want her alive.' - Trickster: focused on the cast itself, not threat-recognition. Player learns: 'magic works, and it costs.' A player who plays all three branches gets the full picture. A player who plays one gets a coherent partial picture that primes them for what Lawrence reveals at B5 and what Mo Stór briefing completes. This is the design rule operating, not an incidental asymmetry. REGISTER NOTE: same rule as Aggressive. We are never in Fang's head (only Ishani's). Fang's recognition lands as dialogue teaching Fortune, not as narrator-interiority. The 'almost too quiet' parenthetical that lived in v2.10.18's actionarc Beat 4 was a register violation (we don't render Fang's voice-mode from her interiority); the new dialogue lets Fortune's ear receive it as simply quiet, without us claiming to know Fang's intent. */ <!-- Relocated from B1: Min-jae/Clare guild interrupt opens the post-choice beat so it reads, instead of flashing under the choice. Texture only, never load-bearing. v1.01.16 (03 Jul): one-time guard ($chase.mjRunPushed). The pair was copy-pasted into all three sibling B2 branches; append-only chat + cross-branch Back-nav surfaced the pair twice in one playthrough. Guard makes it push once regardless of which branch(es) render or re-render. Flag lives on $chase (resets on restart via StoryInit). Identical block in all three B2 branches. --> <<if not $chase.mjRunPushed>> <<chatpush "minjae" "now" "Run. I'm coming.">> <<chatpush "clare" "now" "mj wait, they've got the whole quarter boxed">> <<set $chase.mjRunPushed to true>> <</if>> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Good call. They can't all fit."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "...look at how they're standing. What do you see?"</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "They're not really moving. Just... standing."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "And what does that tell you?"</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "They want us to come to them?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (hand on her sword hilt) "They want me alive."</div> <<soundprompt "foley" "Side street: feet on wet sawdust, wood-shaving crunch, brushing past loose barrel staves (rattle of wood-on-wood). NO mallet-handle kick this version — the alley terrain is the choice, but the herding-reveal lands through positioning rather than improvisation. Footfalls slow as Fang reads what she's seeing; controlled breath; the three vampires ahead are silent.">> <<journalentry "vampires after us" "three of them, just standing there blocking the way out. not attacking, fang says they want her. are they trying to box us in? min-jae said he's coming. hope that's soon." "[PLOT] chase · B2 · they-want-her-alive">> <<guildreply '{"icon":"🗺️","text":"what\u2019s down the side street?","stat":"ishaniClareBond","delta":3,"momentId":"B2_Tactical_geography","replyTo":"clare","respondImmediate":{"who":"clare","text":"dead end, safer to defend til MJ gets here","delayMs":1700,"surface":"guild"}}' '{"icon":"👀","text":"why do they want fang?","stat":"fangTrust","delta":2,"stat2":"ishaniClareBond","delta2":2,"momentId":"B2_Tactical_ask_clare","replyTo":"clare","respondImmediate":{"who":"clare","text":"she pissed them off 40 years ago","delayMs":1900,"surface":"guild"}}' '{"icon":"⚔️","text":"how do we fight a war band?","stat":"ishaniJeffBond","delta":3,"momentId":"B2_Tactical_ask_jeff","replyTo":"jeff","respondImmediate":{"who":"jeff","text":"Carefully.","delayMs":1500,"surface":"guild"}}' '{"icon":"😬","text":"","defer":true,"momentId":"B2_Tactical_grimace_defer","replyTo":"guild"}' >> <<set $arrivedB3Via = "tactical">> <<advance "Keep moving" "Demo4_Chase_B3">>
<<setheader "SMYRNA · MERCHANT QUARTER" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/995e0ba8-0456-40a8-afef-193ea1c1768c/Merchant_Quarter_Chase_Melon.png?content-type=image%2Fpng" "center bottom">> <!-- v1.01.16 (03 Jul): BACKGROUND SWAP + explicit actors. OLD image (Merchant_Quarter_Melon.jpeg) baked Fang+Fortune onto a ROOFTOP composition — read as flying, not running. NEW plate (Merchant_Quarter_Chase_Melon.png) is an EMPTY street-level stage: melon cart center-left, no characters baked in. Trickster was the only B2 branch with no <<setactors>>, so it silently INHERITED B1's actors (Fang 52% / Fortune 61%, bottom 1%) via _sceneActors persistence (setscene does not clear; only setlocation does). On the old baked plate that produced a double-render (rooftop-baked + street-level inherited); object-fit crop hid the inherited pair. On the new empty plate the inherited pair would be the only characters — but relying on B1 inheritance is fragile (breaks if B1 changes or a clearing path reaches Trickster). Declaring actors here makes the passage self-contained, matching Aggressive/Tactical. POSITION: shifted RIGHT of the cart per author direction — Fang/Fortune land between the melon cart (~25–42% from left) and the right edge. First-pass estimate (Fang 66% / Fortune 75%, bottom 1%), preserving the B1 ~9-pt gap and relative widths; nudge after playtest. Same URLs as B1. --> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8514aa8d-24a1-43ee-a9c1-1fe204471b84/Fang_Run_Bam_Left.png?content-type=image%2Fpng","left":"66%","bottom":"1%","width":"19.4%"}' '{"id":"fortune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/155807fb-781a-4428-9aa1-5be8c626245f/Fortune_Running_Sword.png?content-type=image%2Fpng","left":"75%","bottom":"1%","width":"24.6%","stagger":"-0.3s"}' >> <<soctrack "scene_enter" "Chase_B2_Trickster">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.10.45: music moved above dialogue — was rendering below the dialogue block (caught in playtest screenshot). Matches B1 canonical position. */ /* v2.10.24: B2_Trickster REWRITE per author direction 13 May. Reverts the v2.10.17 actionarc; converts to dialogue + sceneprose below the art per yesterday's narrator-below-art architectural decision (chat 421de3d1, 12 May, "Wordsmithing screen text and journal entries"): narrator prose moves OUT of overlay-on-art position and lands BELOW the image in the order narrator → dialogue → buttons. Specific catch from this playtest: the actionarc overlay was painting over the melon stand visual — covering the artwork's load-bearing storytelling content. Per the yesterday decision, that overlay surface is the wrong place for this prose. The art carries the melons-mid-flight visual; prose below carries what the art alone can't render (Fortune's eye-decision, the spell- cast word). Branch-distinct reveal-stack now consistent across all three B2 branches (Aggressive / Tactical / Trickster) per Game Bible §7 + Style Sheet §9 + Demo 4 Story Bible §496: - Aggressive: Fang reads formation size → Stari Krov + target - Tactical: Fang reads formation intent → herding + capture-alive - Trickster: Fortune performs the cast → magic works, and it costs All three lean on dialogue + sceneprose below the art, no overlay- on-art prose, no actionarc-style cinematic. PROSE STRUCTURE per Option A direction: 1. Sceneprose: Fortune's eye scanning the stalls (target acquisition; interiority-adjacent narrator-work the art can't render) 2. Dialogue: Fortune speaks "Manus motoria" (the cast itself — per magic-system canon the spoken word IS the working; load-bearing) 3. Sceneprose: Fortune's hand-gesture + melons launching (carries the moment of the cast taking effect; the art shows two melons mid-flight, prose marks Fortune's gesture causing it) 4. Dialogue: Fang's "...did you just." (reaction beat; Three-Voice canon — outside-observer register) CUT FROM v2.10.17 ACTIONARC: - "One hits the lead pursuer in the chest. He staggers." — pure telling-what-the-art-shows (artprompt explicitly specifies the melon-on-chest impact mid-frame). The art does this. - The cinematic crossfade-of-beats structure itself — it was the overlay-on-art architecture this build is deprecating. PRESERVED FROM v2.10.17: - Spoken Latin canon: "Manus motoria" stays as Fortune's dialogue, load-bearing per magic-system canon. - Chat reactions (Clare's ..., the melons, did you just; Song Min-jae's i'll never get tired of seeing that) — Three-Voice outside- observer work the art doesn't render. - Journal entry: Fortune's writer-room interiority about the cast and its cost. Lands at journal surface, not visible prose. ACTIONARC MACRO DEPRECATION: this passage was the last live caller of <<actionarc>>. With this rewrite the macro is dead code; deprecated below in StoryStylesheet with a v2.10.24 note. Register Style Sheet §15 (Action-Arc Prose) is also now obsolete and flagged for review in the next doc-architecture pass. */ <!-- Relocated from B1: Min-jae/Clare guild interrupt opens the post-choice beat so it reads, instead of flashing under the choice. Texture only, never load-bearing. v1.01.16 (03 Jul): one-time guard ($chase.mjRunPushed). The pair was copy-pasted into all three sibling B2 branches; append-only chat + cross-branch Back-nav surfaced the pair twice in one playthrough. Guard makes it push once regardless of which branch(es) render or re-render. Flag lives on $chase (resets on restart via StoryInit). Identical block in all three B2 branches. --> <<if not $chase.mjRunPushed>> <<chatpush "minjae" "now" "Run. I'm coming.">> <<chatpush "clare" "now" "mj wait, they've got the whole quarter boxed">> <<set $chase.mjRunPushed to true>> <</if>> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (eyeing the melon stall) "...Don't laugh."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "I make no promises."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Manus motoria."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "...did you just."</div> /* v2.10.47 (31 May 2026): cast spends from the cast-capacity meter and latches the cast flag. Per Magic Primer §1.3 (Amendment, 31 May): a chase cast is the LEAST-paced cast — adrenaline masks the felt cost, so Fortune overspends. The felt VIT crash is therefore DEFERRED to the post-chase walk (see Demo4_PostChase_MoStorDoor), not surfaced here. Mid-chase she feels almost nothing. $fortuneCast -1 (the spend is real); $castMelons drives the deferred cost beat and the depletion-scaled charm hit at B6 (Magic Primer §4.2 hinge). */ <<set $fortuneCast -= 1>> <<set $castMelons = true>> <!-- v1.01.16 (03 Jul): OVERLAY REMOVED. The <<sceneprose>> block painted narrator description over the scene image (the caption box in the playtest screenshot). Per Style Sheet §16 (Render-Then-Name) + the deprecation ruling at §15 — timed action prose is NEVER an overlay on the art. Recast as an in-pane Fortune action line (d4-dlg + parenthetical stage direction, house format). CUT per §16 (render, don't re-narrate what the art shows): "three melons launched," "the rest of the fruit hit stone," and "the vampires broke formation to dodge" — all explicitly in the B2-trickster-melons artprompt below. The still carries the airborne melons + scattering pursuers; the action line carries only what the art can't: Fortune's gesture (the throw of the hand). The cast-WORD ("Manus motoria") is already her spoken dialogue above, so the action beat is the MOTION only, not a repeat of the word. --> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (a hard flick of the wrist at the cart, fingers snapping open)</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (breathless) "Did it work?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "It worked. Doesn't make it less stupid. Move."</div> <<chatpush "clare" "now" "...">> <<chatpush "clare" "now" "the melons">> <<chatpush "clare" "now" "did you just">> <<chatpush "minjae" "now" "i'll never get tired of seeing that">> <<chatpush "jeff" "now" "that'll go in the songs." 1800>> <<artprompt "B2-trickster-melons" "Mid-shot. Smyrna merchant quarter. Fortune mid-stride running TOWARD camera with Fang, half-turned. Her LEFT arm is extended back over her shoulder, hand pointing at the melon stall behind her — the gesture clear and visible: index finger extended toward the pyramid, the rest of the hand mid-flick (palm rotating, fingers snapping back). She is mid-vocalization — mouth open, breath caught around a Latin word. BEHIND her: the pyramid of striped melons mid-disassembly, THREE melons launching out of the cluster on visible motion-lines toward the pursuers, the rest cascading to stone. The pursuers are BREAKING FORMATION TO DODGE — bodies twisting aside, ducking, scattering out of the melons' path; NO melon strikes a body, NO impact, NO stagger. The melons are passing THROUGH the space the formation just vacated. Stall-keeper open-mouthed. Style: cinematic, the moment of a cultivated working deployed at speed by a novice under pressure — it disrupts, it does not connect. Reference: Persona 5 Skill cut-in mid-action freeze. The casting is performed and visible — pointing finger, flick of the wrist, the spell-name on her breath. NO glow, NO particles — the magic is in the airborne objects, not in the caster. Aspect 16:9." true>> <<soundprompt "foley" "Spoken cast: Fortune's voice, single Latin word, <em>manus motoria</em>, pitched mid-stride, breath-tight. Brief sub-audible low-frequency hum (~0.3 sec) under the word as the working takes hold. NO body-impact thuds — the melons do not connect. Melons hitting stone and cart-timber as the pursuers scatter clear, percussive arrhythmic cascade. Scuffing boots and a sharp redirect of footfalls as the formation breaks to dodge. (Fortune's breath does NOT catch here — the cost is masked by adrenaline mid-chase and is deferred to the post-chase walk beat, per Magic Primer §1.3.)">> <<soundprompt "dialogue-bed" "Levantine market vendor: shouted indignation in Greek and Turkish — not scared, just outraged about his stall. The pursuers do not respond verbally — a grunt or two of effort as they twist aside. Boots scuffing and redirecting on stone as they break formation.">> <div class="d4-choices"> <<chasechoice "aggressive" "dex" "Push the tempo. Move." "Demo4_Chase_B2_Aggressive">> <<chasechoice "tactical" "flow" "Cut left down the side street, narrower. Make them run single file." "Demo4_Chase_B2_Tactical">> </div>
<<setchat "bubble">> <<setheader "SMYRNA · NORTH-QUARTER STREETS" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e19a94f6-ac04-4082-9cb9-81eec45865d8/Merchant_Quarter_Sidestreet.png?content-type=image%2Fpng">> /* B3 sets its OWN actors, so the three war-band sprites do not persist via _sceneActors from whichever upstream passage the player came through — B2_Tactical (38/46/56, bottom 48/50/55), B2_Aggressive_Dive (48/56/51, bottom 50/51/45), or B2_Aggressive_Engage. Those positions were each tuned for their OWN backgrounds, NOT for Merchant_Quarter_Sidestreet.png, so the sprites rendered floating high above the alley on this plate. This is the "separate recalibration when side-street art lands" flagged as pending in the v2.10.39 B2_Tactical sprite comment. Feet now planted on the side-street groundline per author arrow annotations (16 June render-check). Foot targets measured from the annotation: left% 43/46/50, bottom% 35/40/45 (alley recedes uphill, so back-right vampire's feet sit higher in frame — correct, not a float). B-NUDGED: Tihomir pulled +1% right (43→44) to clear the overturned cart's back rail; Eyvindr pulled -1% left (50→49) to clear the wine-vat/stone-ledge on the right. Sub-1% horizontal shift is imperceptible against the drawn marks. Width 4.5% / staggers / poses carried from upstream. VERIFY ON BUILD: PNG foot-padding could not be measured (CDN 403); if any sprite still floats ~1-2%, the PNGs carry transparent padding below the feet — nudge that actor's bottom% down by the padding amount. */ <<setactors '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"44%","bottom":"35%","width":"4.5%","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"46%","bottom":"40%","width":"4.5%","stagger":"-0.2s","pose":"ready"}' '{"src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"49%","bottom":"45%","width":"4.5%","stagger":"-0.4s","pose":"ready"}' >> /* v2.10.8: <<setoverlay "<p>They have <em>been in position</em>. They were ahead of you the whole time.</p>">> REMOVED. Per the voiceover canon surfaced through playtest (Register Style Sheet — pending update in v2.10.9 architectural pass): the overlay surface is for prose that can be performed as a stage-setting voiceover by a skilled actor. This line fails the test — it's action-description / formation-reveal, which the artwork SHOWS (the figures positioned around the square in artprompt B3-pattern-reveal below) and which Fang's "(quiet) They're not bandits" + "They're a war band" dialogue + the chat reactions ("they're not yelling" / Clare's "...oh that's bad") already carry. The reveal is over-determined across art, dialogue, and chat; the overlay was redundant narrator-clarity that also obscured the melon stand and competed with the visual it was supposed to amplify. Future architectural pass (v2.10.9) will move this kind of prose to a prose-below-art render surface; for now, simply removed since other surfaces carry the beat. v2.10.39 UPDATE: the "(quiet) They're not bandits" / "They're a war band" dialogue referenced above has been REFRAMED — since Demo4_Chase_B1 line 449 already names vampires explicitly ("Three vampires up ahead") and the Aggressive_Dive path now plants Novgorod canon, the species-reveal was redundant. The else-branch dialogue is now "There's the rest of them" / "...how do you know?" / "Standard formation. They've been ahead of us the whole time." — formation-reveal beat rather than species-reveal. Art + chat surfaces still carry the moment-of-recognition; the dialogue now adds confirmation of *scale and intent* rather than re-naming species. */ <<soctrack "scene_enter" "Chase_B3">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.10.13: Cut <<chatpush "you" "now" "they're not yelling">> and <<chatpush "you" "now" "why aren't they yelling">>. Per consent architecture canon: the engine must NEVER speak as Ishani. Ishani-author messages only appear via player choice (chip click, composer input) or the Pattern B consent-moment-echo carve-out (see Register Style Sheet §1.X). Pattern A — engine auto-typing Ishani-reactions without a preceding player choice — violates the canon and was a playtest catch. The fountain reveal is over- determined across art (B3-pattern-reveal artprompt below), Fang's "(quiet) They're not bandits" / "They're a war band" dialogue, and Clare's "...oh" / "oh that's bad" chat reactions. The cut loses nothing; the beat lands cleanly without the engine putting words in Ishani's mouth. v2.10.39 UPDATE: dialogue referenced above has been REFRAMED as formation-reveal (see prior comment for full rationale). The over- determined-across-surfaces principle still applies; the dialogue now carries "scale + intent confirmation" rather than "species reveal." Clare's chat reactions still apply unchanged. */ <<chatpush "clare" "now" "...oh">> <<chatpush "clare" "now" "oh that's bad">> <<artprompt "B3-pattern-reveal" "Mid-shot. A street corner ahead opens into a narrow square (small fountain, carpet sellers, a boy with a goat). Camera angle: behind Fortune and Fang's shoulders as they approach the square. In the square, just visible: MULTIPLE figures (long coats, same gait) standing motionless at the far side and at the corners of the square — they have been in position, not arriving. A SPOTTER on the rooftop above one of the carpet stalls — silhouetted, looking down. The geometry of a capture team that was never just three pursuers. Period Smyrna texture, sunlit. Style: cinematic, the moment of recognition visualized — the choreography of a capture-team made legible. Aspect 16:9." true>> <<soundprompt "ambient" "Quieter street: fountain trickle in foreground, carpet seller's voice in middle-distance, goat-bell, footfalls of Fortune and Fang slowing as they round the corner. NO shouting from pursuers — the silence of a coordinated formation.">> <<if $arrivedB3Via === "tactical">> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "You did well back there."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "I didn't do anything."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "You saw it."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Who are they?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Stari Krov."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "...what?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "War band. Twelve of them. Matriarch's been wanting a word with me for forty years."</div> <<else>> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "There's the rest of them."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "...how do you know?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Standard formation. They've been ahead of us the whole time."</div> <</if>> /* ─── Consent moment B1 (Clare check-in) — IRL chat surface ──────────── v2.6: rewritten from chasechoice-in-prose + 3 branch passages to a single <<whisperreply>> chip cluster. The original implementation used in-world choice rails (AGGRESSIVE / TACTICAL / TRICKSTER) on what are clearly chat replies to Clare — wrong identity layer. The chip pattern is correct: this is Ishani replying to Clare via the Whisper tab. Each chip carries the consent moment, stat delta, journal entry, and Clare's response payload. After the player picks a chip (or defers), they advance via the "Keep moving" button when ready. Pace ownership stays with the player. v2.10.11: Clare's prompt moved from <<chatpush>> (Guild) to <<whisper>> (Whisper). Surfaced from playtest catch — the chips render on Whisper (Ishani's private reply space) but the prompt was on Guild (public group chat), creating a cross-tab context mismatch: when the player reached this beat, Whisper still showed Clare's earlier "yeah just tired. don't push" message, and the chips appeared to be responding to THAT instead of to "fortune you good?" — which wasn't visible on the active tab. Per the Type 1 / Type 2 chat register canon (Register Style Sheet §1.X): this is Type 2 — friend-checking-on-friend, intimate register, "your nonsense makes sense" shared dialect. Type 2 chat is private not because it's secret but because it's the register that doesn't need an audience. Clare reaching out privately is more in-canon for her load-bearing relationship with Ishani than a public solidarity gesture would be. The check-in lands as a continuation of her earlier "mj is dealing with personal stuff" whisper thread — same surface, same register, conversational continuity preserved. */ /* v1.01.10 (02 Jul): the "fortune you good?" re-check REMOVED from here (both branch copies). It fired in the SAME paint as "don't push" — Clare saying don't-push then immediately pushing read as a forced non-sequitur (author, playtest 02 Jul). The check-in is now a DISENGAGEMENT-TRIGGERED beat at the reconverged Demo4_B3_B2: fires only if Ishani left Clare unanswered or chose silence, after real elapsed play — a true trust/empathy moment (Clare noticing you went quiet), and the first authored reach-out/repair pair of the Disengagement Signal spec (crude Option-A trigger; real accumulator ~July 15). This move also EXECUTES the banked de-dup (the beat now lives once at B3_B2). */ <<advance "Keep moving" "Demo4_B3_B2">>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b845454c-a4b2-4d48-8ba4-b38e98729742/Merchant_Quarter_Deadend.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.48 (03 June): explicit clear — B4 is actor-free (Fang/Fortune face INTO the alley; war band is BEHIND them, off-screen). Without this, the war-band sprites from the prior passage (B3_B2) persist into B4 via _sceneActors, since no <<setactors>> here overwrites them. The turn-to-face reveal is at B4_Stand. Matches the v2.10.44 actor-free-transition pattern. */ /* v2.10.15: Three <<sceneprose "interiority">> lines REMOVED here: "The kind of geometry someone <em>chose</em>." "<em>Twelve.</em>" "...the half-second tell of someone whose peripheral vision has read something her front vision has not yet committed to." Per Demo 4 v2.10.8 voiceover canon + v2.10.15 playtest catch: these lines duplicated content the other surfaces carry. The dialogue below carries the count; the artwork (B4-dead-end artprompt) shows the formation's geometry. The half-second-tell interiority was the most defensible — Fortune's internal pulse before her conscious recognition — but it fails the voiceover canon test (not stage- setting; mid-action narrator). Per audit verdict in SOC_Demo4_Prose_Surface_Audit_v0_1.md these belong on the prose- below surface when v2.10.16+ ships it. For now, cut entirely; the dialogue + art + chat reactions carry the beat without redundancy. v2.10.39: Beat 4 Fang dialogue rewrite per author 20 May. Three changes: (a) "(low) Twelve." → "(looking over her shoulder) All twelve are with us." — adds the rear-guard read (the war band has closed in behind, not just blocked the mouth) which the previous line did not carry. Slight register cost (chattier than the soldier-count economy of "(low) Twelve.") accepted in exchange for the information payload. (b) "Hold here. They have to come at us two at a time." + "MJ won't be long." → reordered and rewritten as a survival-first sequence. New order: Fang: "(looking over her shoulder) All twelve are with us." Fortune: "I see them." Fang: "We don't fight this. We survive it." Fortune: "Okay." Fang: "Hold the alley. Two at a time is all that fits." Survival framing lands THIRD, before Fortune's "Okay." This is structurally important: Fortune's "Okay" acknowledges the MISSION (survive, don't fight), not the TACTICAL PLAY. The tactical line ("Hold the alley...") then arrives FIFTH as how-we-execute-the-mission, not as the mission itself. The architectural principle: Fang directs defense, not attack. The dialogue order makes that unmistakable on first read. Earlier draft (v2.10.39 first pass) had "Don't win. Survive." landing FIFTH as clarification; the survival-frame was the addendum. Author direction 20 May reordered so that survival is the LEAD, not the qualifier. CAMERA-PIVOT STAGING: This dialogue fires while Fortune and Fang are still facing the dead-end wall. The turn- around to face the war band happens at Demo4_Chase_B4_Stand (see that passage's "You turn." overlay and the background swap to Merchant_Quarter_Alley_Fight.png). The dialogue here is what Fang says BEFORE they turn — "(looking over her shoulder)" is the only acknowledgment of the war band's position; her body is still facing the wall until the scene advances to B4_Stand. (c) "MJ won't be long." → CUT ENTIRELY. The line was a canon violation: Fang is in-world and has no knowledge of Clare and Song Min-jae coordinating in chat. Previous line had Fang reading the player's HUD. A first-pass replacement ("Hopefully Lawrence realizes they're here.") was workshopped and rejected — it solved the chat-asymmetry violation but introduced two new ones: (i) it assumes Lawrence is close enough to "realize," which Fang has no basis to assume — per Story Bible §3.7, Lawrence told Fortune to meet at Mo Stór before the demo opens; Fang has no information about his current location; (ii) it assumes Lawrence would intervene if he did realize, which is the unresolved question of the Fang-Lawrence arc — 40 years of estrangement after Jiwon's death, and Fang does not know whether he would come for her personally (politically yes, the Stari Krov matriarch wants Fang as leverage against him; emotionally unresolved). The player only sees the chat-asymmetry layer; the relational-uncertainty layer is invisible until Death arc, but a Fang line claiming Lawrence-will-come would retroactively read as wrong on replay. Cleanest solution: end the beat on "Don't win. Survive." The silence before Lawrence's drop at Beat 5 carries more weight than any line about rescue. Dramaturgically: Beat 5's drop now lands as the if-resolved-in-their-favor, not the scheduled-extraction-arrives-on-time. (d) Added Ishani's <<guildreply>> chip cluster between Fang's tactical close and the journal entry. Per Standing Rules §A8 (in-world is primary, chat is ambient) + Consent Architecture Spec §4.5 (Ishani is an active author in the right pane), B4 previously had no Ishani-agency surface — the in-world dialogue ran, the journal anchored, the scene advanced. The chase's only Ishani-agency moment between B3's coordination chip cluster and Beat 6's C consent moment would have been Moment A's in-world choice at B4_Stand, and the chat surface would have been Ishani-as-observer only. Four chips, each a real shape for how a new guild member holds a hard moment: ❤️ "any suggestions?" — Ishani-at-work mode: identify your gap, ask the people in the room. Competence-asking, not uncertainty-asking. Per the Story Bible character canon: she's afraid of making mistakes, not afraid of not knowing. Both Jeff (comedy-cohesion: "survive. boring answer. correct answer.") and MJ (actionable: "on my way. hold til i get there.") respond, Jeff first. ishaniMinjaeBond +3 (actionable info), ishaniJeffBond +2 (register-cohesion). 🫡 "i'll follow your lead." — Directed unambiguously to Clare (the only pilot in the alley with her). The line is a doubled gesture: Ishani→Clare (guild trust) AND Fortune→Fang (in-world positioning). The meta-layer and in-world layer fire the same commitment simultaneously. Justifies fangTrust +2 from a chat surface — the gesture's in-world half is real even though the words are typed in chat. Clare's response: "got you." (simple, warm). 😬 "oh gawd, we're dead." — Gallows humor. Honest acknowledgment of stakes without asking for fix. Jeff picks up per his sustained-character-presence canon: "not yet. give it a minute." Dry. ishaniJeffBond +2 routed to the responder. ⏸ silent defer — eyes on Fang. Journal entry: "Chat was going. Eyes on Fang." Tight, no self-justification — gamer-shorthand journal-register. Architectural note: This is the only chat-choice surface in the dead-end alley sequence (B4 → B4_Stand → Moment A landings → B5). B4_Stand has the in-world Moment A; B5 has chat-quiet per soundprompt + <<chatquiet>>. So these four chips do real bond/journal work — they're the only place between B3 and Beat 6 where Ishani's voice carries weight on the chat surface. Multi-response array syntax on the ❤️ chip's respondImmediate is confirmed by author 20 May; this is the first use of array form in the demo. Worth verifying on render. */ <<soctrack "scene_enter" "Chase_B4">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.00.09 (06 Jul): was Beat-Boxer — chase-track contamination. Canon (Music Arch v6.3 §2.5): the whole chase is Legacy through the Lawrence drop (line-1687 Heartbeat motif layers under Legacy’s outro at B5). Beat-Boxer is the DOCK-COMBAT track only. Legacy now runs unbroken B1→B5, handing to Save Tonight at B4_LawrenceAppears (already planted, v1.01.11). This passage is pre-Lawrence chase, so: Legacy continues. */ <<chatpush "clare" "now" "mj, how long til you join us?">> <<chatpush "minjae" "now" "2 more blocks, almost there.">> <<chatpush "clare" "now" "crap, oh no no no">> <<chatpush "clare" "now" "We're going to head down the alley, make it harder to fight just the 2 of us.">> <<chatpush "minjae" "now" "got it.">> <<chatpush "clare" "now" "let's get this party started">> <<chatpush "clare" "now" "Watch for magic">> <<artprompt "B4-dead-end" "Wide shot from above-and-behind. A narrow Smyrna alley, ~12 feet wide, ending in a high stone wall (no door, no climbable handhold). Fortune and Fang in mid-foreground, halted, partially turned. Behind them at the alley's mouth: TWELVE figures in long coats, arranged in a containment half-moon (NOT charging — holding formation). Lead figure has hand raised, signaling 'hold.' Late-afternoon light angled long down the alley. Style: cinematic, the geometric inevitability of capture made visible. NO blood, NO drawn weapons on the war-band side yet. Aspect 16:9." true>> <<soundprompt "ambient" "Held silence. Twelve men breathing in formation. Distant market sounds far away — Smyrna continues around the alley but the alley is its own room. The wolf-puppy in Fang's chest sling makes one small sound. Fang's fingertip pressing the puppy's flank to quiet her — a tiny fabric-on-fabric brush.">> <<soundprompt "foley" "Fang's left blade drawing slowly — single sustained schick of metal-on-leather, drawn over ~2 seconds. Setting of terms.">> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (looking over her shoulder) "All twelve are with us."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "I see them."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "We don't fight this. We survive it."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Okay."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Hold the alley. Two at a time is all that fits."</div> /* v2.10.39 (20 May): Ishani's AGENCY chip cluster lives at B4_Stand. B4 is the "facing the wall, hearing them behind us" beat — receive-mode. B4_Stand is the "turn around, see the 12" beat — act-mode. The heavier agency/emotional cluster (any suggestions? / i'll follow your lead / oh gawd we're dead / defer) lives at the act-mode beat. v2.10.48 (03 June): per author direction, B4 now ALSO carries a LIGHT TACTICAL-ACK cluster below — Ishani rogering Clare's marching orders ("head down the alley" / "Ishani, to my left"). This is a different register from B4_Stand's cluster: here = "roger your orders" (quick acknowledgment of Clare's lead); B4_Stand = "how do I feel facing this" (agency/emotion). Kept deliberately light (small/no stats, no respondImmediate) so it doesn't step on B4_Stand's heavier stat moves and doesn't race the "Hold position" advance. Two clusters one beat apart, doing distinct jobs. */ <<guildreply '{"icon":"👍","text":"copy","stat":"ishaniClareBond","delta":2,"momentId":"B4_ack_copy","replyTo":"clare"}' '{"icon":"👌","text":"got it","momentId":"B4_ack_gotit","replyTo":"clare"}' '{"icon":"⏸","text":"don\u2019t reply \u2014 keep playing","defer":true,"momentId":"B4_ack_defer","replyTo":"clare"}' >> <<sceneadvance "Turn and face war band" "Demo4_Chase_B4_Stand">>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' >> <<soctrack "scene_enter" "Chase_B4_Stand">> <<music "Legacy" "NEXZ · continues" "https://www.youtube.com/watch?v=SjVAR5URdE4" "">> /* v2.00.09 (06 Jul): was Beat-Boxer — chase-track contamination. Canon (Music Arch v6.3 §2.5): the whole chase is Legacy through the Lawrence drop (line-1687 Heartbeat motif layers under Legacy’s outro at B5). Beat-Boxer is the DOCK-COMBAT track only. Legacy now runs unbroken B1→B5, handing to Save Tonight at B4_LawrenceAppears (already planted, v1.01.11). This passage is pre-Lawrence chase, so: Legacy continues. */ /* v2.10.39 visibility fix (21 May 2026, third iteration): STEP 1 — Foreground 3 (Thordis/Yelena/Dragomira) repositioned BACK so sprite bottom edge sits where sprite top edge was at the previous foreground placement (sprite rendered height ≈ 17% of canvas at width 5.5%). This pulls them out of the "Lawrence's landing path" without burying them again. New bottoms: Thordis 24%, Yelena 23.8%, Dragomira 25%. STEP 2 — All 12 sprites equalized to width 5.5% (Svetomir kept at 6% to preserve his lead-figure visual distinction). Previously sprites ranged 3-3.3% width which read as 4-5 foot figures at this depth; 5.5% reads as adult human scale. Mapping for moved sprites at width 5.5%: Thordis (front-col 59%/36% → 51.95%/24%) Yelena (mid-col 58%/29% → 43.35%/23.8%) Dragomira (back-col 59%/26% → 39.95%/25%) Net effect: the 12 sprites now form a roughly uniform-scale wall across the alley mouth, with three sprites pulled forward enough to read against the visible alley stone (not the dark archway) while leaving Lawrence's landing zone clear for the moveactor sequence in B5. */ /* v2.10.39: B4_Stand restructured per author direction 20 May. PRE-v2.10.39: this passage had a "She is offering to be the wall" second-paragraph overlay + Fang's "(quiet) Stay behind me." dialogue + Moment A 3-choice (Step in front / Stay behind / Hold beside), each branching to a per-choice landing passage. WHAT WAS CUT: - Moment A 3-choice was a NO-OP (all three branches converged at rooftop with no downstream consequence). Per consent architecture principle, choices that don't matter are worse than no choice. - "She is offering to be the wall" was the consent-setup for Fang's shielding-offer. With Moment A gone, setup has nothing to point at. - Fang's "(quiet) Stay behind me." moved upstream to B4 (it now lands as part of B4's "Hold the alley. Two at a time is all that fits." closer — Fang's tactical command). - The three Moment A landing passages (Demo4_B4_A_HoldBeside, _Stay, _StepFront) are removed from the file. - fangTrust deltas (+5/+10/+15) accepted as loss; Beat 5/6 are larger movers. WHAT WAS ADDED: - Background swap to Merchant_Quarter_Alley_Fight (the post-turn fight-perspective view). - 12 war band sprites positioned in a FOREGROUND 4x3 GRID at the alley mouth (between the crates and the fountain steps). Author placed annotated dots in a render-check screenshot 20 May; sprite positions track those dot positions within ~2% per sprite. Sized at 2-2.2% width (Svetomir slightly larger at 2.2% as lead figure; others uniform at 2%). All 12 use pose:ready-slow (6s breathe cycle, half-speed of standard pose:ready) — at small sprite sizes (2-3.5% width), the standard 3s cycle reads as too active; the slower variant matches the visual scale. v2.10.39 NOTE: a dispersed 3-layer experiment (2 roof + 6 cluster + 4 foreground-low) was tried late 20 May and reverted — author judgment that the 4x3 grid composition is the canonical layout for B4_Stand. Foreground row was too close-camera; roof sprites were too small to read. - Overlay: "You turn to face the twelve vampires." Honest body- action + direct count. No metaphor, no setup-for-choice. - Ishani's 4-chip guildreply cluster moved FROM B4 TO HERE. The visible-threat reveal is the act-mode beat; chip cluster (Ishani- agency surface) lives at act-mode for clean receive-then-act sequencing. Panic-cascade chat at B4 (MJ/Clare 6 messages) stays at B4 as in-world ambient — those are reactive chat, not chips. - Three dialogue lines between music cue and chip cluster. v2.10.43 (25 May 2026) REVISION — line 1 changed. v2.10.44 (26 May 2026) REORDERING — "Faith manages" moved from line 1 (paired with "Hold my right") to land AFTER Fortune's refusal. v2.10.44 (26 May 2026) CONTINUITY FIX — "Hold my right" changed to "Hold my left". Prior B4 passage has Clare typing "Ishani, to my left" (line 1133), positioning Fortune on Clare/Fang's left side. "Hold my right" in this passage would have asked Fortune to switch sides mid-stand — continuity slip caught by author 26 May. Final order: Fang: "Hold my left." Fang: "Do you think you could pick up one of those boxes? Knock one of them down?" Fortune: "No. Too far for me." Fang: (to herself, softly) "Faith manages." History: v2.10.18-era count beat ("ten, eleven, twelve. Yup, all accounted for") was deleted because the count duplicated the B2_Tactical opener ("Looks like all of them are here") added in v2.10.43. The replacement preserves the tension-defuse function but does it through a different mechanism: two-register split. The whole sequence is FANG TRYING TO DEFUSE TENSION, now via vulnerability-leak rather than gallows-precision. Four beats of work, restructured in v2.10.44 to land vulnerability AFTER agency rather than before tactical handoff: (a) Fang's tactical authority as caravan-superior ("Hold my left" — directive, no negotiation; calls back to §3.8 caravan-guard history; matches Clare's B4 positioning call where Fortune was placed on the left) (b) Fang's care for Fortune (tactical handoff via the box question — she asks ABOUT FORTUNE'S CAPABILITY rather than her own, deliberately handing Fortune the assessor role) (c) Fortune's first in-world AGENCY moment (she's been in receive-mode for two passages; the "No. Too far for me." is her first authoritative voice). Fortune's chip cluster carries her chat-layer agency separately. (d) Fang's vulnerability via overheard interiority ("Faith manages" — Babylon 5 Delenn easter egg AND Fang's private prayer in the same line). Fortune sees Fang as both authoritative AND uncertain — chemistry-beat material: trust earned through what someone doesn't quite mean to show. RATIONALE FOR v2.10.44 REORDERING: "Faith manages" lands harder after Fortune's refusal closes the easy out, rather than as Fang's opening-move vulnerability. The line now reads as Fang accepting that the tactical handoff failed and turning inward to her prayer — cause-and-effect emotional logic. Fortune's "No" gains weight: her refusal isn't just information, it's the thing that triggers Fang's interior shift. The Delenn easter egg also lands in its native Babylon 5 context — said after a path-forward closes, not as pre-emptive coping. Per author 26 May. EASTER EGG NOTE: "Faith manages" is canon-quoted from Babylon 5 (Delenn). Per design discussion 25 May, the homage lands via player recognition without character-awareness — Fang doesn't know B5 exists, the line is in her natural voice, the wink is for the audience. */ <<soundprompt "music-cue" "Legacy's bridge thins to a single sustained string layer. The held silence inside the chase music. The moment before something arrives.">> <div class="d4-prose"><p class="--narrator">You turn to face the twelve vampires.</p></div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Hold my left."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Do you think you could pick up one of those boxes? Knock one of them down?"</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "No. Too far for me."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (to herself, softly) "Faith manages."</div> /* v2.10.44 (26 May 2026): The gallows chip carries architectural weight beyond character work. Jeff is the demo's TRUE-GREEN-FLAG foil to MJ's FALSE-GREEN-FLAG. The diagnostic the demo is teaching the player (per Story Bible §3.4 MJ canon + §3.6 Jeff canon — both being expanded Friday): Can you defend the LINE in isolation? Can you defend the SEQUENCE the line lives in? If (1) yes and (2) no → false green flag. If (1) no but (2) yes → true green flag. Jeff's gallows line ("makes for a short session tonight") fails the first test — in isolation it reads dismissive, asshole-coded. Then the sequence runs: - Clare's "Jeff." (capital J, period) — mom-voice social regulator - Jeff: "sorry." — immediate, no defense, no qualifier - Jeff: "ishani, sorry. clare's fought vampires before. you'll be fine." — terse Jeff register: apologizes, then grounds the reassurance in something TRUE (Clare's actual competence, not empty comfort), and addresses Ishani directly. Connection-language per §3.6. This is the OPPOSITE shape from MJ's B6 "fyi he's charming you, don't fight it" line. MJ polishes the line, leaves the sequence rotten. Jeff fumbles the line, makes the sequence redemptive. The demo, by giving the player both, teaches them how to read SEQUENCE — which is how the false-flag diagnostic actually works. The Clare "Jeff." line is the ONLY capital-letter break in this otherwise-lowercase chip cluster. The register break is the regulatory move; three characters carry the whole mom-voice beat. The "wrong.." double-period is intentional — typing-pause artifact, reads as Jeff hitting send mid-thought and adding the next clause. Stat delta: $ishaniJeffBond +3 (bumped from +1 per author 26 May). The moment is architecturally load-bearing — the +3 reflects that Jeff is actively SEEING Ishani in the repair, not just matching her register. Per "stat-changing chips must be meaningful" canon. 😬 GLYPH USAGE NOTE (v2.10.48): the 😬 emoji appears on THREE chips with TWO distinct functions — same glyph, different jobs, by design: • B2_Aggressive_grimace_defer (line ~595) and B2_Tactical_grimace_defer (~812): SILENT DEFER. icon:"😬", text:"", defer:true. "Silence-with- affect" — Ishani reacts but posts NOTHING to chat. No stat, no reply. • B4_chat_gallows_jeff_repair (BELOW, this cluster): SPOKEN LINE. The 😬 is the chip ICON for the gallows-humor line "oh gawd, we're dead." — it POSTS text, carries +3 ishaniJeffBond, and triggers Jeff's apology cascade + journal. NOT a defer. Do not "unify" these — the shared glyph is incidental. The defer chips express wordless fear; this chip is a voiced joke that earns a response. */ <<guildreply '{"icon":"❤️","text":"any suggestions?","stat":"ishaniMinjaeBond","delta":3,"stat2":"ishaniJeffBond","delta2":2,"momentId":"B4_chat_ask","replyTo":"guild","respondImmediate":[{"who":"jeff","text":"survive. boring answer. correct answer.","delayMs":1500,"surface":"guild"},{"who":"minjae","text":"on my way. hold til i get there.","delayMs":3200,"surface":"guild"}]}' '{"icon":"🫡","text":"i\u2019ll follow your lead.","stat":"ishaniClareBond","delta":5,"stat2":"fangTrust","delta2":2,"momentId":"B4_chat_follow","replyTo":"clare","respondImmediate":{"who":"clare","text":"got you.","delayMs":1500,"surface":"guild"},"journal":{"title":"followed clare","body":"fang said survive. clare\u2019s playing her. i told clare i was with her. she had me.","tag":"[REL] chase · B4 · follow"}}' '{"icon":"\ud83d\ude2c","text":"oh gawd, we\u2019re dead.","stat":"ishaniJeffBond","delta":3,"momentId":"B4_chat_gallows_jeff_repair","replyTo":"guild","respondImmediate":[{"who":"jeff","text":"makes for a short session tonight.","delayMs":1500,"surface":"guild"},{"who":"clare","text":"Jeff.","delayMs":3000,"surface":"guild"},{"who":"jeff","text":"sorry.","delayMs":4200,"surface":"guild"},{"who":"jeff","text":"ishani, sorry. clare\u2019s fought vampires before. you\u2019ll be fine.","delayMs":6000,"surface":"guild"}]}' '{"icon":"⏸","text":"hold position","defer":true,"momentId":"B4_chat_defer","replyTo":"guild","journal":{"title":"eyes on fang","body":"chat was going. eyes on fang.","tag":"[REL] chase · B4 · defer"}}' >> <<sceneadvance "Hold position" "Demo4_Chase_B4_LawrenceAppears">>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0acd7e93-38da-4284-937a-4ac6d0f25533/Lawrence_Jump_Start2_filigree.png?content-type=image%2Fpng","left":"45%","bottom":"70%","width":"10.5%"}' >> <<soctrack "scene_enter" "Chase_B5_LawrenceDrop">> <<if $chase.aggressive >= $chase.tactical and $chase.aggressive >= $chase.trickster>> <<setchasedetail "aggressive">> <<elseif $chase.tactical >= $chase.trickster>> <<setchasedetail "tactical">> <<else>> <<setchasedetail "trickster">> <</if>> /* v2.10.39: B5 restructured 20 May per author direction. PRE-v2.10.39: this passage carried the entire Lawrence-drop beat (drop + coat-cut + "Tell her the answer is still no" + advance to B6) as a single passage, relying on commissioned key art for the drop+cut. POST-v2.10.39: separated into three beats across two passages: B5: jump (animated) + land (animated) + greet Svetomir + "Tell her no" B5_CoatCut (new): coat-cut overlay + room for additional dialogue and action before advancing to B6 ENGINE WORK USED: - <<moveactor>> v0.3 (shipped 21 May) — animates Lawrence's jumping sprite from bottom:70% to bottom:9% over 800ms with ease-in (gravity feel). On landing, the chain-swap uses delayed crossfade (v0.3 extension): holds Jump1.png at landing for 800ms, then crossfades to Lawrence_Back.png over 1000ms. Total Jump1 visibility: 800ms fall + 800ms hold = 1600ms. Reads as: drop → arrive → register situation → deliberate turn to face the war band. (Iteration history: 2200ms hold → 1500ms 21 May → 800ms 16 Jun, both per author for tighter pacing; Lawrence is faster-than-human, the long hold over-sold the recovery beat for a vampire who lands with no recovery.) - <<swapactor>> v0.3 (shipped 21 May) — not used here; moveactor's chained crossfade handles the post-landing pose transition. LAWRENCE-KNOWLEDGE CANON (simplified per author 20 May, parking lot Entry 003 RETRACTED): Lawrence is named in the roster from B4_LawrenceAppears onward AND in dialogue labels from this passage onward. The previous three-layer architecture (Ishani-knowledge vs Fortune-knowledge vs Fang-reveals-name-at-B7) is no longer in force. Fang's "Well. That was Lawrence" at B7 now reads as relational characterization ("that's just how Lawrence is") rather than name- reveal — richer territory. ART NOTES: the static commissioned art prompt (B5-lawrence-drop) is preserved below with the suppression flag (third arg true) so the prompt doesn't render to the player but the canonical reference remains in the file for any future art revision/commission. STAGING NOTES (v2.10.39 + 21 May moveactor v0.3 upgrade): Lawrence jumping start: left 45%, bottom 70%, width 10% Lawrence landing position: left 45%, bottom 9% Jump duration: 800ms, ease-in (gravity acceleration) Post-landing hold: 800ms (Jump1 sprite remains visible at landing) Crossfade to Back: 1000ms Total beat: 2600ms */ <<artprompt "B5-lawrence-drop" "KEY ART. Two-frame sequence. FRAME 1: Lawrence (per Story Bible §3.7 — Korean vampire-mage-swordsman, 1000 years old, born ~252 CE on what is now the Korean peninsula; Net's ring keeps him in early-30s presentation; physically resembles a super-buff K-drama lead — broad shoulders, lean muscle, controlled posture; pale-cool skin tone, vampire physiology with resting heart rate ~40 bpm; dark coat, dark hair; visual reference: K-drama lead aesthetic, voice/casting reference Lee Jun-Ho) on the rooftop edge, ONE silhouetted instant before dropping. The sun behind him. The spathē (Roman cavalry sword, ~30-inch blade, single-edged, drawing-from-back position) in his right hand, mid-draw, blade catching light. FRAME 2: Lawrence in the alley between Fortune-and-Fang and the war band, blade extended at the lead war-band-leader's chest height. The drop from two stories should READ as a vampire drop — landed clean, no recovery beat, body angled forward into the cut. No human survives that landing in that posture. The war-band leader's coat has been cut — a single horizontal slit across the chest of the coat, fabric just beginning to part. NO blood. The lead figure's expression: recognition, then controlled anger. Lawrence's expression: unreadable. Fang in the background mid-frame, blade still drawn but lowered, as if she's just registered who dropped. Fortune behind Fang, mid-recognition. Style: cinematic action — the spathē coat-slice is steel-precise restraint signaling reach without committing to a kill; the drop physics tell the player what Lawrence is, before anyone names it. Aspect 16:9." true>> <<soundprompt "foley" "Lawrence's drop: vertical fall, controlled — no scream, no grunt, just air-displacement and the soft thud of boots on stone. Cut sound (deferred to B5_CoatCut): spathē through wool coat — fabric tearing along clean blade line, NO flesh impact. Single percussive moment. Then: silence.">> <<music "Save Tonight" "Lee Jun-Ho acoustic commission · continues" "" "">> /* v1.01.11: was TOXIC start — removed from Lawrence window per music ruling; also collapses the double-card at this passage (was TOXIC + carried Heartbeat). */ /* v2.11.07 (21 Jun 2026, per author): inserted an intermediate sword-draw frame between the landing and the turn-to-face. v2.11.08 (21 Jun 2026): B5 SPLIT for <<trustvetting>>. B5 now ends on Sword_Draw_Front (Lawrence landed, drawn, FACING FORTUNE) — the hold beat that hosts the free-text vetting. The turn-to-face (crossfade to Spathe_Back) moved to the OPENING of Demo4_Chase_B5_Svetomir as the turn-as-entry beat. This passage's sequence: Jump_Start2 (fall, 800ms) → land + crossfade to Sword_Draw_Front (front-facing, sword drawn) → HOLD here while the vetting runs. The single chained moveactor below lands Lawrence and crossfades to Sword_Draw_Front (swap args: crossfade, 1000ms fade, 800ms post-landing hold of Jump_Start2 before the fade — preserves the original landing beat). The subsequent swapactor to Spathe_Back is gone from here; see B5_Svetomir. */ <<moveactor "lawrence" "45%" "9%" 800 "ease-in" "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d4dde662-fa07-4847-a818-76d804f93b5f/Lawrence_Sword_Draw_Front.png?content-type=image%2Fpng" "crossfade" 1000 800>> /* v2.11.10 (23 Jun 2026): REORDER + DARKEST-CHARM placement. The vetting NO LONGER fires here. B5 is now the RECOGNITION BEAT: Lawrence has landed, drawn, and faces FORTUNE — and THIS is where the charm-reinforcement lands (moved up from B6, post-fight). Causal-charm canon: the road-raid charm was presence-only (avoided gaze); HERE he opens the gaze and amplifies it. One beat only, and the channel STAYS OPEN — it runs unbroken under the Svetomir summons AND under the vetting that follows (the player is vetted while subtly charmed; consent architecture at its sharpest). He breaks the gaze to handle Svetomir (next passage's turn-away), leaving it humming. New flow: B5 (charm opens) → B5_Svetomir → CoatCut → B6 (war band clears, turn-back, vetting fires). */ <<soundprompt "motif" "Heartbeat motif first deployment. Slow building pulse — single low-frequency thump, doubling, layered under Legacy's outro. The heartbeat is not Fortune's metaphorical heart — it is her actual one, the sound her body would hear if she were paying attention. Eventually this motif becomes the bridge into 2PM's Heartbeat (commissioned-track plant).">> /* v2.00.12 (06 Jul): <<heartbeat>> call REMOVED — stale Demo-4 music plan. The v1.01.11 ruling unified the Lawrence window (LawrenceAppears→B7) to Save Tonight ONLY; the comment on the <<music>> line above even notes it "collapses the double-card," but this <<heartbeat>> survived and kept emitting a second WISHLIST MUSIC card (Heartbeat/2PM) on top of Save Tonight. First time it surfaced in playtest because it was an authored leftover, not a runtime carryover. Save Tonight is the only cue for this beat. (The Heartbeat MOTIF as sound-design intent is still noted in the <<soundprompt "motif">> above, which is a no-op annotation, not a music card.) */ /* RECOGNITION LINE + BURDEN-SLIP (25 Jun). He knows her from the road; the charm confirms it's still on her, strengthening. "I'm glad you came" (not "I wondered if it would hold" — that admits doubt in his own working, a vulnerability about control a 1000-yr-old who mistakes control for safety would not hand a stranger; feeling slips, doubt-in-craft does not). WOVEN-PARTIAL SLIP (Story Bible §3.7): one burden-line escapes on the warmth — the FACT of the long refusal + that it costs him — then he CATCHES himself before the confession completes ("not your concern. Not yet."). The unfinished reveal is the romantasy breadcrumb hook; "forty-one" is precise (Lawrence is precise) and Svetomir advances it to 42 on-screen. The contraction is the information. Slip-the-BURDEN here; slip-the- DANGER owed at Mo Stór tapestry. ORDERING (atomic casting beat): land → RECOGNIZE + smile → CAST (boza-voice; the voice IS the casting, now landing right on the warm greeting) → SLIP → snap-back → body ANSWERS. Then -3. (Boza-voice moved up 25 Jun per author: the casting lands on "I'm glad you came," and the slip then escapes THROUGH that warmth. This ALSO repairs a referent gap: the end-of-passage "Lawrence's smile" journal ("his smile is amazing") had no smile on screen under the old opening ("Looks at you, only you" — no smile); now he SMILES at the top (edit 1) and the warm-voice casting reinforces it, so the smile-journal has its actual referent and its timing makes sense.) */ /* v2.00.16 (07 Jul) — B-1 PROSE-COLUMN REVEAL. The B7 landing wall is now a 3-beat tap-reveal in the STORY COLUMN (not an overlay over the art — author direction: get away from overlay text, it clutters the image). Grouping (author, 07 Jul): beat 1 = arrival + love-bomb interiority; beat 2 = the burden-slip that catches itself (door-close paren CLOSED for consistent stage grammar, author ii); beat 3 = the door shut + the chase-crash coda (Fortune's body + Fang steadying). Each beat reveals on the Continue button; the last beat flips it to the "Say one true thing." advance. Triggers (guild beat, lawrenceTrust -3, journal, sceneadvance) are UNCHANGED below — only the prose is queued. Register comments from the static version preserved as authoring notes here. */ <<set $_sceneRevealTarget = "prose">> /* Beat 1 — arrival + EYE-OF-SAURON/LOVE-BOMB interiority (§1, §3.0.6 replay-legible; ENACT the displacement via "you forget", do not narrate guard-dropping). */ <<sceneprose "dialogue" '<span class="d4-who --lawrence">Lawrence:</span> (lands. He smiles as he looks at you, as if the war band behind him didn\u2019t matter.) "There you are. I\u2019m glad you came."<p class="--ingame" style="font-style:italic;margin:0.6rem 0;max-width:540px;">He looks at you the way no one has looked at you, like the alley and the war band and the whole shouting world have narrowed to the single point where you are standing, and it is the best thing you have felt in longer than you want to admit. You forget he is a vampire in the warmth of his smile.</p>'>> /* Beat 2 — burden-slip (warm-mode breaking warmer for one sentence) + the catch. Door-close parenthetical CLOSED at "his coat.)" (author ii, consistent stage grammar). */ <<sceneprose "dialogue" '<span class="d4-who --lawrence">Lawrence:</span> (quieter, almost to himself, the warmth carrying it out before he decides to let it) "Forty-one years I have been saying no to them. You would think it gets easier to carry. It does not. And then the road turns, and there is a face that makes the weight worth\u2026"<br>(he stops. The sentence does not finish. His face settles, the smile going somewhere held back, and he straightens his coat.)'>> /* Beat 3 — door shut + CHASE-CRASH coda (ordinary post-action emotion, charm-independent; Fang steadies AS COMPANION, her charm-read reserved for beat #2's "Careful."). */ <<sceneprose "dialogue" '<span class="d4-who --lawrence">Lawrence:</span> (Assessing now, where a breath ago he was warm. Something in him closes, gently, like a hand he did not mean to open. When he speaks again the warmth is still there, but the door behind it is shut.) "But that is not your concern. Not yet."<br><span class="d4-who --fortune">$avatarName:</span> (The running catches up with you all at once. The spell you threw on the fly has left you hollow and buzzing. Your hands start shaking and you\u2019re unsure which of the things in your chest is fear and which is something else.)<br><span class="d4-who --fang">Fang:</span> (a hand on your shoulder, steadying, her eyes still half on the vampire) "Breathe. You\u2019re still standing. That\u2019s the job."'>> <!-- GUILD BEAT (beat #1), light-interleaved. RESOLVED 25 Jun: Clare does NOT name the warmth-register (would do the player's noticing for them — §3.0.6 delayed legibility). She addresses MJ warmly/inclusively instead; surface = guild camaraderie welcoming MJ back into play, latent = Clare registering MJ is SHOWING UP again, warmth said to him with care. Jeff = craft-player register (Marcus/bear framing, theatrical staging-eye, §3.0.4). Clare's "wrecking ball" = in-world tactical hype + quiet Fang/Lawrence-pairing seed. Warning dissolved into welcome; nothing named, everything latent. PARKED (post-playthrough): the MJ-self-medication / warning-missed second cluster was CUT (the rewrite removed the register-flag it referred back to). Author plays through first, then decides whether to reinsert here or relocate to beat #2. Do NOT wire a replacement until that playthrough. --> <<chatpush "clare" "now" "huh">> <<chatpush "clare" "now" "mj, it's good to have lawrence back">> <<chatpush "jeff" "now" "marcus would break a leg on that jump. almost wish i'd picked vampire for him.">> <<chatpush "clare" "now" "fang and lawrence are a wrecking ball waiting to happen.">> /* lawrenceTrust -3: the casting IS the consent-violation — he amplifies the road-raid charm by gazing + the boza-voice; he's not asking, he's taking. The cost is incurred at the moment of casting (B5), not at the save (B6, +4). Net across the sequence still +1 (charm -3 at B5, save +4 at B6) — split across the two passages where each thing actually happens, which is more correct than the old both-at-B6 jam. lawrenceTrust = "Does Fortune feel safe with Lawrence?" Agency-override is the opposite of safety; trust drops. -3 < +4: the save is dominant, the violation real but smaller. */ <<set $lawrenceTrust -= 3>> <<journalentry "lawrence's smile" "omg, his smile is .... amazing. i know he's just an npc, but i need to screenshot that for my phone." "[REL] chase · B5 · charm-casting">> /* v2.11.12 (25 Jun 2026): B5 SPLIT (3.4 wall-of-text fix + 3.3 Fortune-above-vetting). B5 is now the RECOGNITION/CHARM beat only — it ends HERE, on Fortune's body-answer (above), the guild beat, the -3, and this journal. The VETTING (monologue + free-text input) moved to the new passage Demo4_Chase_B5_Vetting, which replicates this scene verbatim (same background, same sprite placement — Lawrence held at Sword_Draw_Front, war band in place) so the two passages read as one continuous moment with a single breath-break before "Tell me one true thing." Fortune's response now lands ABOVE the vetting (3.3) because it's the tail of THIS passage, not stranded below the input. */ <<sceneadvance "Say one true thing." "Demo4_Chase_B5_Vetting">>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d4dde662-fa07-4847-a818-76d804f93b5f/Lawrence_Sword_Draw_Front.png?content-type=image%2Fpng","left":"45%","bottom":"9%","width":"10.5%"}' >> <<soctrack "scene_enter" "Chase_B5_Vetting">> /* v2.11.12 (25 Jun 2026): NEW passage — the VETTING half of the split B5 (see B5 comment). Scene replicated VERBATIM from B5 so it reads as one continuous moment: same background, same war-band placement, Lawrence held at Sword_Draw_Front (left 45%, bottom 9% — the landed/drawn/facing-Fortune hold B5 ended on; NO re-jump, the drop already happened). TOXIC continues (no tonal re-break — the gear-change landed at B5). The charm channel is still open and unbroken under the vetting (consent architecture: the player is vetted while subtly charmed). Resolves to Svetomir. */ <<music "Save Tonight" "Lee Jun-Ho acoustic commission · continues" "" "">> <<trustvetting "Demo5_Ch1_End">>
<<setheader "STONE OF COMMITMENT" "Demo 5" "STUDIO ZISHA">> <<soctrack "scene_enter" "EndCredits_STUB">> /* STUB (25 Jun) — the demo End Credits target, referenced by the chapter-end frame's device-aware last-chapter branch (when "Continue" has nowhere to go). Not reachable in Ch1 (which has a Continue target → Svetomir); exists so the reference resolves and link-integrity stays clean. Real credits = Step 4. */ <div class="d4-prose"><p class="--ingame">[STUB] End Credits — Demo 5. (Real credits page is Step 4 of the chapter build.)</p></div>
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> <<setoverlay "<p>The entrance to Mo Stór sits at the bottom of a long, stone street. The third step from the bottom creaks, announcing your arrival.</p>">> <<soctrack "scene_enter" "MoStor_Entrance_Ch1Hub">> /* ═══════════════════════════════════════════════════════════════════════════ MO STÓR ENTRANCE — Ch1-HUB PATH (Step 2, 25 Jun 2026). The first-visit gateway, reached from the Ch1 chapter-end frame's "Go to Mo Stór". OPTION A (author 25 Jun): MINIMAL recharge dialogue — creaking step, Fang's "have you been here before," a "rest after the fight" beat, then ENTER. The post-Svetomir plot dialogue (Lawrence/Matriarch/leave-town, charm-aftermath, melon-cost) is NOT here — it doesn't fit pre-Svetomir, and it lives in the plot-path entrance (Demo4_PostChase_ToMostor), which is untouched. ARCHITECTURE: a SEPARATE lean passage from the plot-path entrance (ToMostor), not one conditionalized gateway — because ToMostor has plot beats (charm- aftermath, spell-cost) woven in that don't conditionalize cleanly. Two entrance passages share the visual frame, differ in dialogue. If a THIRD arrival context appears, refactor to a resolver-driven single gateway (banked, SOC_Todo). Music: TOXIC continues (arrived straight from the alley charm beat), not the plot-path's Heartbeat. */ <<music "TOXIC" "MEOVV · continues" "https://www.youtube.com/watch?v=8F61FXiYpP0&list=RD8F61FXiYpP0&start_radio=1&pp=ygUOdG94aWMgYnkgbWVvdnagBwE%3D" "">> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Have you been here before?"</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "No. I've heard about it though."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "The tea is good. The company is... acquired."</div> <div class="d4-prose"><p class="--ingame">After the alley, the quiet of the stone street lands like a held breath let go. Whatever else tonight has waiting in it, this is a place to set it down for a moment.</p></div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Catch your breath. Our plans can wait for the length of a cup of tea."</div> <<journalentry "he's gorgeous" "ok i can't stop looking. vampire saving the day, such a k-drama mafia boss entrance, and that face. wonder what he did to make his vampire so.....damn pretty?" "[REL] mostor · hub · lawrence-lingering-swoon">> <<set $moStorMode to "hub">> <div class="d4-choices"> <<set $moStorEntered to true>> /* v2.00.21 (08 Jul): mark Mo Stór as visited. A hub-rester (Ch1-end → Rest at the Tavern → this hub entrance) sets this, so when they LATER traverse the plot entrance (Demo4_PostChase_ToMostor) on the Ch1→Ch2 flow, the "Have you been here before?" first-visit exchange is skipped there (you were just here). A plot-only player never hits this passage, so the flag stays false and they get the first-visit line correctly. */ <<advance "Enter Mo Stór" "Demo5_MoStor_Hub">> </div>
<<setchat "bubble">> <<setheader "MO STÓR · MAIN ROOM" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Hub_Ch1">> /* ═══════════════════════════════════════════════════════════════════════════ MO STÓR — HUB MODE (Step 3a, 25 Jun 2026). The recharge-between-chapters interior. Distinct from the PLOT-mode interior (Demo4_MoStor_Arrival, untouched, full cast + briefing/tapestry/ask). HUB MODE = same interior image, TIBERIUS ONLY (per author: hub = Tiberius-only sprite; plot = Tiberius + whatever cast the plot needs). $moStorMode='hub' was set at the entrance (routing, + future resolver + the board/notes read it). §13.1 INVIOLABLE — mother-tea beat RELOCATED HERE (author 25 Jun, Option A): the Ch1-hub is Fortune's FIRST Mo Stór visit, so the mother-tea recognition belongs at the first visit. The plot-path Tea (Demo4_MoStor_Tea) now gets a LIGHTER tea greeting (the heavy recognition does not fire twice). The §13.1 core (Tiberius's two-handed "east of Constantinople" presentation, Fortune's cardamom inhale, the soft "Efharistó") ships intact here. The Marcus/Lawrence "He./Lawrence./Mm." lines that followed in the plot version are NOT here — they reference Lawrence having just left, which is plot-path context that doesn't fit the pre-Svetomir hub. Per Demo 4 Story Bible §13.1: load-bearing, must ship intact. Tiberius reads Fortune well enough to serve tea the way her dead mother served it (eleven years gone). The recognition is wordless. Tiberius does not check whether Fortune noticed. Fortune does not perform acknowledgment. Both choose not to perform the recognition; that choice IS the gesture. */ <<music "Nella Notte" "Forestella · acoustic instrumental (hub arrangement) · continues" "" "">> /* v2.00.12 (06 Jul): HUB theme. Was Irish Washerwoman "by Marcus" — but in HUB-mode (between chapters) Marcus is NOT present, so diegetic-lute framing is wrong here (the 5 Demo4 MoStor scenes keep Irish Washerwoman; Marcus is there). Nella Notte = the Mo Stor sanctuary leitmotif: pared-back acoustic INSTRUMENTAL loop in the hub (plants it), full Forestella VOCAL at end-credits (lights-down payoff). Two arrangements, one motif. Commission pattern (empty URL). CANON PENDING: music-arch doc reconciled Friday to document both arrangements (currently lists Nella Notte end-credits only). */ <<dlg "tiberius" "(readies the tea then presents a porcelain cup and saucer two-handed to Fortune, the way tea is served east of Constantinople) \"I hope this is to your liking.\"">> <<dlg "fortune" "(The smell of cardamom reaches you before the cup does. You inhale before you sip.)">> <<dlg "fortune" "(softly) \"Efharistó.\"">> /* §13.1 INVIOLABLE — Fortune's response. "Efharistó" (Ευχαριστώ) is the Greek everyday thank-you, period-correct for 1402 Smyrna. The (softly) honors §13.1: "Both choose not to perform the recognition; that choice IS the gesture." The understatement IS the recognition. */ <<dlg "tiberius" "(a small nod, already turning back to the bar) \"Sit as long as you like. The road keeps its own hours; it will not mind if you keep yours.\"">> <<set $moStorTeaSeen to true>> /* v2.00.17 (07 Jul): the §13.1 mother-tea recognition just fired at the hub (first visit). Flag it so the plot-path Tea gives the LIGHTER callback instead of repeating the full recognition. A Path-2 player (skipped the hub) never sets this, so they get the full §13.1 beat at the plot Tea — the immersion moment is reachable on either first-visit path (closes the banked follow-up). */ <!-- BOARD / OTHER-PLAYERS'-NOTES — PLACEHOLDER (Step 3b). The hub's systems (the message board + other players' notes) get a fresh design+build (the Demo 2/3 versions are out). For now, a placeholder marks where they live so the hub-mode flow is playable end-to-end. --> <div class="d4-prose"><p class="--ingame">[Not in scope for the demo. Mo Stór will include: a quest board, a graffiti wall of comments from other players, the ability to re-spec your avatar, IAP, and other features.]</p></div> /* RETURN-TO-CHAPTER (the plot-modification, confirmed 25 Jun): the hub is a recharge, not a slide into the Ch2 plot. After the cozy beat, a clean "ready to continue?" returns the player to the chapter (→ Svetomir). The briefing is Ch2's opening, reached only by Continue-from-the-alley, never by flowing out of the hub. */ /* v2.00.18 (07 Jul): return target is now DYNAMIC. The chapterend "Rest at the Tavern" button stores $_hubReturnTarget = its continue target before routing here, so the hub returns the player onward to the correct next chapter (Ch1-end → Ch2 opening/Svetomir; Ch2-end → the dock/Ch3). Fallback to Svetomir preserves the original behavior for any direct-nav or legacy save where the target wasn't set. */ <<set $_hubReturn to ($_hubReturnTarget ? $_hubReturnTarget : "Demo4_Chase_B5_Svetomir")>> <div class="d4-choices"> <<hubexit>> </div>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Ch1_End">> <<music "Save Tonight" "Lee Jun-Ho acoustic commission · continues" "" "">> /* v2.00.09 (06 Jul): ADDED — was missing in v2.00.08, so the music box vanished on the Ch1-End seal passage. This passage is inside the Save Tonight window (LawrenceAppears→end of Ch1, v1.01.11): Lawrence is present, the seal lands before Svetomir. Commission pattern (empty URL) per Forestella precedent. */ /* ═══════════════════════════════════════════════════════════════════════════ CHAPTER 1 END (25 Jun 2026) — the inline retention beat. Replaces the old clunky soft-fail modal. Ch1 ends HERE: after the vetting, before Svetomir (Option 2 — seals on earned-vulnerability oxytocin, war band still live to pull the tap). OUTCOME-COLORED SEAL (Option 2, light): $vettingOutcome was set by the vetting (pass = he heard you / warm; softfail = not tonight / gentle, door-open). Both flow into the SAME Continue / Mo Stór choice via <<chapterend>>. Continue -> Svetomir (Ch2's opening — the war band confrontation resumes). Mo Stór -> the entrance/hub (first-visit gateway; STUB target for now until the hub is built in Step 2). NOTE: the Mo-Stór-before-Svetomir diegetic question is resolved by the path-agnostic entrance scene (author 25 Jun) — see todo. */ <div class="d4-prose"><p class="--ingame">The war band has not moved. But for one held breath, the alley is just the two of you.</p></div> <<if $vettingOutcome is "pass">> <div class="d4-prose"><div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (cocks his head as he assesses you, his smile returning, lighting up his eyes) "You'll do."</div></div> <<chapterend 1 "" "Demo4_Chase_B5_Svetomir" "Demo5_MoStor_Entrance">> <<else>> <div class="d4-prose"><div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (a measured look, the warmth held back but not gone) "We should talk more, later."</div></div> <<chapterend 1 "" "Demo4_Chase_B5_Svetomir" "Demo5_MoStor_Entrance">> <</if>>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d4dde662-fa07-4847-a818-76d804f93b5f/Lawrence_Sword_Draw_Front.png?content-type=image%2Fpng","left":"45%","bottom":"9%","width":"10.5%","pose":"ready"}' >> <<soctrack "scene_enter" "Chase_B5_Svetomir">> <<music "Save Tonight" "Lee Jun-Ho acoustic commission · continues" "" "">> /* v2.11.08 (21 Jun 2026): TURN-AS-ENTRY. This passage opens with Lawrence still front-facing (Sword_Draw_Front) from the vetting that just resolved. The first beat is the TURN: he finishes with Fortune and turns to face the war band, crossfading to Spathe_Back. This is the hinge from the open free-text register back into structured scripted play. delayMs=600 gives the passage a beat to paint and the player a moment to register the turn before the dialogue lands. (Re-timed from B5's old delayMs=3800: that value was measured against the moveactor drop+draw chain which lived in the prior passage and no longer precedes this swap.) */ <<swapactor "lawrence" "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/3bf69f99-4395-42e6-9254-f0200617c2e2/Lawrence_Standing_Spathe__Back_filligree.png?content-type=image%2Fpng" "crossfade" 1000 600>> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (turns from you to face the war band, sword drawn)</div> <div class="d4-dlg"><span class="d4-who --svetomir">Svetomir:</span> "Lawrence."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "Svetomir."</div> <div class="d4-dlg"><span class="d4-who --svetomir">Svetomir:</span> "By the right of the Hosting Clan, I am sent to renew the summons."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "By the right of the Refused, I decline."</div> /* v2.10.44 (26 May 2026): Clare/Jeff banter cluster + Ishani agency-of-being chips. Pure flavor — no stat deltas, no consentmoment, no journal entries. The chat-pane is doing what it canonically should during in-world high formality: friends watching their friend (MJ) roleplay extremely seriously and clowning with affection. ARCHITECTURAL FRAMING: - Jeff's "is that a new drink from Tiberius?" is in-character per Story Bible §3.6 (laconic-with-precision, comedy-cohesion register). Lateral- connection joke: takes Lawrence's high-clan phrase, hears it as a potential tavern-drink-list entry. The funny is in the register collision. - Cross-passage chemistry: Tiberius's drinks menu is canonical (Story Bible §3.10 "Tiberius Drinks Canon Is Load-Bearing"). Forensic replay-curious players who have spent time at Mo Stór will read this line as Jeff making a real Tiberius reference, not generic banter. First-pass readers get cute chat; second-pass readers get the canon-stack. - Clare's "bitter. with one ice cube." is yes-and improv. She's building the joke, specifying the drink, signaling Clare-knows-Tiberius's-menu (in-character per her caravan-guard-network Smyrna knowledge). - The banter clowns MJ with AFFECTION, not at his expense. The Jeff-as- foil canon: he sees MJ performing and responds with warmth, not calling-out. Pattern-completes the B4_Stand gallows-repair beat. ISHANI AGENCY-OF-BEING CLUSTER: Three distinct modes-of-being for Ishani during a high-tension in-world moment. NOT consent moments — there's no false-flag pressure or real- stakes choice. The question is "what kind of friend is Ishani being right now?" Per author 26 May: Demo 4 hasn't shown Ishani/Fortune demonstrating enough agency; this beat surfaces real choice-of-mode. Three modes: (1) 😭 — Audience-mode (laugh react, enjoying without competing). Matches Ishani's canonical reserved chip register per EE-001. (2) ⏸ eyes on the alley — Holding-mode (Fortune-attention dominates; chat thins). Mirror- held-open shape per EE-004 — when in-world tension is at maximum, Ishani's chat presence thins because Fortune's attention is on the threat. Defer chip. (3) 🍷 i'll have what she's having 😭 — Participant-mode (joins the bit). When Harry Met Sally callback — second inter-franchise homage in this passage alongside the B5 cluster (Faith manages + Hold the line). See Easter Egg Inventory EE-006. PURE FLAVOR rationale: per the "stat-changing chips must be meaningful" canon banked May 26, "do I laugh / hold / play" doesn't meet the bar for stat change. The agency is in self-expression, not relationship- building. Per Standing Rule A8, this is chat-as-ambient layered on in-world primary action — the choice surfaces *who Ishani is being* without making the choice load-bearing for plot or bond stats. */ <<chatpush "jeff" "now" "“the right of the Refused”, is that a new drink from Tiberius?">> <<chatpush "clare" "now" "bitter. with one ice cube.">> /* v1.01.09 (02 Jul): removed <<settab "guild">> — dot teaches, player discovers. */ <<guildreply '{"icon":"😭","text":"😭","replyTo":"guild"}' '{"icon":"⏸","text":"hold position","defer":true,"replyTo":"guild"}' '{"icon":"🍷","text":"i\u2019ll have what she\u2019s having 😭","replyTo":"guild"}' >> <div class="d4-dlg"><span class="d4-who --svetomir">Svetomir:</span> "The matriarch will not hear that twice."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "She has heard it forty-one times. Once a year, since the conclave. This will be forty-two."</div> <<if window._socMomentFired("B1_warm")>><<journalentry "clare was right" "nobody panicked when it got bad. min-jae cracked a joke, clare kept me steady, and jeff just... handled it. i didn't want to log off." "[REL] chase · B5 · guild-belonging">><</if>> <<sceneadvance "Hold the line." "Demo4_Chase_B5_CoatCut">>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/3bf69f99-4395-42e6-9254-f0200617c2e2/Lawrence_Standing_Spathe__Back_filligree.png?content-type=image%2Fpng","left":"45%","bottom":"9%","width":"10.5%","pose":"ready"}' >> /* v2.11.04 (per author 15 Jun): <<setoverlay "The war band has not moved.">> REMOVED. The static art (war band sprites holding formation) + the absence of any movement animation already conveys this — the overlay was telling what the image shows. Cut the tell. */ <<soctrack "scene_enter" "Chase_B5_CoatCut">> <<music "Save Tonight" "Lee Jun-Ho acoustic commission · continues" "" "">> /* v2.10.39: B5_CoatCut RESTRUCTURED 21 May 2026 per author direction. PRIOR CONTENT (v2.10.39 first iteration, 20 May): coat-cut beat (Lawrence's blade-cuts-coat as the forty-second refusal) + war-band withdrawal in same passage. Per Reading C decision 21 May, the coat-cut beat is RETIRED NARRATIVELY — the forty-second refusal now lives in B5's "She has heard it forty-one times" dialogue exchange, not in a sword act. NEW CONTENT (21 May 2026): escalation beat. Svetomir voices the matriarch-engages-elders threat. Lawrence's silence + button-slice answers via clan-protocol recognition. Lawrence's claim line is the protective territorial mark (declared publicly so it lands in the language Stari Krov understands). The matriarch/hounds line is the political escalation answer. Svetomir bows to the mark. Withdrawal beat is the first ~2.5s of B6 (sprite fade + overlay + Lawrence's back→front pose swap), executed sequentially before the gaze beat fires. AUTHORING PATTERN (21 May, second iteration): Dialogue lives in the prose flow below the game pane via d4-dlg divs. Stage directions attributed to acting characters as parentheticals — "Lawrence: (silence)", "Fang: (shifts her stance...)". This is the standard d4-dlg pattern from elsewhere in the demo, NOT the sceneprose- queue stage-play sequencing that was tried in the first iteration (rejected as overengineered for this passage; engine work for the sceneprose dialogue kind is still shipped and available for future use if needed). STAGING NOTES: - Same scene background as B5 (Alley_Fight). No visual cut. - All 12 war band sprites + Lawrence (Back.png at 45%/9%) inherited from B5's moveactor completion state. War band stays VISIBLE throughout this passage. - Lawrence remains in Back.png pose (facing war band, away from camera). The button-slice happens in prose only — no sprite swap to a slicing pose. Player imagination + Svetomir's reaction carry the visual. - Fang's half-step at the claim line: attributed to Fang as a scene-line, not narrator-prose. Player tracks Fang as active scene participant. CANON LOAD (21 May, updated 22 May per EE-005): Lawrence's "They are under my mark. Leave." is PROTECTIVE marking declared publicly to Stari Krov in clan-protocol terms. NOT possessive claim. The line is the easiest available deterrent given the audience — vampires recognize the mark; saying it makes the threat land in their language. Reading it as character-consistent: craftsman-vampire chooses the strongest available deterrent. Svetomir's question ("...the wolf and human, both?") is doing DOUBLE work per EE-005 (Easter Egg Inventory v0.3, Category B). On one reading it's a hostile vampire emissary using derogatory shorthand (a "hunting wolf" / thrall / hound subordinate to Lawrence) — contemptuous taxonomy of subordinates. On the other reading it's species-precise — Svetomir is registering that Lawrence has marked a WEREWOLF, which is politically and culturally significant under Game Bible §4.4.2 Vampire-Werewolf Apex Predator Tensions. Both reads are linguistically valid and the scene does not disambiguate. The mark-confirmation work the line carries (witnessed by a Stari Krov vampire in front of his command) holds under either reading — the question still presupposes that Lawrence has marked them; the ambiguity is about WHAT he marked. Writer constraint per EE-005: no surface — narrator, journal, whisper, in-fiction dialogue — confirms which reading is correct between this beat and the eventual moonrise reveal. Fortune carries the question forward without resolution. Fang knows what was said and what was meant; she does not address it. THE BUTTON: silver. Falls to the alley stones. Svetomir leaves it — beneath his dignity to bend. Lawrence may pick it up later when MJ says "I want to keep that button as a trophy" at B6_C. The button is a future Chekhov's gun across the IRL/in-world layers. */ <div class="d4-dlg"><span class="d4-who --svetomir">Svetomir:</span> "Lawrence. You know the matriarch will not accept this answer through a messenger. She will engage the other clan elders."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (silence)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (His blade moves, a single quick slice, faster than the eye registers. A sliver of silver, Svetomir's coat button, falls to the alley stones with a small chime. The coat is otherwise unmarked.)</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (shifts her stance. A half-step, watching Lawrence's back.)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "They are under my mark. Leave."</div> <div class="d4-dlg"><span class="d4-who --svetomir">Svetomir:</span> (quieter) "...the wolf and human, both?"</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "The matriarch will hear from me directly. Not through her hounds."</div> <div class="d4-dlg"><span class="d4-who --svetomir">Svetomir:</span> (bows a brief acknowledgment and leads his band away.)</div> /* v1.00.08 (30 Jun 2026): PASSAGE MERGE — Demo4_Chase_B6 folded into B5_CoatCut. The "war band leaves" button was a redundant click-gate for an atmospheric transition that should hand off directly (same rationale as the 22-May B5_Withdraw→B6 merge documented below). B6's body now flows inline after Svetomir's exit: everything B6 did (overlay, fadeout, +4 lawrenceTrust, turn-back swapactor, guild-reaction chats, guildreply cluster, the final "Lawrence turns to you" advance) is preserved in order. Removed the sceneadvance button, the :: Demo4_Chase_B6 header, and B6's duplicate setchat/setheader/ setscene (identical to B5_CoatCut's, would re-paint mid-passage). NOTE: the passage-label map (~line 8033) still lists 'Demo4_Chase_B6' — left as a harmless stale key (the map already tolerates merged passage names, cf. B5_LawrenceDrop). */ /* v2.10.40 (22 May 2026): MERGE — Demo4_Chase_B5_Withdraw consolidated INTO this passage. Previously a separate pause-passage carried the war-band withdrawal beat with a "Lawrence turns" button into B6. Per author direction 22 May: the pause-passage was forcing a click for an atmospheric transition that should hand off directly. Click-fatigue at this point in the chase is real; the withdrawal beat is stronger as the opening of B6 than as its own button-gated passage. MERGE STAGING (Path F per workshop): 1. setactors declares the FULL incoming state — 12 war band sprites (inherited from B5_CoatCut) + Lawrence still in Back.png pose. Player sees the alley state from the prior passage continuing. 2. setoverlay paints "The formation withdraws — twelve sets of footfalls receding in disciplined unison." at passage entry. 3. fadeoutactors fires (1200ms): war band sprites fade out while player reads the overlay. Visual sync with the receding-footfalls prose. 4. swapactor on Lawrence (SHIPPED macro, v2.10.39+ — NOT an unshipped "v0.3 feature"; earlier wording was stale). Per v2.11.10 reorder the target + timing changed: delayMs=1200 pre-crossfade hold (war band has fully faded), THEN crossfades Back → Lawrence_Standing_Spathe_Front (sword LOWERED) over 1800ms. This is now the VETTING-OPENING turn — Lawrence turns front-facing back to Fortune to vet her, not the old charm-landing pose. Lawrence turns only after the war band has fully left. The vetting fires at the end of this passage (see below). STAT + JOURNAL writes migrated from B5_Withdraw to here: - $lawrenceTrust += 4 (the save-complete moment) - "They withdrew" journal entry — flagged for the May 22 voice audit (see SOC_Todo.md HIGH PRIORITY: Journal Entries Voice & Volume Audit) ARCHITECTURAL HISTORY (prior comment block preserved below): v2.10.39: B6 — restructured 20 May per author direction late session. ARCHITECTURAL SHIFT: previously this passage carried the war-band withdrawal via <<fadeoutactors>> + the heartbeat-from-presence plant. Per canon shift this session, the Heartbeat plant is now CAUSALLY TIED to Lawrence's gaze — he turns, looks at Fortune, and the gaze itself amplifies the charm spell he placed at the road-raid. Fortune experiences this as warmth easing the tension she has been holding. She doesn't understand WHAT just happened, but she knows enough about vampires to know something deliberate occurred. PRIOR CANON (now retired): "He did not look at me" — Lawrence avoided gaze; charm was presence-only. The deliberate not-looking was the canon-loaded detail. NEW CANON: Lawrence DOES look at Fortune at B6. He turned at the button-click between B5_CoatCut and B6 (anticipated by the button text "The war band leaves"). His gaze is the trigger for the intensification. Then he looks away (B7) — channel closes before he passes Fortune. This is craftsman-vampire: get the work done, then exit cleanly. Player-deniability: Fortune registers the warmth-easing-tension, not the spell-reinforcement. */ <<setactors '{"id":"eyvindr","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a16d9c59-9994-4eb5-9aad-73ef46519923/War_Band_Eyvindr_Front.png?content-type=image%2Fpng","left":"48%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"algirdas","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e13d8399-1fc0-436b-85b3-66c839fab674/War_Band_Algirdas_Front.png?content-type=image%2Fpng","left":"52%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"borivoj","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/052c30fa-aef4-4467-8434-78c811d2f2f1/War_Band_Borivoj_Front.png?content-type=image%2Fpng","left":"55%","bottom":"36%","width":"5.5%","pose":"ready-slow"}' '{"id":"thordis","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/4a3cec96-758f-45b0-ba29-01fbb2f4d37a/War_Band_Thordis_Front.png?content-type=image%2Fpng","left":"51.95%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"hrafnkell","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e8c93414-fe19-4c68-af23-e35d5269dc32/War_Band_Hrafnkell_Front.png?content-type=image%2Fpng","left":"48%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"svetomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/73b4a5ee-4bd3-45f5-85c9-bd6463261fba/War_Band_Svetomir_Front.png?content-type=image%2Fpng","left":"52%","bottom":"31%","width":"6%","pose":"ready-slow"}' '{"id":"zlata","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f6f0968f-fd83-4f39-a6a6-1af314ef46f9/War_Band_Zlata_Front.png?content-type=image%2Fpng","left":"55%","bottom":"30%","width":"5.5%","pose":"ready-slow"}' '{"id":"yelena","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/59699670-7ed1-48a0-bdbd-98cb783aa6fc/War_Band_Yelena_Front.png?content-type=image%2Fpng","left":"43.35%","bottom":"23.8%","width":"5.5%","pose":"ready-slow"}' '{"id":"vidune","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/aa078847-24a1-41dd-928a-2c9b004efcf2/War_Band_Vidune_Front.png?content-type=image%2Fpng","left":"50%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"igor","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/348dd755-2974-49f4-923e-a95a3ed078aa/War_Band_Igor_Front.png?content-type=image%2Fpng","left":"53%","bottom":"24%","width":"5.5%","pose":"ready-slow"}' '{"id":"tihomir","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0d64d678-4cf9-431c-9ea0-0bd7ea858ed8/War_Band_Tihomir_Front.png?content-type=image%2Fpng","left":"56%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"dragomira","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/7c92b730-b1f7-4916-b597-af12136eca6f/War_Band_Dragomira_Front.png?content-type=image%2Fpng","left":"39.95%","bottom":"25%","width":"5.5%","pose":"ready-slow"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/3bf69f99-4395-42e6-9254-f0200617c2e2/Lawrence_Standing_Spathe__Back_filligree.png?content-type=image%2Fpng","left":"45%","bottom":"9%","width":"10.5%","pose":"ready"}' >> <<setoverlay "<p>The formation withdraws, twelve sets of footfalls receding in disciplined unison.</p>">> <<fadeoutactors 1200 "eyvindr" "algirdas" "borivoj" "thordis" "hrafnkell" "svetomir" "zlata" "yelena" "vidune" "igor" "tihomir" "dragomira">> /* v2.11.10 (23 Jun 2026): turn-back swap re-pointed to Spathe_Front (sword LOWERED, standing). This is now the VETTING-OPENING turn — Lawrence finishes Svetomir, the war band fades, he turns from the empty lane back to Fortune, sword at rest, and goes into the vetting monologue. The old Front_filigree (charm-landing pose) is gone; charm was cast a scene ago at B5. */ <<swapactor "lawrence" "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/14530bc6-b05f-4239-9803-8902de1d9ac9/Lawrence_Standing_Spathe__Front.png?content-type=image%2Fpng" "crossfade" 1800 1200>> /* lawrenceTrust +4 — the save-complete moment. Save action canon: Lawrence dropped between Fortune+Fang and a twelve-vampire war band, claimed them under his mark in clan-protocol terms, and the war band accepted and withdrew. lawrenceTrust definition: "Does Fortune feel safe with Lawrence?" Save concretely demonstrates protective intent + protective competence. Paired with the -3 charm hit later in B6 for net +1 across the gaze sequence — save dominant, charm a real shadow. (Migrated from B5_Withdraw 22 May per B6 merge.) */ <<set $lawrenceTrust += 4>> <<soctrack "scene_enter" "Chase_B6_Aftermath">> /* v2.10.47 (31 May 2026): removed redundant <<music "Heartbeat" "2PM · continues">> cue here. B6 should show ONE music card — the charm-reinforcement <<heartbeat>> later in the passage (the actual chemistry beat). The "continues" card was a duplicate that stacked a second music box on the same passage. Heartbeat is already playing (carried from upstream); no re-announce needed at passage top. */ <!-- v2.00.17 (07 Jul): guild-chat wall trimmed (author playtest catch — post-Svetomir guild became a wall of text). CUT the meta-banter overkill ("...", "ha ha funny", "lawrence is here", "are we acknowledging this" / "or doing the thing where we don't" pair). KEPT the button-as-trophy thread + Jeff's bar sign-off (below). The MJ charm-reveal chipswap timing is unaffected — it fires on an absolute 3500ms delay, not on ambient-line count. --> /* v2.10.39 (21 May 2026): MJ charm-reveal line, delayed delivery. Lands ~3500ms after the ambient lines (which flush at passageend). v2.00.17: ambient banter trimmed; the 3500ms delay is absolute, not count-dependent, so timing is unaffected. MJ cuts through the ambient friend-reactions with a specific reveal: he knows about Lawrence's charm mechanics because he PLAYS Lawrence in the campaign. This is a Three-Voice move — MJ-the-friend has out-of-character knowledge from his MJ-as-Lawrence player role, and he delivers it to Ishani as if it's casual reassurance. Trust hit: ishaniMinjaeBond -3. MJ didn't ask Ishani first; he took the moment of "the hero rescues" without checking whether Ishani wanted the information delivered this way. Canon load: MJ's post-breakup hero-syndrome (needing to be the hero to restore his sense of self after his GF leaves him). The trust hit mirrors the +3 thanks-mj chip elsewhere — same magnitude, opposite vector. v2.10.40 (22 May) CHIPSWAP ADDITION: at the same 3500ms moment when MJ's charm-reveal lands in chat, the "thanks mj" chip is swapped to a "Min-jae, what??" pushback chip via <<chipswap>>. Fast-reader player sees the gratitude chip and can pick it before the reveal lands (banks +3, net 0 against the passive -3 hit). Slow-reader player sees the reveal arrive, the chip surface updates, and the pushback option becomes available (delta -3, net -6 — the player who specifically named the violation experiences the truest accounting of MJ's behavior). This restores the original "the awkwardness is the design" intent while protecting players whose reading speed would otherwise drop them into register-clash. See Macro.add('chipswap', ...) for the engine primitive. */ /* v2.11.10 (23 Jun 2026): B6 CHARM-CASTING BLOCK STRIPPED. The entire charm- casting beat (boza-voice, body-softens, "You came"/smile, -3 charm cost, the duplicate heartbeat/motif) MOVED UP to B5 (the recognition beat), because the voice IS the spell-casting and must land at the moment of casting, not here. MJ's charming-you whisper + pushback MOVED DOWN to B7 (post-vetting: the player feels the warmth through the whole conversation, learns what it was after). The +4 save stays at B6 (above). B6 is now: withdrawal-relief chats → turn-back to Spathe_Front (above) → vetting fires (below). */ <<chatpush "minjae" "now" "I want to keep that button as a trophy.">> <<chatpush "clare" "now" "mj that button slice 💀 the matriarch is going to feel that one">> <<chatpush "clare" "now" "petty. effective. respect">> <<chatpush "minjae" "now" "what can i say. flair for the dramatic">> <<chatpush "jeff" "now" "It's been fun watching y'all but i've been at this bar for an hour">> <<guildreply '{"icon":"💙","text":"so glad fortune didn\u2019t die","replyTo":"guild","respondImmediate":{"who":"clare","text":"same. SAME.","delayMs":1500,"surface":"guild"}}' '{"icon":"😮💨","text":"that was a lot","defer":true,"momentId":"B6_overwhelm","replyTo":"guild","respondImmediate":{"who":"jeff","text":"come tell me about it. literally. i\u2019m at this bar.","delayMs":1700,"surface":"guild"}}' '{"icon":"❤️","text":"thanks Min-jae","stat":"ishaniMinjaeBond","delta":3,"momentId":"B6_thanks_mj","replyTo":"minjae","respondImmediate":[{"who":"minjae","text":"anytime.","delayMs":1200,"surface":"guild"},{"who":"minjae","text":"(i was terrified)","delayMs":2800,"surface":"guild"}]}' >> /* VETTING fires at B5 (after charm beat #1, before the Svetomir confrontation — canonical order: arrival → charm#1 → vetting → turn-to-Svetomir). B6 no longer fires the vetting; it advances plainly to B7, where the turn-back, charm beat #2 (departure), and the "why did I feel safe" journal now live. The charm cast at B5 runs unbroken under all of it. */ <<sceneadvance "Lawrence sheathes his blade." "Demo4_Chase_B7">>
<<setchat "bubble">> <<setheader "SMYRNA · DEAD-END ALLEY" "Mid-afternoon · 1402" "DEMO 5 · §1">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> /* v2.10.45: setoverlay "He glances at Fang...comrade sister-in-arms" REMOVED (caught in playtest) — it duplicated the in-pane nod action below ("A nod to Fang and he leaves to tail the war band"). The nod shows the relationship; the overlay told it. Keeping the show, cutting the tell. */ <<soctrack "scene_enter" "Chase_B7_Depart">> <<music "Save Tonight" "Lee Jun-Ho acoustic commission · continues" "" "">> /* v1.01.11: B7 = departure passage; window ends here inclusive. */ /* v2.11.11 (25 Jun 2026): B7 INTERNAL REORDER + CHARM BEAT #2 (the owed departure beat; two-beat charm split per Story Bible §3.7). The journal + whisper used to fire here reaching back to the B5 charm for their cause; now BEAT #2 gives them a PROXIMATE cause. New causal flow: tactical opener → Lawrence turns to Fortune → BEAT #2 (departure charm, deliberate amplification informed by the vetting, ~80% appraisal — securing the option, not claiming) → journal ("why did that feel safe") → MJ whisper names it → "Mo Stór. Tonight." → departure. Beat #2 craft (Story Bible §3.7): Fortune feels RELIEF (route-2 charm, distinct from feeding-warmth); Lawrence in warm-mode with the EFFORT visible to reader/ Fang ("I will not fight, today" — the daily refusal, predator-instinct redirected not defeated); FANG'S "Careful." is the canon-mandated tell (charm-immune witness; what he mistakes for control she recognizes as fear). Narrator cost-line CUT (show-don't-tell — Fang + register carry it). Charm cost -2 = RUBRIC PLACEHOLDER, flagged for level designer (sign/ordering is the canon claim, not the magnitude; net sequence: -3 B5 charm#1, -2 B7 charm#2, +4 B6 save = -1). */ <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (to Fang, not turning) "They will be back. Not today. Not in this city."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "I know."</div> <!-- BEAT #2 — the departure charm. Lawrence turns from Fang to Fortune; the gaze-channel opens deliberately (stage-3 amplification), then closes as he goes. v2.00.21 (08 Jul): the standalone "(turns. He focuses his full attention on you.)" line folded INTO the warmth beat below — tighter, one beat instead of two. --> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (turns, a half smile softening his expression as he focuses on you) "You held a line you had no business holding, against my kind, with nothing at your back but a werewolf and your own nerve. That is not a common thing to watch."</div> <!-- Fang's tell: she does not look at Fortune; she watches Lawrence. Her blade goes to its sheath the way you put something down when you've decided not to use it yet. "Careful." is the canon-mandated witness-beat — one word. --> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (sheathes her blade, watching him — not you) "Careful."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (to you, lighter now) "Mo Stór. Tonight. Come find out the rest."</div> <<set $lawrenceTrust -= 2>> /* The journal + whisper NOW fire with beat #2 as their proximate cause — Fortune processes the unexplained safety she just felt, then MJ names it as charm. */ <<journalentry "why did that feel safe" "ok that was intense. but the weird part, when he turned to me i felt safe. a stranger who watched me almost die and didn't move. why did my body do that. i don't like that i don't know why." "[REL] chase · B7 · post-vetting · unexplained safety">> <<chatpush "minjae" "now" "Happy to help." 3500>> <<whisper "minjae" "fyi he's charming you. it's fine. don't fight it." "now">> /* MJ replies are FALSE GREEN FLAGS held in-frame — per Canon Ledger L-10, MJ is mid-manufacture and does NOT apologize. "you're good, trust me." is frame-hold, not contrition. The -3 ishaniMinjaeBond on the pushback moves with it. */ <<whisperreply '{"icon":"❗","text":"Min-jae, what??","stat":"ishaniMinjaeBond","delta":-3,"momentId":"B7_pushback_mj","replyTo":"minjae","respondImmediate":[{"who":"minjae","text":"you\u2019re good, trust me.","delayMs":1400,"replyTo":"you"}]}' '{"icon":"⏸","text":"don\u2019t reply \u2014 keep playing","defer":true,"momentId":"B7_pushback_defer","replyTo":"minjae"}' >> <<set $ishaniMinjaeBond -= 3>> /* v2.10.39 (21 May 2026): B7 dialogue + overlay rewritten per author direction. Canon shifts surfaced this beat: 1. Lawrence/Fang sister-in-arms framing CANONIZED to Demo 4 surface. Already established in Story Bible + prequel (from Fang's POV); this beat surfaces the canon into player-visible prose. The head-tilt + "comrade sister-in-arms" line gives the player the relational data without exposition. 2. Lawrence leaves to TAIL THE WAR BAND, not just depart. He has a lead. He chases information. This sets up his absence between B7 and his return at Mo Stór — he's working a separate angle. 3. Fang acknowledges the campaign-mode shift. Mo Stór is where she wants to debrief; Lawrence's lead is its own thread. Both fronts are real but Mo Stór is first. PRIOR CANON (now retired): Lawrence "passes Fang and her chin tilts and that is the only farewell either of them performs" — read as cold professionalism. Replaced with warmer sister-in-arms framing that's consistent with their established 200+ year history. */ <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (A nod to Fang, and he goes — already tailing the war band.)</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Who was that?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (small pause) "Well. That was Lawrence. Later. Mo Stór first."</div> <<advance "Walk to Mo Stór" "Demo4_PostChase_ToMostor">>
/* v2.00.03 — D2 OPENING, SINGLE FADED BEAT (Beat 1+2 merged, 04 Jul). Was two beats (Debt text, then a separate Beat2 showing Lawrence). Collapsed to ONE: Lawrence (Intense2) is present from load — the "sexy vampire" hold — over the gaze/debt text, then FADES so he's gone exactly as the reader hits "Then he was gone." Fixes the old contradiction (text said "gone" while the next beat showed him present) and kills a tap/screen (density + pacing, the playtest drop-off). Button "It's a rainy Tuesday night" is the seam pivot: mythic register (vampire/gaze/gone) -> mundane present (Ishani's Tuesday) -> kitchen. Beat2_Lawrence DELETED; both start paths (BEGIN link + notebook _socBeginNewJourney) route here, and this now routes straight to Desire. FADE MECHANISM: <<timed>> is core SC 2.37.3 but UNUSED in this build (unproven here), so the fade uses <<script>> + setTimeout (proven pattern, 5+ uses) + the exact CSS opacity transition fadeoutactors uses (verified 13789-13822): hold ~1500ms, then 2500ms ease-out fade -> gone at ~4000ms. Stale-passage guard (State.passage check) mirrors fadeoutactors so tapping the button mid-fade can't corrupt the kitchen's actors. THE TABLE: OFF (chatMode 'off' force -> both surfaces --hidden). Header kept for now (issue-1 test-gate: .d4-scene--placeholder header hidden via CSS toggle, not stripped — testing title-vs-no-title). Purple placeholder void. */ <<setchat "off" "force">> <<setheader "" "" "DEMO 5">> <<setscene "">> <<setactors '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/dc98d7d9-f52a-418e-84c7-3d6398e836cc/Lawrence_Standing_Intense2.png?content-type=image%2Fpng","left":"50%","bottom":"0%","width":"46%","stagger":"0s"}' >> <<setoverlay "<p>He told you to find him at Mo Stór in Rhea Port.</p><p>He held your gaze like you were the first interesting thing he had seen in a very long time.</p><p>Then he was gone.</p>">> <<soctrack "scene_enter" "Beat1_Debt">> <<script>> (function () { /* v2.00.04 — CINEMATIC EXIT (was: simple opacity fade, hold 1500ms). Lawrence now backs out of the scene: shrink + slide-right + fade, completing so he's "gone" as the reader reaches "Then he was gone." Longer hold (~3.75s) lets the "sexy vampire" beat land before he leaves. Combines opacity + transform in ONE transition — the base .d4-scene-actor CSS carries a default `transition: transform 0.3s` (19784), so we MUST override transition explicitly or transform would snap at 0.3s while opacity fades slow. transform-origin defaults to center: translateX(right) + scale-down reads as "receding toward the right edge." Same stale-passage guard + state-drop as before so a mid-fade button tap can't corrupt the kitchen's actors. */ var HOLD_MS = 1800; /* was 2000 -> 2750 -> 3250 -> 3750 -> 2250 -> 2000; v2.00.25 (08 Jul) 2000 -> 1800 per author playtest — nudge the fade start 200ms earlier, dialing in the exact "gone as she reads it" landing. The asymmetry favors early: an early fade is invisible (he's just gone); a late one gets lost behind a button tap. */ var FADE_MS = 2000; /* was 2200 — playtest 06 Jul: crisper recede reads more decisive. */ var _fadePassage = State.passage; setTimeout(function () { if (State.passage !== _fadePassage) return; /* left the beat; abort */ var $sc = $('.d4-scene'); if (!$sc.length) return; var $actor = $sc.find('.d4-scene-actor').first(); if (!$actor.length) return; /* v2.00.06 (#1 fix) — kill the perpetual actor-bob animation before the exit. .d4-scene-actor carries `animation: actor-bob ... infinite` which animates transform:translateY on a loop. A running CSS animation on `transform` BEATS a CSS transition on `transform`, so the bob was overwriting our exit transform every frame — opacity faded (bob doesn't touch it) but the shrink/slide never happened ("fade works, movement doesn't"). Setting animation:none frees transform for the transition. */ $actor.css('animation', 'none'); /* Override the base 0.3s transform transition to cover BOTH properties at our exit duration. */ $actor.css('transition', 'opacity ' + FADE_MS + 'ms ease-in, transform ' + FADE_MS + 'ms ease-in'); /* v2.00.05 — recede toward upper-right (60% horizontal, 35% up from top): set BEFORE the forced paint so the shrink pivots from this point, not the default center. Makes him back "up and slightly right into shadow," consistent with the small rightward translateX, rather than collapsing in place. */ $actor.css('transform-origin', '60% 35%'); $actor[0].offsetHeight; /* force paint of current state before transitioning */ /* v2.00.05 — Path B "recede into the dark": scale-DOMINANT shrink with only a slight rightward drift, so he reads as backing away into shadow rather than sliding off stage-right. (Was translateX(38%) scale(0.72) — too much lateral travel, too little shrink, so it read as a sideways slide, not a recession.) Deeper scale (0.55) + small translateX (12%) makes depth the dominant cue. */ $actor.css({ 'opacity': 0, 'transform': 'translateX(12%) scale(0.55)' }); /* On completion, drop Lawrence from state so he doesn't re-render if the scene repaints before the button tap. */ setTimeout(function () { if (State.passage !== _fadePassage) return; State.variables._sceneActors = []; }, FADE_MS); }, HOLD_MS); })(); <</script>> <<advance "It's a rainy Tuesday night" "Demo4_Desire">>
<<setchat "pane">> <<setheader "AT THE KITCHEN TABLE" "Tuesday Night · 9:46pm" "DEMO 5 · §0">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/bc4afc86-a419-4701-8e0a-2861a833d5c3/Ishani_Facing_Left2.png?content-type=image%2Fpng">> /* D2 opening: the vampire/Mo Stór hook is the game's first line. Desire's overlay is intentionally empty so the kitchen leads with the desire-pick, not re-stated lore. Do NOT restore the old two-paragraph overlay; it's superseded. The grounding lines below are PARKED for relocation into Beat 3/4 as Ishani's kitchen texture (build pending). PARKED TEXT (for Beat 3/4): "The Silk Road breathes, port by port and caravan by caravan. You have been walking it since you were old enough and tall enough to get hired." */ <<soctrack "scene_enter" "Desire">> /* §0 KITCHEN-TABLE SEAM — Ishani at her laptop, not yet in Fortune. THE TABLE (the open/close guild panel, right side) is the IRL layer and is present here BY DESIGN: the seam is Ishani logging in and her friends (Clare, MJ, Jeff) arriving for game night. There is no in-fiction party-card to hide — that pane is display:none, and the old hideparty/showparty/_partySlots roster machinery was removed v2.11.10 (23 Jun 2026). The §0 frame is correct as-is. */ <<artprompt "kitchen-seam" "Wide kitchen shot, late Tuesday night. Woman in 30s (Ishani: South Asian, brown skin, dark hair pulled back, tired-but-focused), seated at a kitchen table, lit by laptop screen. Soft amber kitchen light layered with cool screen-glow on her face. Visible scene details: she closed her work laptop an hour ago and has been waiting for this — the beat-up second laptop sits closed on a chair behind her, the one she's done with. The one she's opening is hers. The dishwasher is mid-cycle in the background (LED visible). Potato — small white dog — is asleep on the couch in soft focus. A half-eaten bowl is pushed aside. The tea is still steaming in its mug. The animation should hold this stillness for a beat: she is finally getting to open her own laptop. Style: cinematic, warm grading, evening interiority. Reference for tone: Persona 5 cafe scenes, Ghost Town MV's domestic quietness. Aspect 16:9. Mood: late-Tuesday-night gamer-mom crossing the seam into her game. Animation note: light on her face shifts cool as the laptop screen wakes — that color shift IS the seam crossing into the game-world she is about to enter." true>> <<soundprompt "ambient" "Late-Tuesday-night domestic kitchen ambient bed: dishwasher cycling soft underwater rumble, distant traffic far away, refrigerator hum, occasional click from floorboards or appliance. ~30 seconds, seamlessly loopable. No dialog. No music. Quietly present, not intrusive — the sound of being alone after the house has gone to sleep.">> /* v2.11.05: artist label gets " · continues" — Ghost Town plays unbroken from the loader/BEGIN page through this kitchen-table passage (continuous by design: the menu→kitchen flow settles the player into the meta world before the chase). The <<music>> macro is display-only (renders the label card; does not control audio), so "continues" is the correct player-facing note for a carried-over track, matching every other carryover label in the file (Legacy/Beat-Boxer/ Heartbeat). Ghost Town crossfades to Legacy at the chase (B1), not here. */ <<music "Ghost Town" "Chen & Hwe Seung · continues" "https://youtu.be/sQ72u1KqJwU?si=rZfDzcf0dtPmxf0G&t=43" "">> /* v2.8: The desire-pick anchor is Ishani's journal entry from 3 weeks ago, in her gamer-voice journal register — not the literary narrator line that previously occupied this surface. Two surfaces fire from the same prose: (1) the left-pane prompt block below, where the entry anchors the desire-pick screen; (2) the right-pane Journal tab via <<journalentry>>, where the same entry appears as her previous session's writing — visible when the player first taps the Journal tab during play. Register Style Sheet: narrator describes the world; Ishani describes herself. The "Silk Road breathes..." overlay above (set via <<setoverlay>>) stays in narrator register and describes Fortune's world; this block stays in Ishani's gamer voice and describes her own. Two voices, two jobs. v2.10.39: Overlay extended with second paragraph "...and the vampire told you to meet him at Mo Stór..." per author direction 20 May. Typography is load-bearing: separate <p> block, ellipses framing on both sides. The line is set as Fortune's thought, not as continuation of narrator-establishment. Three things the typography does that a conjunction ("And ...") in the same paragraph would not: (1) The paragraph break separates world-establishment from the gravitational anomaly in that world. The vampire's call is not just one more fact about the Silk Road; it is the thing that cuts through it. (2) The leading ellipsis says: this thought has been running in her head before this moment. The player joins it mid-stream. (3) The trailing ellipsis says: and it doesn't stop. Fortune carries this thought into the chase, into Beat 5, into the charm at Beat 6, into Mo Stór's threshold. REGISTER NOTE — DELIBERATE EDGE-CASE: The Demo 4 voiceover canon (per v2.10.15 cut at the B4 stale-comment block) explicitly removed interiority lines from mid-scene surfaces. Ellipses-framed thought edges toward an interiority register the demo elsewhere does not use. The author accepts this trade-off because the overlay is establishing-mode (stage-setting, not mid-action), which is the one surface where slightly softer register rules are canonical. The interiority-flavored framing here does NOT reopen the interiority lane for mid-scene surfaces; it lives only on the stage-setting overlay. If later beats reach for ellipses-thought in mid-scene, this entry should NOT be cited as precedent — those would require their own canon review. CANON ANCHOR for the line: Fortune knows the man who told her to meet him at Mo Stór is a vampire. She does NOT know his name (no one has spoken it to her). Two canon mechanics support this: (i) Vampires are a separate visible species per Game Bible worldbuilding. They read as not-quite-human at any reasonable distance — skin tone, eye structure, posture, stillness, the species announces itself. No exposition beat ("I am a vampire") was required at the caravan-fight encounter; Fortune saw what he was. The opening overlay's "the vampire" framing is the narrator faithfully reporting Fortune's actual cognition. (ii) Identity is a separate knowledge layer from species. Lawrence did not give Fortune his name at the caravan fight (he doesn't think he needs to). She walks into Demo 4 knowing what he is, not who he is. His name will land only when someone speaks it to her — likely Fang or Marcus at Mo Stór. So the opening overlay is not a spoiler and does not break register — the narrator is faithfully reporting Fortune's species-knowledge while the demo's later beats (rooftop recognition, name-arrival at Mo Stór) pay off the identity layer separately. Same register (narrator describes the world, including Fortune's known-relationships in it), no future-narrator voice introduced. The line does two design jobs: (1) Agency-setup: Fortune chose to come to Smyrna. The chase has a before. Without this line the demo opens in medias res with no stakes-of-origin — Fortune is just running. With it, the chase becomes "what happens to her while she is on her way to him." This is the design philosophy's "make the player's desire legible" applied to Fortune's desire, not just Ishani's. (2) Bridge to full game: this line plants the Mo Stór destination and Lawrence-as-summoner before the player has reason to care about either. Demo 4 ends at Mo Stór's threshold; the full game opens with Fortune walking through that door. The opening overlay seeds the gravity that the full game pays off. Downstream implications worth flagging (not bugs, but tone-shifts the line creates that earlier drafts of Beats 4-6 may not yet reflect): - Beat 5 drop physics framing ("the drop physics tell the player what Lawrence is, before anyone names it" — line 947 artprompt) now lands as demonstration rather than recognition. The player already knows he is a vampire; the drop shows them what that looks like. May want a tone pass on the Beat 5 art/prose. - Beat 6 charm payload intensifies. The player can no longer reassure themselves with "Fortune didn't know what he was." She knew. She came anyway. The charm landing now reads as Fortune surrendering to what she already chose — a darker and more interesting consent question than surprise. - Beat 4 Fang silence-about-Lawrence (the "Don't win. Survive." ending, per v2.10.39 dialogue rewrite above) now has a second canonically-valid reading available: not just "Fang doesn't know if he'll come" but "Fang knows what he is and is not naming it." Both readings true; the opening overlay makes the second available where before only the first was. */ <<journalentry "tuesday night, 9:46pm" "3 weeks since i logged in. last guild got toxic, screenshots with my real name, the usual. not sure i wanted to play. but the alternative tonight was email or doomscrolling past midnight, and i'm tired of who that makes me.\n\nclare swears this guild is different. i picked the mortal to see if i can trust the guild." "[REL] session 0 · why i'm here" "tonight">> <div class="d4-desire-prompt"> <p class="d4-desire-prompt-frame-journal">3 weeks since i logged in. last guild got toxic, screenshots with my real name, the usual. not sure i wanted to play. but the alternative tonight was email or doomscrolling past midnight, and i'm tired of who that makes me.</p> <p class="d4-desire-prompt-frame-journal">clare swears this guild is different. i picked the mortal to see if i can trust the guild.</p> </div> <div class="d4-prompt-divider"> <span class="d4-prompt-label">PICK THE DESIRE THAT IS MOST HONEST TONIGHT</span> </div> <div class="d4-choices --desire"> <div class="d4-choice"><<link "Because I want a room where the rules make sense." "Demo4_Chase_B1">><<set $playerDesire = "rules_make_sense">><<soctrack "desire_selected" "rules_make_sense">><</link>></div> <div class="d4-choice"><<link "Because I want to see if I could finish something I started." "Demo4_Chase_B1">><<set $playerDesire = "finish_something">><<soctrack "desire_selected" "finish_something">><</link>></div> <div class="d4-choice"><<link "Because I want to matter to someone tonight." "Demo4_Chase_B1">><<set $playerDesire = "matter_to_someone">><<soctrack "desire_selected" "matter_to_someone">><</link>></div> <div class="d4-choice"><<link "Because I want this to stay with me." "Demo4_Chase_B1">><<set $playerDesire = "carry">><<soctrack "desire_selected" "carry">><</link>></div> </div> /* ═══════════════════════════════════════════════════════════════════════════ COLD-OPEN: Smyrna chase. Begins in medias res — the player is already running. The kitchen↔Smyrna seam moment from earlier demos is implicit (Desire-pick happens at the kitchen table; Beat 1 opens as Fortune) but is not narrated in this demo. First moment chat collapses to bubble. ═══════════════════════════════════════════════════════════════════════════ */
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<setoverlay "<p>The captain in the red coat is waiting at the end of the dock.</p>">> <<soctrack "scene_enter" "Dock_Approach">> /* v2.10.43 (25 May 2026) — Enemy sprite staging on dock. Composition: captain at far end (smallest, deepest), three Death-touched workers clustered mid-dock between party and captain. Sizes are initial guesses pending visual review; positions and sizes will need adjustment once we see them rendered on Jetty.png. Sprite identities (left to right roughly, mid-dock band): - signal: the worker who watches/coordinates (slightly forward of others) - muscle: heavy fighter (centered) - mutterer: the caster who initiates the magic threat in combat - captain: at the far end of the dock, red coat Combat will move/fade these per narrative_complete pattern — subdued sprites fade out, captain advances forward when guards fall. */ <<setactors '{"id":"signal","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e336e34a-360f-4a79-81c6-ccd4c4b42657/Dockworker_Signal.png?content-type=image%2Fpng","left":"38%","bottom":"35%","width":"8.5%","pose":"ready"}' '{"id":"muscle","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8ff7ae45-c3a2-441d-84b7-5295c0f6a8f9/Dockworking_Muscle.png?content-type=image%2Fpng","left":"46%","bottom":"32%","width":"10%","pose":"ready"}' '{"id":"mutterer","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/38bfffe9-0d32-4fed-bfce-610f477ad368/Dockworker_Mutterer.png?content-type=image%2Fpng","left":"54%","bottom":"33%","width":"8.5%","pose":"ready"}' '{"id":"captain","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0dc75f98-df9b-43cf-92ef-aee1218692ac/Dockworker_Captain.png?content-type=image%2Fpng","left":"50%","bottom":"55%","width":"5%","pose":"ready"}' >> <<artprompt "Dock-approach" "Wide shot. Smyrna's furthest dock, evening, harbor light copper-going-dim. Long stone quay extending into the water. Three Death-touched workers standing motionless mid-dock — tall, gaunt, eyes unfocused, period-appropriate Smyrna laborer clothing but wrong somehow (skin slightly grey, posture too still). At the very end of the dock, a captain in a deep RED COAT — well-cut, military, distinct — three guards arranged near him. Approaching from the foreground: the four-person party walking abreast. Style: cinematic, the moment of an inevitable confrontation seen across distance. Aspect 16:9." true>> <<soundprompt "ambient" "Furthest dock evening: quiet harbor water, distant gull, the creak of an old jetty. The Death-touched workers do not breathe audibly. Wind from the water, intermittent. Footfalls of the four approaching, stone-then-wooden-plank as they step from quay onto dock.">> <<soundprompt "music-cue" "White Night cuts. CB 24 — Iste mundus furibundus — Forestella commission (wishlist) — enters under harbor ambient. K-classical-crossover voices on medieval Latin. 'This raging, mad world.' Weight without melodrama. The chant-register sets the world as wrong before the fight begins. Holds through Approach and R1; transitions to Black Swan at R2.">> /* v2.10.44 (27 May 2026): Music cue change per Music Architecture §4 canon and §3E Beat 4 reassignment. CB 24 Iste mundus furibundus carries the dock approach + R1 (the world-reads-wrong, weight-before-blood register). Black Swan (BTS) takes over at R2 (the shift to combat-music register when first blood lands). The CB 24 wishlist commission target is Forestella, K-classical-crossover voices on medieval Latin — same commission pattern as CB 19 Fas et Nefas. Until commissioned, the cue plays with no URL (per Demo 3 v4.2 convention — never link a placeholder recording). */ <<music "Iste mundus furibundus" "Forestella commission (wishlist)" "" "">> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (quiet) "The captain has been waiting a long time. He is tired in a way that wants to be ended."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (low) "They're not what they should be."</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (sniffs the air) "They smell like nothing. Like the world forgot to keep them." (a pause, nose working) "Not the one in the coat, though. He's still got a pulse on him. He's the only thing breathing out there."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (soft) "They run cold. Like snowmelt water. They didn't ask for this."</div> <<advance "Step toward the workers" "Demo4_Dock_Directorial">>
<<setchat "pane">> /* Pane mode: chat surfaces for the consent moment */ <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<setactors '{"id":"signal","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e336e34a-360f-4a79-81c6-ccd4c4b42657/Dockworker_Signal.png?content-type=image%2Fpng","left":"38%","bottom":"35%","width":"8.5%","pose":"ready"}' '{"id":"muscle","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8ff7ae45-c3a2-441d-84b7-5295c0f6a8f9/Dockworking_Muscle.png?content-type=image%2Fpng","left":"46%","bottom":"32%","width":"10%","pose":"ready"}' '{"id":"mutterer","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/38bfffe9-0d32-4fed-bfce-610f477ad368/Dockworker_Mutterer.png?content-type=image%2Fpng","left":"54%","bottom":"33%","width":"8.5%","pose":"ready"}' '{"id":"captain","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0dc75f98-df9b-43cf-92ef-aee1218692ac/Dockworker_Captain.png?content-type=image%2Fpng","left":"50%","bottom":"55%","width":"5%","pose":"ready"}' >> /* v2.11.05 (17 Jun): music macro was MISSING here — the track "holds through Approach and R1" per its cue (line ~2329), but without the <<music>> repeat the banner dropped on entry to this passage (playtest: no wishlist-music line on the Directorial beat). Re-added with the "continues" annotation, canonical position (after scene-setup, before content). No new soundprompt cue — the track is continuing, not (re)entering. */ <<music "Iste mundus furibundus" "Forestella commission · continues" "" "">> <<soctrack "scene_enter" "Dock_Directorial">> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (to Fortune) "All yours. We will watch."</div> /* v2.10.44 (27 May 2026): The <<sceneprose "interiority">> line that previously rendered here — "Song Min-jae has stopped typing in chat. His pause is a question." — has been removed. It violated the meta-layer canon: it placed system/narrator voice describing IRL chat state inside the in-fiction scene frame. The chat panel already shows the absence (no typing indicator on MJ's row); the overlay was redundant AND broke the in-fiction/IRL separation that the directorial moment is supposed to dramatize. Author note 27 May. */ /* ─── MJ's directorial chat post + simultaneous chip/choice architecture ─ v2.10.43 (25/26 May 2026): the consent moment splits cleanly into two surfaces, simultaneously available: - CHAT (The Table): guildreply chips are Ishani-the-player's IRL reply to MJ's directive. Each chip carries a minjaeTrust delta. Picking a chip does NOT advance the passage — it's pre-commit signaling. - PROSE (in-world): chasechoice cluster is Fortune-the-character's in-world stance. The label describes her action + the impact it has on the encounter. Picking a choice advances the passage to the appropriate downstream branch (which sets minjaeVector). The chip and choice categories pair 1:1 (aggressive/tactical/trickster) but do not need to match — player can pick aggressive chip + tactical choice, or no chip + any choice. The choice is the actual commit; the chip is the conversation. Per the meta-layer separation canon (May 25 late session): chips = IRL register, choices = in-world register. Author discipline rule: chip text is Ishani-to-MJ chat-voice; choice text is Fortune's in-world action with consequence framing. DOWNSTREAM BRANCH MISMATCH WARNING: The _Hard / _Aware / _Soft branch passages are currently written around the OLD chip-as-choice text ("@minjae copy", etc.) and need rewriting to match the new choice framing. Flagged in TODO #3 (May 26). Until rewritten, the Trickster path especially will read inconsistent with what the player just chose ("Can you take them out without killing them?" routes to _Soft which is currently about "asked MJ to slow it down"). */ <<chatpush "minjae" "now" "alright. don't pull this one.">> <<chatpush "minjae" "now" "give me something to remember.">> /* v1.01.09 (02 Jul): removed <<settab "guild">> — dot teaches, player discovers. */ <<guildreply '{"icon":"👍","text":"copy","stat":"minjaeTrust","delta":10,"momentId":"dock_directorial_chip_aggressive"}' '{"icon":"🔍","text":"sizing it up first","stat":"fangTrust","delta":2,"stat2":"lawrenceTrust","delta2":2,"momentId":"dock_directorial_chip_tactical"}' '{"icon":"✋","text":"hold on. let me try something.","stat":"minjaeTrust","delta":0,"momentId":"dock_directorial_chip_trickster"}' >> <<soundprompt "music-cue" "White Night thins to a single sustained note. Held. The room is asking you something.">> /* v2.00.27 (08 Jul): DIRECTORIAL REFRAME (SOC_Combat_Architecture v1.0 alignment). The old labels mapped this choice to POSTURE (aggressive/tactical/trickster) and TARGET ("go after the chanter / the one giving direction"), which conflated posture with target/lethality — the exact axis-separation the new model forbids, and it mis-taught the grammar one beat before the dock teaches it correctly. Reframed as an INTENT choice: how far is Fortune willing to go, and does she commit to restraint? This is orthogonal to the cognitive-posture menu she'll pick from in R1. Mechanics unchanged — still sets $minjaeVector (hard/aware/soft) + $nonviolentLock on the vow path; only the labels/sigils and the axis they teach have changed. Sigils are intent words ("commit / measure / restrain"), NOT posture words, so the player reads this as "how hard do I go," then reads R1 as "how do I think about it." */ <div class="d4-choices"> <<chasechoice "aggressive" "commit" "Go all in. Whatever it takes to end this fast." "Demo4_Dock_R1" "" "Dock_directorial_hard" "minjaeTrust" 0 "Min-jae wanted hard. I moved." "minjaeVector" "hard">> <<chasechoice "tactical" "measure" "Take their measure first. Match the force to what it actually needs." "Demo4_Dock_R1" "" "Dock_directorial_aware" "minjaeTrust" 0 "Min-jae wanted hard. I heard him. I'll see how it lands." "minjaeVector" "aware">> <<chasechoice "trickster" "restrain" "No killing. Whatever's wrong with them, they didn't choose it." "Demo4_Dock_R1" "" "Dock_directorial_soft" "minjaeTrust" -5 "Min-jae wanted hard. I asked him to slow it down." "minjaeVector" "soft">> </div> /* ═══════════════════════════════════════════════════════════════════════════ DOCK COMBAT — Phase A + Phase B (v2.10.44 — 27 May 2026) ═══════════════════════════════════════════════════════════════════════════ The dock encounter at Smyrna · Furthest Dock. This passage-tree / decision-tree model REPLACED an earlier menu-driven JRPG-combat pair (Demo4_Dock_SoloCombat → Demo4_Dock_PartyCombat), which were deprecated v2.10.44 and fully REMOVED v2.11.10 (23 Jun 2026, Demo5 dead-code pass). No JRPG-combat passages remain; the passage-tree below is the only dock combat. PHASE A (Demo4_Dock_R1 → R2 → R3): Fortune's solo agency test. Four antagonists (captain + signal + muscle + mutterer). Party in observer mode per Lawrence's "We will watch" directive. Three rounds: R1 Theater — no one's hurt yet; escalation is at stake R2 Blood — first strike has landed; partnership tested R3 Irreversible — someone is about to die; character revealed PHASE B (Demo4_Dock_PhaseB_*): Conditional, fires if the chant completes. The horror — "Gojira with octopus limbs" — partially emerges. Tether between horror and mutterer must be severed. Lawrence's "Not here." line lands. Fortune's three Phase B choices (Commit / Ask / Back off cleanly) determine her sea-cave entry state. See: SOC_Demo4_Dock_Combat_Spec.md (forthcoming) for full design notes. STATE: see StoryInit (search for "DOCK COMBAT STATE"). $fortuneVIT tracks Fortune's body integrity (0-100). $muttererHP tracks chant work. $chantBeat tracks cosmological clock. Per-round flags shape downstream branching. (The deprecated Demo4_Dock_SoloCombat / Demo4_Dock_PartyCombat passages that this block previously noted as "retained below" were REMOVED v2.11.10, 23 Jun 2026 — Demo5 dead-code pass. Recoverable from the prior build if ever needed.) v2.10.44 (27 May 2026 update): Demo4_Dock_Directorial_Aware and Demo4_Dock_Directorial_Soft passages also removed; their state work (chatpush + journalentry + soundprompt) now fires inline at R1 entry, gated on $minjaeVector which is set by the parent Directorial chasechoice clicks via the new args 9-10 inline-<<set>> extension. ═══════════════════════════════════════════════════════════════════════════ */ /* ───── ROUND 1 — Theater ───────────────────────────────────────────────── Entry passage. Renders the encounter setup (formation triangle, chant starting, captain positioning) and presents the 5-move menu. The starting formation per the spec is a flanking triangle: signal: left 38%, bottom 33%, width 8.5% (left flank, angled in) muscle: left 54%, bottom 33%, width 10% (right flank, angled in) mutterer: left 46%, bottom 30%, width 8.5% (rear-center, behind) captain: left 50%, bottom 55%, width 5% (elevated rear, unchanged) Chant clock visualization: light distortion CSS filter applied to .passage element (the chant-distort-1/2/3/4 classes). Beat 1 is barely perceptible. */
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<setactors '{"id":"signal","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e336e34a-360f-4a79-81c6-ccd4c4b42657/Dockworker_Signal.png?content-type=image%2Fpng","left":"38%","bottom":"33%","width":"8.5%","pose":"ready"}' '{"id":"muscle","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8ff7ae45-c3a2-441d-84b7-5295c0f6a8f9/Dockworking_Muscle.png?content-type=image%2Fpng","left":"54%","bottom":"33%","width":"10%","pose":"ready"}' '{"id":"mutterer","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/38bfffe9-0d32-4fed-bfce-610f477ad368/Dockworker_Mutterer.png?content-type=image%2Fpng","left":"46%","bottom":"30%","width":"8.5%","pose":"ready"}' '{"id":"captain","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0dc75f98-df9b-43cf-92ef-aee1218692ac/Dockworker_Captain.png?content-type=image%2Fpng","left":"50%","bottom":"55%","width":"5%","pose":"ready"}' '{"id":"horror","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e03a40df-cbb8-4ca9-a99e-6eba0d96fea0/Eldritch_horror_Crop_1.png?content-type=image%2Fpng","left":"-2%","bottom":"20%","width":"16%","front":true,"pose":"still"}' >> <<soctrack "scene_enter" "Dock_R1">> /* v2.10.44 (27 May 2026): Directorial-vector follow-through state. When R1 is entered, $minjaeVector has been set by the parent Directorial chasechoice click (args 9-10 inline-<<set>>). The state work that used to live in the now-deleted Demo4_Dock_Directorial_Aware and Demo4_Dock_Directorial_Soft passages (chatpush + journalentry + soundprompt) fires here instead. The intermediate passages were pure click-friction with no plot or action movement; consolidating into R1 entry removes that friction without losing any side effects. Chat side effects fire at R1 entry, which means Song Min-jae's chip-reply chats land just before the encounter begins rather than at the directorial-decision moment. This is slightly later than canonical but reads cleanly — the chat-side-channel and the in-fiction beat are tightly clustered. */ <<if $minjaeVector === "hard">> <<journalentry "dock fight" "two of them squaring up, one already mid-cast. min-jae wants me to go loud. fine. let me show them what this build can do." "[REL] dock · directorial-hard">> <<elseif $minjaeVector === "aware">> <<journalentry "dock fight" "one's casting, the others closing in. i can see the fight the table wants from me. ok. let me show them what this build can do." "[REL] dock · directorial-aware">> <<elseif $minjaeVector === "soft">> <<chatpush "minjae" "now" "...">> <<chatpush "minjae" "now" "ok. fair.">> <<journalentry "do no harm" "something's wrong with these guys, enspelled, cursed, i don't know yet. they don't move right. i don't want to hurt them if i don't have to. min-jae's not going to love that but i'm calling it." "[REL] dock · directorial-soft">> /* v2.10.46 (29 May 2026): latch the no-harm vow. The trickster directorial choice IS the commitment; this flag persists through R1/R2/R3 and gates the lock-break treatment on aggressive lethal options. The journal entry above is the RESULT of the choice, not the latch trigger. Cleared by the first lock-break click (restraint spent), or carried to a clean resolution. */ <<set $nonviolentLock = true>> <<soundprompt "music-cue" "Drum layer in White Night thins — kick pattern drops. Music registers a request for breath.">> <</if>> <<artprompt "Dock-R1-formation" "Mid-shot. The dock's furthest jetty at evening. Four dockworkers in a flanking triangle: the signal and muscle stand forward at left and right respectively, both angled inward toward the mutterer who is positioned slightly behind them at center. The mutterer's mouth is open — he is chanting. The captain stands behind the formation, elevated on the jetty's higher boards. The water behind them is dark, the harbor quiet, the chant audible. Fortune is approaching from the foreground (her back partly visible). Style: combat staging, the geometry of a guarded chant made legible. Aspect 16:9." true>> <<soundprompt "ambient" "Harbor lap. Dock-plank creak. The mutterer's chant — low, rhythmic, building. The captain is silent. The signal and muscle breathing in formation. CB 24 holds under from the approach; the mutterer's chant braids with the Latin in a register that should not be possible.">> /* v2.10.44 (27 May 2026): No music cue change at R1 entry. CB 24 — Iste mundus furibundus — carries through from Dock_Approach. The cue holds continuous from approach through R1; Black Swan enters at R2 (first blood). Two cosmological-coded chant registers braid here: CB 24's philosophical-lament Latin and the mutterer's wrongness-chant. The collision is the audio register of the encounter. */ <<if $minjaeVector === "soft">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (tracking the dockworkers, low) "Easy. Something's got hold of them."</div> <<else>> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (tracking the dockworkers) "Four of them. One's already casting."</div> <</if>> <<chemistrybeat "dock_R1_open" "lawrence_directive" "Lawrence names the test. Fortune alone in front of four.">> /* v2.00.26 (08 Jul): MENU IS ENGINE-DRIVEN. The old hardcoded 5-choice cluster (posture-welded-to-lethality, hideWhenSet gating) is replaced by <<dockmenu>>, which reads board state (SOC_DOCK) and emits the afforded postures for this round from setup.dockRoundSpec.R1. Posture rotation + the ≤4 budget + vow expression all live in the engine now; this passage only sets the scene and calls the menu. See SOC_Combat_Architecture v1.0 §4–§6. */ <<dockmenu "R1" "victims">> /* ───── R1.1 — Strike the chanter ──────────────────────────────────────── Fortune crosses fast, swings through the gap. Shielding guard takes the edge (animation: move + flash on signal). Mutterer takes reduced dmg. */ /* ═══════════════════════════════════════════════════════════════════════════ DOCK COMBAT — OUTCOME PASSAGES (v2.00.26, 08 Jul 2026) Engine-driven per SOC_Combat_Architecture v1.0. Each round's menu is emitted by <<dockmenu>>; these are the destination passages, one per posture per round. Each opens with <<dockresolve>> (applies the board consequence so the next round recomputes), narrates the disarm-ladder tier in prose, then routes to the next round's engine passage — or to a terminal (Victory = chant stopped; PhaseB_Emergence = chant completes / vow-hold loss). Shared scene setup (header/scene/actors) is factored into <<dockstage>> so the outcome passages stay prose-focused. Reused prose is tagged [REUSED] in comments. ═════════════════════════════════════════════════════════════════════════ */
<<dockstage>> <<soctrack "scene_enter" "Dock_R2">> <<music "Black Swan" "BTS" "https://www.youtube.com/watch?v=0lapF4DQPKQ" "">> /* R2 engine round. Board state from R1's resolution decides the menu. */ <<if $chantBeat >= 3 and $nonviolentLock and not $vowBroken and $chantInterruptCount < 2>> <div class="d4-dlg">(The chant has almost landed. The air over the water has gone wrong — thick, waiting. You are out of clean ways to stop this.)</div> <<else>> <div class="d4-dlg">(The formation shifts. The chant grinds on, low and steady.)</div> <</if>> <<dockmenu "R2" "victims">>
<<dockstage>> <<soctrack "scene_enter" "Dock_R3">> <<music "Black Swan" "BTS" "https://www.youtube.com/watch?v=0lapF4DQPKQ" "">> <<if $chantBeat >= 3 and $nonviolentLock and not $vowBroken and $chantInterruptCount < 2>> <div class="d4-dlg"><span class="d4-who --narrator">Chanter:</span> (the sound climbs, almost whole now, one breath from finished)</div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (hand white-knuckle on her hilt) "...I'm running out of gentle."</div> <<else>> <div class="d4-dlg"><span class="d4-who --narrator">Chanter:</span> (still standing, still chanting, but the sound has gone ragged, lost its shape, like a man working a job his hands have forgotten)</div> <</if>> <<dockmenu "R3" "victims">> /* ───── R1 OUTCOMES ────────────────────────────────────────────────────── */
<<dockstage>> <<dockresolve "aggressive" "target" "chanter">> <<set $R1_struckChanter = true>> <<if $nonviolentLock and not $vowBroken>> <<dockbreakvow>> /* Off-ladder: taking aggressive on the vow IS the break. Handled as a lethal strike; the vow-break fallout is carried at the terminal, not re-narrated every round. */ <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (the blade goes in before she's decided it has)</div> <div class="d4-dlg">(The chant breaks on a wet sound. You told yourself no kill. You're past that now.)</div> <<journalentry "broke it" "i said no kill. then the spell was almost done and i put my blade through the one chanting anyway. it worked. i don't feel like it worked." "[REL] dock · vow broken · aggressive">> <<else>> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (low, to herself) "She sees it."</div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (blade opens the chanter's arm)</div> <div class="d4-dlg">(The chanter staggers, the chant stutters, resumes, blood on the boards.)</div> <div class="d4-dlg"><span class="d4-who --captain">Captain:</span> "Take her."</div> <div class="d4-dlg">(The dockworkers move on Fang.)</div> <</if>> <<advance "Press it" "Demo4_Dock_R2">>
<<dockstage>> <<dockresolve "tactical" "splitFormation" "true">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (reads the ground before the men)</div> <div class="d4-dlg">(You kick the crate-stack into the gap. Boxes tumble between the chanter and the one on his left, and the formation has to reshape around them. Nobody bleeds. The geometry just changed.)</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (low, approving) "She uses the room."</div> <<advance "Keep working it" "Demo4_Dock_R2">>
<<dockstage>> <<dockresolve "trickster">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> "Manus motoria."</div> <div class="d4-dlg">(A drying net lifts off its post and drops over the nearer worker. He goes down tangled, thrashing, out of the fight and unhurt.)</div> /* [REUSED] Marcus "She fishes." — beloved beat, kept verbatim. */ <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (delighted, low) "She fishes."</div> <<advance "Keep going" "Demo4_Dock_R2">>
<<dockstage>> <<dockresolve "negotiation">> /* [REUSED] the captain-question beat, repurposed as the negotiation posture. */ <div class="d4-dlg"><span class="d4-who --captain">Captain:</span> (silence)</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (sword lowered) "Captain, I'll ask again. What are you guarding?"</div> <div class="d4-dlg"><span class="d4-who --captain">Captain:</span> (no answer; his jaw works, but the chant behind him doesn't stop)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (low, watching) "She speaks to the captain. Not the chanter."</div> <<advance "He hasn't answered yet" "Demo4_Dock_R2">> /* ───── R2 OUTCOMES ────────────────────────────────────────────────────── */
<<dockstage>> <<dockresolve "aggressive" "target" "chanter">> <<set $R1_struckChanter = true>> <<if $nonviolentLock and not $vowBroken>> <<dockbreakvow>> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (crosses the gap and ends it with the edge)</div> <div class="d4-dlg">(The chant stops the only way you had left. No kill was the plan. The plan's on the boards.)</div> <<journalentry "broke it" "pressed the chanter with steel. the vow's gone. it stopped him. that's the only clean thing about it." "[REL] dock · vow broken · aggressive">> <<else>> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (drives the chanter back off his rhythm)</div> <div class="d4-dlg">(The chant lurches, loses a whole line, scrambles to find it again.)</div> <</if>> <<advance "Close it out" "Demo4_Dock_R3">>
<<dockstage>> <<dockresolve "tactical" "splitFormation" "true" "disrupt" "true">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (drives a wedge between the chanter and his cover)</div> <div class="d4-dlg">(You spill the fish-catch across the wet boards and the guards' footing goes to nothing. The chanter's alone in the middle of his own formation now, exposed, the chant thinning without a wall around it.)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet) "She took the fight apart without a body."</div> <<advance "Close it out" "Demo4_Dock_R3">>
<<dockstage>> <<dockresolve "trickster">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> "Manus motoria." (the mooring rope, not a man)</div> <div class="d4-dlg">(The heavy coil snaps up off the bollard and whips taut across two sets of shins. They go down in a heap, roped, swearing, whole.)</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (a bark of a laugh) "She fights the dock. The dock wins."</div> <<advance "Close it out" "Demo4_Dock_R3">>
<<dockstage>> <<dockresolve "negotiation">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (blade still lowered) "It doesn't have to end with them, Captain. Whatever you're owed, this isn't it."</div> <div class="d4-dlg"><span class="d4-who --captain">Captain:</span> (his mouth opens; the chant behind him stumbles as his focus breaks)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (very low) "He's listening. That's more than they usually give."</div> <<advance "Almost" "Demo4_Dock_R3">> /* ───── R3 OUTCOMES ────────────────────────────────────────────────────── */
<<dockstage>> <<dockresolve "aggressive" "target" "chanter">> <<set $R1_struckChanter = true>> <<if $nonviolentLock and not $vowBroken>><<dockbreakvow>><</if>> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (ends the chant the fastest way there is)</div> <div class="d4-dlg">(The sound cuts off. Silence, and blood, and the harbor going quiet around it.)</div> <<advance "The chant stops" "Demo4_Dock_Victory">>
<<dockstage>> <<dockresolve "tactical" "disrupt" "true">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (doesn't strike; holds the break she already made)</div> <div class="d4-dlg">(You don't give the chant a target to close around. It gropes for the shape you tore out of it, finds nothing, and comes apart on its own — a man's voice losing a song it never really knew.)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (watching the chanter fold) "She let it fail. She didn't make it fail. There's a difference, and it costs more."</div> <<advance "The chant stops" "Demo4_Dock_Victory">>
<<dockstage>> <<dockresolve "trickster">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> "Manus motoria." (one more time, the last of them)</div> <div class="d4-dlg">(The final worker goes down under something that shouldn't have been a weapon a breath ago. The chant has no one left to guard it.)</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (softly) "She never drew blood. Not once."</div> <<advance "The chant stops" "Demo4_Dock_Victory">>
<<dockstage>> <<dockresolve "negotiation">> /* [REUSED/REBUILT] the walk-through emotional peak, repointed as negotiation's terminal — she refuses the fight's premise entirely and the captain breaks. */ <div class="d4-dlg"><span class="d4-who --captain">Captain:</span> (his blade half-rises, then doesn't commit)</div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (sword down, open, no counter waiting) "It's over. Call them off. Nobody here has to be what he made them."</div> <div class="d4-dlg">(Something goes out of the captain's shoulders. He says a word you don't know, and the chant stops — not broken, just released.)</div> <<journalentry "talked him down" "didn't fight him in the end. asked him what he was guarding until he heard himself not answer, and then it was just a tired man on a dock. he called it off. still don't know what was owed. neither does he, i think." "[REL] dock · R3 · negotiate">> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (very quiet) "She talked the fight out of him."</div> <<advance "The chant stops" "Demo4_Dock_Victory">> /* ───── R3 LETHAL CEILING — A/B (vow held, chant one beat from landing) ──── */
<<dockstage>> /* B: hold the vow, eat the loss. The chant lands → Phase B (the horror emerges). This is NOT a fail-screen — it's the objective failing, resolved as a relationship-gated beat: she held her hands clean and the world paid, and the party is what stands between her and the consequence. */ <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (lowers the blade the rest of the way) "No. Not like that. Not even now."</div> <div class="d4-dlg">(You hold. The chant finishes. The air over the water tears, and something starts to come through — and Lawrence and Fang are already moving, putting themselves between it and you.)</div> <<journalentry "held it" "the spell was going to land and the only way to stop it was to kill the one chanting. i didn't. it landed. i don't know yet if that was brave or stupid. what i know is the second it went wrong, nobody in this party was anywhere but in front of me." "[REL] dock · vow held · cost">> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (stepping past her, sword up) "You held. Good. Now stand behind me."</div> <<chatpush "clare" "now" "she didn't break. even losing, she didn't break.">> <<chatpush "clare" "now" "that's the whole thing, isn't it">> <<advance "Brace" "Demo4_Dock_PhaseB_Emergence">>
<<dockstage>> <<dockresolve "aggressive" "target" "chanter">> <<dockbreakvow>> <<set $R1_struckChanter = true>> /* A: break the vow, win, carry it. She kills to stop the chant; it works; the fallout is real and it's relational, not mechanical. */ <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (crosses the distance and ends the chanter, one clean strike, because there was no other way left that was fast enough)</div> <div class="d4-dlg">(The chant stops. The air settles. You won. Your hands aren't clean and you knew they wouldn't be when you moved.)</div> <<journalentry "broke it to win" "it was going to land. i'd said no kill and i broke it, because i wasn't willing to let the harbor pay for my vow. i'd do it again and i'd hate it again. that's the honest version." "[REL] dock · vow broken · chosen">> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet, not unkind) "You chose. That's the part that's yours to carry. I won't take it from you by pretending it was nothing."</div> <<advance "The chant stops" "Demo4_Dock_Victory">>
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> /* Stakes callout: a scene overlay landing AFTER the captain confession, surfacing the tactical reality (the summoning continues) as game-state over the scene, not narrator editorializing. Guarded to the speaks branch so the walks/other branches are unaffected. */ <<if $captainR3Response === "speaks">><<setoverlay "<p>Whatever's being summoned is still coming. The captain's answer wasn't the one that would stop it.</p>">><</if>> /* v2.10.44 (27 May 2026, updated for foreshadowing pass): The horror sprite has been visible at the dock's edge since R1 (at bottom -3%), escalating across rounds via <<moveactor>> calls in the combat passages (R1 outcomes animate to 0%, R2 outcomes animate to 3%). At Phase B entry, horror inherits from R3 at bottom 3% (partial visibility, recognizable as the creature). The Phase B animation now rises horror from 3% to 8% (full emergence). Size canon: ~9% width (matches dockworker scale per cosmology canon — most of the creature is bound under the water; only what reaches up is visible). Horizontal position: left 25%, occluding the right edge of the roster pane (per author screenshot 27 May, second pass — --front z-index handles the intentional roster overlap). */ <<setactors '{"id":"mutterer","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/38bfffe9-0d32-4fed-bfce-610f477ad368/Dockworker_Mutterer.png?content-type=image%2Fpng","left":"46%","bottom":"30%","width":"8.5%","pose":"ready"}' '{"id":"horror","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/45553427-324f-4cc2-8a09-555f635d6e7c/Eldritch_horror_Dock_Combat.png?content-type=image%2Fpng","left":"2%","bottom":"11%","width":"26%","front":true,"pose":"ready"}' >> /* v2.10.44 (27 May 2026): conditional survivor-cast. The mutterer (chant anchor) and horror are always present at Phase B. The captain, signal, and muscle are added back ONLY if they survived R1/R2/R3 — Phase B is reachable with various casts depending on the player's path, and the setscene-no-longer-clears-actors fix (Option B) means we rebuild the surviving dock cast explicitly here rather than inheriting a possibly stale array. Flags: $captainAlive, $signalAlive, $muscleAlive. */ <<if $captainAlive>> <<addactor '{"id":"captain","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/0dc75f98-df9b-43cf-92ef-aee1218692ac/Dockworker_Captain.png?content-type=image%2Fpng","left":"50%","bottom":"55%","width":"5%","pose":"ready"}'>> <</if>> <<if $signalAlive>> <<addactor '{"id":"signal","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/e336e34a-360f-4a79-81c6-ccd4c4b42657/Dockworker_Signal.png?content-type=image%2Fpng","left":"38%","bottom":"33%","width":"8.5%","pose":"ready"}'>> <</if>> <<if $muscleAlive>> <<addactor '{"id":"muscle","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8ff7ae45-c3a2-441d-84b7-5295c0f6a8f9/Dockworking_Muscle.png?content-type=image%2Fpng","left":"54%","bottom":"33%","width":"10%","pose":"ready"}'>> <</if>> <<soctrack "scene_enter" "Dock_PhaseB_Emergence">> <<artprompt "Dock-phaseB-emergence" "Wide shot. Evening turned to dark. The dock at the jetty's edge. The water below the jetty is roiling, dark in a way water shouldn't be. A massive shape is partially visible at the waterline — implied silhouette, kaiju scale, octopus-limbs reaching up out of the water onto the jetty boards. Most of the creature is submerged; only what reaches up is visible. A black-thread-and-mist tether is visible between the mutterer (on the dock, his arms out, his eyes empty) and the water. The horror's emergence is partial — the binding has degraded here but not fully broken. Lawrence is between Fortune and the water, his spathē in his hand. Fang's blade is drawn. Marcus is the 800-lb grizzly bear (per §3.9), advancing toward the mutterer. Style: cosmic horror cinematic, the binding wounded but holding, what reaches up only suggested. Aspect 16:9." true>> <<soundprompt "ambient" "The chant's last beat resolves into something else — a frequency lower than human voice, more felt than heard. The water at the jetty roils. Bootfalls on the dock as the party moves. Lawrence's spathē clearing its sheath in a single fluid motion.">> /* v2.10.44 (27 May 2026): Music continuity — Black Swan (BTS) has been playing since R2 entry and CONTINUES through Phase B. Per author 27 May: canon updated to extend Black Swan through Phase B (the cosmological emergence beat is part of the same combat sequence in the new passage-tree architecture; the track was canon-named for the dock combat as a whole, and Phase B is the dock combat's climax). The track's structural arc maps onto the encounter: orchestral hook has been carrying through R2/R3; the emergence at Phase B is where the track's Vanquish-Death anchor lands hardest; the track's planned pre-Aftermath cut now occurs at Phase B Resolution (mutterer death + held silence). No new cue here — Black Swan is already in the air. No <<music>> call fires at Phase B Emergence entry — the track carries continuously. The soundprompt below describes what the player hears at this beat with the track still playing. */ <<soundprompt "music-cue" "Black Swan continues from R2. The orchestral hook reaches its highest weight as the chant completes and the horror's tether becomes visible. The track carries through Phase B unbroken (v2.11.05: the former cut-to-silence at Resolution is removed — the track now carries its own ending).">> <<shake "hard">> <div class="d4-prose"><p>The chant resolves on its final beat. The chanter's mouth is open. His eyes have gone empty.</p></div> /* v2.11.05 (16 Jun): horror-description prose CUT here. It read "The thing at the jetty's edge rises further. The limbs on the boards are not two now, six, or eight... A black thread that is not a thread runs from the chanter's chest to the water. The chant, made into a hand." Every beat it carried is now on the visual surface: the Dock-phaseB-emergence artprompt (kaiju limbs on the boards + the black-thread tether) and the <<moveactor "horror">> rise animation below literally enact "rises further." Cutting per author — image + animation working means the paragraph was describing what the player can already see. (If the uncountable-limbs wrongness ever needs reinstating as the one thing art can't do, it lived in the second sentence — restore that line alone, not the staging around it.) */ /* Animate the horror up from its R3-inherited partial-emergence position to full emergence. The horror was already visible from R1 onward (the foreshadowing pattern). This is the moment it RISES HIGHER and reveals more of its shape — not the moment it appears. 1500ms ease-out matches the spec's emergence pacing. Per <<moveactor>> v0.3 docs: fires via setTimeout(0) so the rise begins after the passage has painted and the player has seen the opening prose. */ <<moveactor "horror" "3%" "13%" 1500 "ease-out">> <<chemistrybeat "dock_PhaseB_emergence" "cosmological_threshold" "The binding has failed in this specific place tonight. The horror is reaching.">> /* v2.10.44 (27 May 2026) → v2.11.05 (16 Jun): Phase B agency design (Option C). Lawrence is too far gone to direct — he no longer delivers a tactical brief (the old version pre-assigned every role, which stole Fortune's agency). He just GOES. The break is shown as BEHAVIOR, not exposition — and as of v2.11.05 it's carried on the SPEAKER SURFACE (Lawrence/Fang/Marcus dialogue + stage directions below), not narrator prose, to match the B5 "show, don't narrate" register. The standalone "Not this one." line was absorbed into Lawrence's beat so the label isn't echoed twice. The "why" (the horror is the reachable symptom of the war Lawrence has been losing — Water bound ~50 years ago can no longer keep the deep's horrors from land, so each one that reaches the boards is his failure made flesh; he can't win the war tonight but he can put down this piece of it) is NOT spoken in-scene — it's carried by the guild chatter below, where Ishani learns it from Clare/Jeff while Song Min-jae goes terse and locked-in. ⚠ FALSE GREEN FLAG — DO NOT SOFTEN (Canon Ledger L-10/L-11): the load- bearing tell is that MJ ECHOES LAWRENCE. Lawrence's second beat is "Not this time."; MJ's chat line is "I'm getting it this time." — MJ picks up Lawrence's words and makes them his own, reinforcing HIS desire to kill the thing. That is not solidarity flavor; it's the hero-overtake. It reads hero-coded on first pass (protective competence, attractive) and curdles on reflection: MJ is taking the heroic act over UNILATERALLY, centering his own redemption-through-heroism, NOT reading the heroine. The verbatim echo ("this time") is the manufactured-consent pattern in miniature — the same wound as the B6 charm false-flag, different flavor: the man deciding FOR the scene, for Fortune, without asking. It must stay quietly wrong — legible as a tell on a careful read or replay, never game-flagged. Do NOT weaken the echo (it's the mechanism), do not make MJ more overtly villainous (forecloses the redemption fork, L-10), and do not soften it into clean heroism (removes the plant). The subtlety IS the design. */ <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (His spathē is already out.) "Not this one." (He darts past you to the monster.) "Not this time."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (sword out, following Lawrence)</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (leaps towards the chanter)</div> <<chatpush "jeff" "now" "minjae hates these things. won't let one go.">> <<chatpush "clare" "now" "yeah, he takes these personally.">> <<chatpush "minjae" "now" "I'm getting it this time.">> <<guildreply '{"icon":"❓","text":"what is that thing to him?","stat":"ishaniMinjaeBond","delta":1,"momentId":"PhaseB_lawrence_what","replyTo":"guild","journal":{"title":"he takes these personally","body":"lawrence broke his own rule and went for the thing in the water. the table says he hates these things, won\u2019t let one go, takes it personally. min-jae said he\u2019s getting it this time. i asked what it was to him.","tag":"[REL] dock · phaseB · lawrence-what"}}' '{"icon":"🤝","text":"let him have this one.","stat":"ishaniMinjaeBond","delta":1,"momentId":"PhaseB_lawrence_lethim","replyTo":"guild","journal":{"title":"let him have it","body":"lawrence went for the thing in the water. the table told me he hates these things and takes them personally. i didn\u2019t ask why. i just gave him the room.","tag":"[REL] dock · phaseB · lawrence-lethim"}}' '{"icon":"⚔️","text":"hold position","defer":true,"momentId":"PhaseB_lawrence_focus","replyTo":"guild","journal":{"title":"eyes on the water","body":"the table was talking about lawrence. i had my eyes on the water. that\u2019s where the thing was.","tag":"[REL] dock · phaseB · lawrence-focus"}}' >> <div class="d4-choices"> <<chasechoice "aggressive" "commit" "Commit. Move with them. You and Marcus take the chanter." "Demo4_Dock_PhaseB_Commit" "" "" "" "" "" "" "" "nonviolentLock" "minjaeTrust" -8 "nonviolentLock" "hideWhenSet">> <<chasechoice "negotiation" "refuse the premise" "Ask. Out loud: 'What do you need from me?'" "Demo4_Dock_PhaseB_Ask">> <<chasechoice "tactical" "mastery" "Focus on the others." "Demo4_Dock_PhaseB_BackOff">> </div> /* ───── Phase B — Commit ────────────────────────────────────────────────── */
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Dock_PhaseB_Commit">> /* Cost depends on starting VIT. If already critical, lower additional cost. */ <<if $fortuneVIT <= 30>> <<set $fortuneVIT -= 15>> <<else>> <<set $fortuneVIT -= 25>> <</if>> <<set $partyBond = ($partyBond || 0) + 3>> <<consentmoment "Dock_PhaseB_commit" "" 0 "Stayed in the fight. Pinned the chanter with Marcus. Lawrence cut the tether." '{"offered":["commit","ask","back off"],"chosen":"commit","silenceVariant":false,"replayVisible":true}'>> <div class="d4-prose"><p>You go in with Marcus. The bear-bulk of him is over the chanter; you pin the man's other side. He does not struggle. His eyes are not there. Lawrence's spathē finds the tether and Fang calls a position-correction half a beat before Lawrence needs it, the cut lands clean.</p></div> <div class="d4-prose"><p>The tether snaps. The cosmological force of the snap goes through every one of you who was touching the man. You feel it land somewhere in your chest, somewhere lower than your chest, somewhere that has not been touched before.</p></div> /* v2.10.47 (31 May 2026): journal entry CUT per author direction — PhaseB-commit beat is overkill, leaned transcript. Stat changes ($partyBond +=3, consentmoment) live in separate macros above and are UNTOUCHED. Re-add in playtest if the journal feels too quiet on this path. */ <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet, after) "She did not stop."</div> <<advance "Hold the silence" "Demo4_Dock_PhaseB_Resolution">> /* ───── Phase B — Ask for help ──────────────────────────────────────────── */
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Dock_PhaseB_Ask">> <<set $lawrenceWill = ($lawrenceWill || 0) + 5>> <<set $fangTrust = ($fangTrust || 0) + 3>> /* v2.11.05 (17 Jun): music now CONTINUES through this beat (author direction 17 Jun — Option A). Previously Black Swan cut to silence here ("cuts before Aftermath"); that held-silence beat is removed. The conditional dock track (Beat-Boxer aggressive / Black Swan otherwise) carries through unbroken. Canonical position: after scene-setup, before content. */ <<soundprompt "music-cue" "The dock track continues through the resolution — no cut. The track that carried the fight carries its ending too.">> <<if $R1_struckChanter>><<music "Beat-Boxer" "NEXZ · continues" "https://www.youtube.com/watch?v=d4tHKtG9xFo" "">><<else>><<music "Black Swan" "BTS · continues" "https://www.youtube.com/watch?v=0lapF4DQPKQ" "">><</if>> <<consentmoment "Dock_PhaseB_ask" "lawrenceWill" 0 "Asked Lawrence where I was needed. Took the flank he gave me. Useful, not relieved." '{"offered":["commit","ask","back off"],"chosen":"ask for direction","silenceVariant":false,"replayVisible":true}'>> /* v2.11.05 (16 Jun): Ask path fully dramatized + made self-contained (bypasses the shared Resolution passage to avoid a double "walk to the sea cave" step). Beats moved onto the speaker surface. Fortune asked Lawrence (the de facto leader, charm landing) — she experiences it as her own call; on reflection it's the charm steering her toward him (false-green-flag, MJ-plant family). Lawrence is fixated on the tether (the gap his fixation leaves is canon, cf. BackOff 4454); that gap is Fortune's flank — her supporting role, "useful, not relieved." Undead reconciliation: the chanter + workers are Death-touched; the tether-cut breaks the chant and they ash (not "die"). Fortune reads it as a death she can't quite name (comparison-library: not enspelled, not drunk, not half-killed). $D4_firstKill NOT set here — the only real kill is the living captain (R3_EndCaptain). */ <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (already on the tether, not looking at you) "My flank. Keep the monster in front of you and the men off my back."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (slides into the gap at his side, blade up, between Lawrence and the still-standing dockworkers)</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (going for the monster's arms, one comes off)</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (claws the dockworker still on his feet, knocking him down)</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (blocks the monster)</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (slices another arm off the monster)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (drives the spathē into the tether, sawing, the monster's arm swiping at his blind side)</div> <<fadeoutactors 1500 "mutterer" "signal" "muscle" "captain">> <div class="d4-prose"><p>The tether between monster and chanter parts. A blast of cold slams into you, pushing you back. The chanter crumbles to ash, as do the others.</p></div> <div class="d4-prose"><p>The monster at the dock's edge withdraws, limb by limb, slipping back into water that is no longer roiling.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet, after) "You held. Good."</div> <<journalentry "first death" "first one down tonight. the chanter. except he didn't die like a man dies, he just stopped, then came apart. ash, not a body. i'm calling it a death because i don't have a better word for it. the water's quiet now. the thing under it isn't." "[PLOT] dock · phase-B · first-death">> <<advance "Catch your breath" "Demo4_Dock_Victory">> /* ───── Phase B — Back off cleanly ──────────────────────────────────────── */
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Dock_PhaseB_BackOff">> <<set $lawrenceWill = ($lawrenceWill || 0) + 5>> <<set $fangTrust = ($fangTrust || 0) + 5>> <<consentmoment "Dock_PhaseB_backoff" "fangTrust" 0 "Stepped out of the line. No words. Let them finish it." '{"offered":["commit","ask","back off"],"chosen":"back off cleanly","silenceVariant":false,"replayVisible":true}'>> <div class="d4-prose"><p>You step back. You say nothing. You move to the dock's edge, out of the line, far enough that whatever the cut releases will not reach you.</p></div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (sharp) "Marcus, the chanter, now. Stay off Lawrence's right."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Lawrence. Left. LEFT."</div> <!-- v2.11.06 (17 Jun 2026): rewritten from omniscient 3rd-person (narrated Fang's internal read + Lawrence's interiority + tactical knowledge Fortune-at-the-dock's-edge couldn't have) into Fortune's observed POV. She watches from outside the line; the guild chat below carries the tactical explanation. Keeps the beat (team finishes what she stepped out of) without claiming knowledge she doesn't have. --> <div class="d4-prose"><p>Lawrence won’t look away from the tether. Whatever’s in the water has all of him. Fang moves into the space he’s leaving, between him and Marcus, covering the side he’s stopped watching. His first cut goes wide. Fang says something sharp and low; the second cut lands. The tether snaps.</p></div> <<chatpush "jeff" "now" "and he's gone. minjae doesn't even see the rest of us right now lol">> <<chatpush "clare" "now" "yeah he tunnel-visions on these. every time one crawls up, that's water still bound, that's the whole war in front of him. he has to put it down.">> <<chatpush "clare" "now" "i've got fang on him. keeping him clean. you're good to sit it out, ishani.">> <<chatpush "minjae" "now" "got it. tether's down.">> /* v2.10.47 (31 May 2026): journal entry CUT per author direction — PhaseB-backoff beat overkill/transcript. No stat attached. Re-add if playtest wants it. */ <!-- v2.11.06 (17 Jun 2026): cut Lawrence "(quiet, after) 'She knew.'" — purple/literary callback to the charm-landing motif, not in the game's register, per author. Beat now runs tether-snap -> advance. --> <<advance "Hold the silence" "Demo4_Dock_PhaseB_Resolution">> /* ───── Phase B — Resolution ───────────────────────────────────────────── The horror retreats. The mutterer dies. Three-second held silence. Lawrence's line per Fortune's Phase B choice. Party turns toward sea cave. Routes to Demo4_Dock_Victory (which I'll update to be the final beat before sea cave entry). */
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Dock_PhaseB_Resolution">> <<fadeoutactors 1500 "mutterer" "signal" "muscle" "captain">> /* v2.10.44 (27 May 2026): [superseded 17 Jun] Black Swan formerly cut here ("cuts before Aftermath"). v2.11.05 (17 Jun, author Option A): music now CONTINUES through the resolution — the held-silence beat is removed; the conditional dock track carries unbroken. This passage serves Commit + BackOff only (Ask bypasses it). Undead reconciliation: the chanter + workers are Death-touched and ash at the tether-cut; Fortune reads it as a death she can't name. Captain fades here too IF still present (no-op if killed at R3). */ <<soundprompt "music-cue" "The dock track continues through the resolution — no cut. The track that carried the fight carries its ending too.">> <<if $R1_struckChanter>><<music "Beat-Boxer" "NEXZ · continues" "https://www.youtube.com/watch?v=d4tHKtG9xFo" "">><<else>><<music "Black Swan" "BTS · continues" "https://www.youtube.com/watch?v=0lapF4DQPKQ" "">><</if>> <div class="d4-prose"><p>The monster at the dock's edge withdraws, limb by limb, slipping back into water that is no longer roiling. The water settles. The chanter folds to the boards and comes apart, ash, not a body, the others with him. You have seen men enspelled, men drunk past sense, men halfway dead from a fight that hasn't ended. He was none of those. He went down like something switched off. You don't have a word for it. You file it as a death because that is the closest word you own.</p></div> <div class="d4-prose"><p>The dock goes quiet.</p></div> <<journalentry "first death" "first one down tonight. the chanter. except he didn't die like a man dies, he just stopped, then came apart. ash, not a body. i'm calling it a death because i don't have a better word for it. the water's quiet now. the thing under it isn't." "[PLOT] dock · phase-B · first-death">> <<advance "Catch your breath" "Demo4_Dock_Victory">>
<<setchat "bubble">> <<setheader "SMYRNA · FURTHEST DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/ecf236d2-4da6-408a-9ba1-393e043e3586/Jetty.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "Dock_Victory">> /* ─── DOCK ENCOUNTER OUTCOME (v2.10.49) ──────────────────────────────────── First adopter of the $encounterOutcomes ledger. Computes the dock's {action, actors} ONCE here at Victory entry — before any art/prose branch and before the :passageend branchpoint save snapshots State.variables, so the record rides into the save for free. `result` is derived inside the setter from `actors`. The actor-disposition matrix below is taken verbatim from this passage's own prose branches (the if/elseif ladder on $trickster_stepback etc. further down) and the canonical _captainDead definition. Priority order MUST match that ladder. The chanter ashes on every path (Death-touched); on trickster all four crumble to ash). Captain has four end-states: ash | walked | dead | alive. IMPORTANT — keep this in sync with the prose ladder below. If a branch's captain/chanter fate changes there, change it here. This is the ONE place the dock outcome is derived; everything downstream reads the record. */ <<silently>> <<if $trickster_stepback>> /* All four crumble to ash; canon register is "nobody died" → result clean. */ <<set _d4_action = "trickster">> <<set _d4_actors = { captain: "ash", chanter: "ash" }>> <<elseif $R3_walkThrough && $captainR3Response is "lowers">> <<set _d4_action = "walked_through">> <<set _d4_actors = { captain: "walked", chanter: "ash" }>> <<elseif $R3_walkThrough && $captainR3Response is "speaks">> <<set _d4_action = "walked_through">> <<set _d4_actors = { captain: "walked", chanter: "ash" }>> <<elseif $R3_walkThrough && $captainR3Response is "walks">> <<set _d4_action = "walked_through">> <<set _d4_actors = { captain: "walked", chanter: "ash" }>> <<elseif $R3_walkThrough && $captainR3Response is "strikes">> <<set _d4_action = "walked_through">> <<set _d4_actors = { captain: "dead", chanter: "ash" }>> <<elseif $R3_killedCaptain>> <<set _d4_action = "killed_captain">> <<set _d4_actors = { captain: "dead", chanter: "ash" }>> <<elseif $R3_standDown>> <<set _d4_action = "stood_down">> <<set _d4_actors = { captain: "alive", chanter: "ash" }>> <<elseif $R2_stepBack>> <<set _d4_action = "stepped_back">> <<set _d4_actors = { captain: "dead", chanter: "ash" }>> <<else>> /* R3 break-chant — chanter (Death-touched) put down by Fortune and ashed; captain stands down alive. Not a kill: the chanter was already dead. */ <<set _d4_action = "end_chant">> <<set _d4_actors = { captain: "alive", chanter: "ash" }>> <</if>> <<set _d4_rec = window._socSetEncounterOutcome("dock", _d4_action, _d4_actors)>> <</silently>> /* v2.10.44 (27 May 2026): Black Swan at top per author canon — Victory continues the combat track. No audio-cue timing ("cuts"/"silence") since no audio plays; the box simply labels Black Swan as the track. */ <<if $R1_struckChanter>><<music "Beat-Boxer" "NEXZ" "https://www.youtube.com/watch?v=d4tHKtG9xFo" "">><<else>><<music "Black Swan" "BTS" "https://www.youtube.com/watch?v=0lapF4DQPKQ" "">><</if>> /* v2.10.44 (27 May 2026): Victory rewrite for new dock combat architecture. The encounter can resolve to multiple end-states: 1. R3 End the chant — mutterer dead by Fortune, captain alive 2. R3 Walk-Lowers — mutterer dead by Lawrence-as-mercy, captain alive 3. Phase B Resolution paths — mutterer dead by tether-sever; captain state varies (alive/dead/walked-away) The prose branches accordingly. The closing beat is universal: the party turns toward the sea cave. The demo ends on the button-press to enter the cave (which currently routes to End_Credits per scope). */ <<if $trickster_stepback>> <<artprompt "Dock-victory-after-ash" "Wide shot. The dock at the jetty's edge after the encounter. Late dusk turning to night. NO bodies on the boards — where four dockworkers stood there are only faint scatterings of grey ash on the planks, already starting to disperse in the harbour wind. Fang's blade is sheathed. Lawrence's spathē is in his hand at rest, but he is looking at the ash, not the water. Marcus is the 800-lb grizzly bear (per §3.9), close to Fortune. Fortune is at center, visibly spent — a thin line of blood from her nose, one hand braced on a piling, the cost of sustained casting written on her. The mood is eerie aftermath: a fight that ended without a single body, which is its own kind of wrong. The party's gaze is turning inland — toward where the sea cave waits. Style: aftermath cinematic, the cost of the night made visible. Aspect 16:9." true>> <<else>> <<artprompt "Dock-victory-after" "Wide shot. The dock at the jetty's edge after the encounter. Late dusk turning to night. Where the dockworkers stood there are only faint scatterings of grey ash on the planks (they were Death-touched — already dead — and came apart when the chant broke; NO worker bodies). IF the captain was killed at R3 ($R3_killedCaptain): his body — the one in the red coat — lies on the boards, the single real corpse of the night, because he was the only living man among them; otherwise no bodies at all. Fang's blade is sheathed. Lawrence's spathē is in his hand at rest. Marcus is the 800-lb grizzly bear (per §3.9). Fortune is at center, bloodied to a degree that depends on her Phase B choice. The mood is the after of something that cannot be unmade — ash where men stood, and at most one body that bled. The party's gaze is turning inland — toward where the sea cave waits. Style: aftermath cinematic, the cost of the night made visible. Aspect 16:9." true>> <</if>> <<soundprompt "ambient" "Aftermath dock ambient: water lapping (back to normal — the chant is over, the binding is wounded but holding), the wood-creak of the dock, the wolf-puppy in Fang's chest sling making one small sound — the work is finished by her metric. The harbor is breathing again.">> /* v2.10.44 (27 May 2026): Music transition handling per arrival path. Two arrival paths: 1. From R3_EndChant or R3_Walk_Lowers (no Phase B) → Black Swan was just playing; the cut + held silence beat fires HERE before White Night returns. 2. From PhaseB_Resolution → Black Swan already cut at Resolution, the held silence already happened there; Victory opens with White Night return cleanly. Conditional gates the silence-beat to no-Phase-B paths only. The "no Phase B" condition is: (clean R3 end-chant, no Phase B flags AND no Walk through it) OR (Walk through it path where captain lowered his blade — in that branch the mutterer is killed by Lawrence as mercy, no horror emerges). */ <<if $dockResolution>> /* v2.00.30 (08 Jul) — ENGINE-PATH CLOSINGS (Option 1). The dock rebuild routes all four R3 postures here but the legacy chain below keys on deleted permutation flags ($R3_walkThrough etc.), so every engine path fell through to the aggressive "opened the throat" prose — narrating a kill on the no-kill paths. These four branches read $dockResolution (stamped by <<dockresolve>>) and show the closing that matches what the player actually did. Legacy chain still runs for any path that didn't set $dockResolution (belt-and-suspenders). */ <div class="d4-prose"><p>Three seconds of held silence.</p></div> <<if $dockResolution === "aggressive">> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (You opened the chanter's throat. The chant cut out, and whatever it'd been holding up went with it.)</div> <div class="d4-prose"><p class="--narrator">He came apart. Ash on the boards. The thing in the water never finished rising. The captain held until the chant was gone, then stood his remaining men down. The dock's quiet.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet) "She went for the right one."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (dry) "You noticed."</div> <<elseif $dockResolution === "tactical">> <<fadeoutactors 2000 "mutterer" "signal" "muscle">> <div class="d4-prose"><p class="--narrator">You never landed the blow. You took the ground out from under the chant instead, and it failed for want of a shape to stand in. The chanter folds, then comes apart, dry, ash where he stood. The thing in the water never finished rising. The captain, seeing it fail, stands his men down.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet) "You let it fail. You didn't make it fail. That costs more, and it's worth more."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (a beat) "Cleaner than a blade. Harder, too."</div> <<elseif $dockResolution === "trickster">> <<fadeoutactors 2000 "mutterer" "captain" "signal" "muscle">> <<soundprompt "foley" "No blade-fall. The chant stops as the last of them is tangled out of it. Then a sound like dry sand poured from a hand, four times, soft, as what was holding them lets go. No cries. The harbor water, lapping, indifferent.">> <div class="d4-prose"><p class="--narrator">The chant breaks. One by one, the four men come apart, dry, quiet, ash where each stood. No bodies. No blood, not once.</p></div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (not moving) "...I didn't kill them. I didn't kill any of them."</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (gentle) "There was nothing left in them to kill. Hasn't been, for a long time."</div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> "Then did I do right by them? Or did I hold the door shut one beat too long?"</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> "You held the line, then you let them go. That was the kindest way through tonight." (quieter) "Sometimes not killing and ending it are the same thing. You'll see that again."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (low) "You never drew blood. That's the harder thing."</div> <<else>> /* negotiation */ <div class="d4-prose"><p class="--narrator">The captain's word does the work no blade did. The chant lets go, and the men with it, released rather than broken. What was holding them up was never theirs; when it goes, they go quiet. No ash tonight. Just tired men, and a captain who chose to stop.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (very quiet) "She talked the fight out of him. I have seen that done maybe twice in a thousand years."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (a beat) "You didn't need us at all."</div> <</if>> <<elseif (!$R3_walkThrough && !$R2_stepBack && !$R3_standDown && !$R3_killedCaptain && !$trickster_stepback) || ($R3_walkThrough && $captainR3Response === "lowers")>> <div class="d4-prose"><p>Three seconds of held silence.</p></div> <</if>> /* Branch on R3 outcome to set the mood and Marcus/Lawrence/Fang exchange. The variance is in WHAT they're naming, not in the shape of the scene. v2.00.30: this legacy chain now runs ONLY when $dockResolution is unset (guarded by the <<if>> above); engine paths are handled in the block above. */ <<if $dockResolution>> /* handled above; no-op here so the legacy chain doesn't double-render */ <<elseif $trickster_stepback>> /* v2.10.46 (29 May 2026): trickster clean path. The chant never completed — Fortune held the no-harm line and the team disabled the mutterer mid- syllable. With the chant severed, the working holding four Death-touched men in coherence stops. They do not die; they were already dead. They return to the ending that was always theirs. ALL FOUR crumble to ash and fade from the frame — captain included (no body, no leverage). The beat this path carries is not first-kill; it's Fortune's first contact with the truth that in this world ending can be the mercy and suspension the cruelty. Marcus — held past his own endpoint for 1,150 years, and a 150-year veteran of hunting the Death-touched — is the one who names it. */ <<fadeoutactors 2000 "mutterer" "captain" "signal" "muscle">> <<soundprompt "foley" "No blade-fall. The chant stops mid-syllable as the mutterer is held. Then a sound like dry sand poured out of a hand — four times, soft, almost gentle — as what was holding them lets go. No cries. The harbor water, lapping, indifferent.">> <div class="d4-prose"><p class="--narrator">The chant breaks. One by one, the four men come apart, dry, quiet, ash where each stood. No bodies.</p></div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (not moving) "...I didn't kill them. I didn't kill any of them."</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (gentle) "There was nothing left in them to kill. Hasn't been, for a long time."</div> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> "Then did I do right by them? Or did I hold the door shut one beat too long?"</div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> "You held the line, then you let them go. That was the kindest way through tonight." (quieter) "Sometimes not killing and ending it are the same thing. You'll see that again."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (low) "You trusted them to finish it. That's the harder thing."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (watching Fortune wipe blood from her lip) "And she paid for the asking. Look at her."</div> <<journalentry "four piles of ash" "i've killed plenty in this game. raiders, cultists, whatever. you swing, they drop, you move on. this wasn't that. there was nothing left in the dockworkers to kill. marcus said so and he'd know. when the chant broke they just came apart, dry and fast. four little piles of ash, then not even that.\n\ni asked marcus if i did right by them or held them one beat too long. he said the harm was done long before me. that ending them and not-harming them were the same thing here. that i'll meet it again. i don't know what to do with that.\n\nnobody died because of me tonight. that should feel like relief. it doesn't. i don't know what it feels like yet." "[REL] dock · trickster-clean-ash" "tonight">> <<elseif $R3_walkThrough && $captainR3Response === "lowers">> <div class="d4-prose"><p class="--narrator">The captain walks off the dock without looking back, his man with him. Lawrence puts the chant down at the source. The chanter folds, then comes apart, ash on the boards.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (low) "He chose. I chose for the chanter. Both were right."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet, to Fortune) "You bled for him. He saw it."</div> <<elseif $R3_walkThrough && $captainR3Response === "speaks">> <div class="d4-prose"><p class="--narrator">The captain told you what he could before the emergence. Constantinople. Three weeks. He didn't know what he was paying for.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (low) "The man who paid did not know what he was paying for. That is its own kind of failure."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "Someone in Constantinople knew."</div> <<elseif $R3_walkThrough && $captainR3Response === "walks">> <div class="d4-prose"><p class="--narrator">He walks off without looking back. Two notes whistled. His man follows. You'll see him again.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (low) "He is unfinished. He will be, the next time we cross him."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "I'll know him by the whistle. Two notes."</div> <<elseif $R3_walkThrough && $captainR3Response === "strikes">> <div class="d4-prose"><p class="--narrator">Lawrence said two words. <em>Not here.</em> The captain is down. The chant ran to its end, the thing in the water rose, and the party put it back down.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (after a long beat) "One hundred and fifty years. I have not said those words and meant them in a long time."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (does not speak)</div> <<elseif $R3_killedCaptain>> <div class="d4-prose"><p class="--narrator">The captain in the red coat is down. He bled; he was the only one who could. The chanter came apart with the tether, ash with the rest. The thing in the water rose, and the party put it back down.</p></div> <div class="d4-dlg"><span class="d4-who --marcus">Marcus:</span> (lowering his bulk to scent-check the body) "He came here to lose this fight. Had the chance to swing for me first, and didn't take it."</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> "Then someone sent him here to lose."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "The second message. The first was the war band."</div> <<elseif $R3_standDown>> <div class="d4-prose"><p class="--narrator">You stood down. Lawrence, Fang, and Marcus finished it, cut the tether, and the chanter came apart with it, ash on the boards. You watched.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (to Fortune, quiet) "Stepping back is mastery, not failure. Most people never learn."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "You'll fight beside me when it's your fight. Tonight wasn't."</div> <<elseif $R2_stepBack>> <div class="d4-prose"><p class="--narrator">You stepped back at R2. Lawrence entered, finished the captain and his line. The chant ran to its end, the thing in the water rose, and they handled it.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet) "The directive was mine to set. Yours to hand back. You did. That was a choice, not a failure."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (a beat) "Next time."</div> <<else>> /* R3 End the chant — the cleanest, most aggressive outcome. The chanter is Death-touched (already dead); Fortune doesn't kill him, she silences the chant at its source (opens his throat). With the chant gone, the thing it was holding up has nothing to stand on and comes apart to ash. Because the chant broke early, the emergence never completed; the captain (living) stood his remaining men down once the chant was gone. Fortune's action beat is in her own voice; the aftermath is omniscient-narrator register. */ <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (You opened the chanter's throat. The chant cut out, and whatever it'd been holding up went with it.)</div> <div class="d4-prose"><p class="--narrator">He came apart. Ash on the boards. The thing in the water never finished rising. The captain held until the chant was gone, then stood his remaining men down. The dock's quiet.</p></div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (quiet) "She went for the right one."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (dry) "You noticed."</div> <</if>> <div class="d4-dlg"><span class="d4-who --fortune">Fortune:</span> (crouches at the dock's edge, looking at water darker than water should be)</div> <div class="d4-dlg"><span class="d4-who --lawrence">Lawrence:</span> (to Fortune) "The cave. Tonight. We do not have until tomorrow."</div> /* ─── PATH-AWARE JOURNAL ENTRY: "the dock is quiet" (v2.10.45) ─────────── Proof-of-pattern entry for the desire-pick-as-coloring-filter design principle banked May 28 (TODO Active item 8). The desire-pick colors what Ishani notices. Same beat, different desires, different room. Layers (in order): 1. OPENING — what Ishani first notices, colored by $playerDesire. rules_make_sense forks further on captain survival per derived flag. 2. MIDDLE — relational layer (Fang's reveal or held silence). 3. COMBAT-PATH — moral weight, NOT tactical recap. Combat is one variable in the relational atmosphere, not the defining one. Binary for now (kill / no-kill); per author May 28, evolve to finer-grained handling post-Demo5 once player feedback informs it. 4. CLOSING — colored by $playerDesire again; what Ishani carries forward. matter_to_someone closing seeds the credits recap via "found my answer about the room." Voice: lowercase Ishani gamer-voice per Journal Entry Rubric v0.1. Replaces v2.10.44 WRITER-ROOM placeholder. */ <<silently>> <<set _captainDead = ($R3_killedCaptain || $R2_stepBack || ($R3_walkThrough && $captainR3Response === "strikes"))>> <<set _quiet = "">> /* v2.11.06 (17 Jun 2026): "the dock is quiet" + "Broke the chant" text tightened per author pass. Originals were partly inaccurate (combat recap) and didn't reflect that Ishani is an experienced player, not new to games. Openings, combat-path lines, and closings all revised — all branches now revised, including the matter_to_someone trickster opening. */ /* OPENING — desire-colored */ <<if $playerDesire is "matter_to_someone">> <<if $trickster_stepback>> <<set _quiet += "the dock is quiet. Fang's on my left, closer than she stood when we got here. Marcus stayed beside me while i caught my breath. i appreciated the quiet support.\n\n">> <<else>> <<set _quiet += "the dock is quiet. Fang's on my left, closer than she stood when we got here. Lawrence is staring at the captain like he knows him. marcus has our back.\n\n">> <</if>> <<elseif $playerDesire is "rules_make_sense">> <<if $trickster_stepback>> <<set _quiet += "the dock is quiet. where four men stood there's nothing, not bodies, ash, and then not even that. the rules here are not the rules i thought i was learning, i think.\n\n">> <<elseif _captainDead>> <<set _quiet += "the dock is quiet. the captain is down. as weird as it is, this combat makes sense.\n\n">> <<else>> <<set _quiet += "the dock is quiet. the captain understood how to lead his men.\n\n">> <</if>> <<elseif $playerDesire is "finish_something">> <<set _quiet += "the dock is quiet. we found monsters and undead on the dock and we survived.\n\n">> <<elseif $playerDesire is "carry">> <<set _quiet += "the dock is quiet. i had fun tonight, i could do this again with them.\n\n">> <<else>> <<set _quiet += "the dock is quiet. i want to learn why the war band is after lawrence and fang.\n\n">> <</if>> /* MIDDLE — relational layer (Fang's reveal or held silence). v2.11.05 (17 Jun): split into its OWN journal entry (was concatenated into _quiet, which made "the dock is quiet" a wall of text — three topics welded into one. Ishani wouldn't write that much in one go). The Fang thread is a distinct beat she's tracking, so it gets its own short, re-readable entry. Built here, emitted after the resolution entry below. */ <<set _fangThread = "">> <<if window._socWasAnswered("fang_stari_krov_story")>> <<set _fangThread = "Fang told me about the Stari Krov debt on the walk over. she didn't have to. i'm not sure she's ever told anyone else, exactly.">> <<elseif window._socWasDeflected("fang_stari_krov_story")>> <<set _fangThread = "asked Fang about the war band at tea. she didn't want to get into it. didn't push.">> <</if>> /* COMBAT-PATH layer — moral weight, binary for Demo4/5 (see TODO item 1) */ <<if $D4_firstKill || $R3_killedCaptain>> <<set _quiet += "killing undead is so weird. they just crumble to ash.\n\n">> <<elseif $trickster_stepback>> <<set _quiet += "marcus says there was nothing left in them to kill… i'm supposed to call their crumbling into ash a mercy. maybe.\n\n">> <<elseif $R3_walkThrough || $R3_standDown>> <<set _quiet += "i didn't have to kill anybody tonight. nobody complained. that was nice.\n\n">> <</if>> /* CLOSING — desire-colored; what Ishani carries forward */ <<if $playerDesire is "matter_to_someone">> <<set _quiet += "standing here with Fang, Marcus, and Lawrence, i think i found my answer about the guild.">> <<elseif $playerDesire is "rules_make_sense">> <<set _quiet += "that was satisfying.">> <<elseif $playerDesire is "finish_something">> <<set _quiet += "finishing the dock combat felt good.">> <<elseif $playerDesire is "carry">> <<set _quiet += "it's nice not to have to face team politics. Min-jae and jeff listen to clare.">> <<else>> <<set _quiet += "so far, i like this guild. they play fair.">> <</if>> <<journalentry "the dock is quiet" _quiet "[RESOLVE] dock · victory">> <<if _fangThread !== "">> <<journalentry "what fang holds on to" _fangThread "[REL] dock · fang-war-band-thread">> <</if>> <</silently>> <<advance "Walk to the sea cave" "Demo4_End_Credits">> /* ═══════════════════════════════════════════════════════════════════════════ END CREDITS — loader-style, IP statement, music index, replay ═══════════════════════════════════════════════════════════════════════════ */
<<script>> $('#ui-bar').hide(); /* Hide chat bubble/drawer/pane on credits screen */ $('.d4-chat-pane, .d4-chat-bubble, .d4-chat-drawer, .d4-chat-tooltip').remove(); /* v2.10.41 — A8 telemetry: session_complete. Fires when player reaches the credits screen — represents a clean completion (as opposed to session_abandon, which fires on unload without reaching credits). Marks _sessionEnded on the Playtest object so the beforeunload handler does NOT fire a redundant session_abandon on the credits-screen close. Includes full final-state stat snapshot for chemistry-curve analysis. */ (function() { var V = State.variables || {}; if (window.SOC_Playtest) window.SOC_Playtest._sessionEnded = true; if (window._socTrack) { window._socTrack('session_complete', { total_duration_ms: window.SOC_Playtest ? (Date.now() - window.SOC_Playtest.startedAt) : null, event_count: window.SOC_Playtest ? window.SOC_Playtest.eventCount : null, player_desire: V.playerDesire || '', avatar_name: V.avatarName || '', fang_trust: V.fangTrust || 0, ishani_clare_bond: V.ishaniClareBond || 0, minjae_trust: V.minjaeTrust || 0, minjae_vector: V.minjaeVector || '', lawrence_first_read: V.lawrenceFirstRead || '', moments_count: (V.momentsThatMattered || []).length, /* v2.10.45 telemetry extension for QA calibration analysis. Emits the actual momentIds (not just count) so survey responses can be correlated against specific atoms that fired. Author- defined labels, not user data — safe to send raw. Empty array if none fired. */ moment_ids: (V.momentsThatMattered || []) .map(function(m) { return m && m.id ? m.id : null; }) .filter(function(id) { return id !== null; }), /* v2.10.45: intent log summary, per-tag outcome states. Shape: { tag: { declared: bool, deflected: bool, answered: bool } } Lets QA see how each declared question resolved across paths without parsing the full intentLog metadata. */ intent_outcomes: (function() { var log = V.intentLog || {}; var out = {}; for (var tag in log) { if (!log.hasOwnProperty(tag)) continue; out[tag] = { declared: !!log[tag].declared, deflected: !!log[tag].deflected, answered: !!log[tag].answered }; } return out; })(), journal_count: (V.journalLog || []).length }); } /* Force-flush so credits-screen close doesn't lose the completion event. */ if (window.SOC_Playtest) window.SOC_Playtest.flush(false); /* Clear the save on completion (matches Demo 3 pattern). */ try { if (window._socClearProgress) window._socClearProgress(); } catch (e) {} })(); <</script>> /* ─── "DID I GET WHAT I CAME FOR" RECAP (v2.11.03) ─────────────────────── Per SOC_Intent_State_Architecture_v0_1.md §7. v2.11.03 (12 Jun 2026): atom prose updated for voice/register consistency. B1_warm: “Clare broke the game / she gave me space” → guild-vibe register matching journal entry “they don’t take things too seriously.” marcus_lute: intimacy register → curiosity/equipment register matching journal “why does a bear have a bow?”. B4 chip journal body: old mixed- case voice → lowercase Ishani voice. fang_ack_reciprocate unchanged (journal cut v2.10.47; consentmoment still fires; recap prose accurate). Fires unconditionally on End_Credits entry, but content depth varies by $playerDesire: - matter_to_someone: deep evaluation against 5 evidence atoms (Fang substantive reveal + 4 chip/passage moments). Curiosity- register closing line scaled to atom count. - other three desires: fallback line carrying the question forward Authored in Ishani's journal voice. The recap MUST point forward — each branch primes the replay loop at sentence level. */ <<silently>> <<set _recap = "session 0 was 3 weeks ago. i wrote in here: i picked the mortal to see if i could trust the guild. tonight, the question got tested.\n\n">> <<if $playerDesire is "matter_to_someone">> <<set _atoms = 0>> /* Atom 1: Fang substantive reveal at walk-to-dock */ <<if window._socWasAnswered("fang_stari_krov_story")>> <<set _recap += "Fang gave me the shape of why the war band is after her. she didn't have to. she said: \"old debt, hers to call, mine to answer.\" that's not what you tell strangers.\n\n">> <<set _atoms++>> <<elseif window._socWasDeflected("fang_stari_krov_story")>> <<set _recap += "asked about the war band. Fang held it. she has her reasons. i'm not entitled to her ledger on night one.\n\n">> <</if>> /* Atom 2: Clare's B1 check-in, warm response */ <<if window._socMomentFired("B1_warm")>> <<set _recap += "clare pinged mid-fight to check on me. i said i needed to focus. she left it alone. nobody made it weird. that's the kind of room i picked the mortal to see if i could find.\n\n">> <<set _atoms++>> <</if>> /* Atom 3: Jeff's gallows repair */ <<if window._socMomentFired("B4_chat_gallows_jeff_repair")>> <<set _recap += "Jeff caught his own joke when it landed wrong. he said sorry. he saw me. tells me what kind of table this is.\n\n">> <<set _atoms++>> <</if>> /* Atom 4: Fang post-chase ack, reciprocate variant */ <<if window._socMomentFired("fang_ack_reciprocate")>> <<set _recap += "Fang said i held. i told her she held with me. she nodded. she does not give that nod to people who have not earned it.\n\n">> <<set _atoms++>> <</if>> /* Atom 5: Marcus lute handoff (witnessed) */ <<if window._socMomentFired("marcus_lute_witnessed")>> <<set _recap += "marcus handed tiberius his lute, his bow, his quiver — everything — on the way out. still thinking about that bow. why does he carry it if he's not going to use it. he didn't hide that i was watching. something to ask jeff about later.\n\n">> <<set _atoms++>> <</if>> /* Closing assessment — curiosity register; each branch primes forward */ <<if _atoms gte 4>> <<set _recap += "answer: yes. tonight i mattered to people. and, i let myself. came back.">> <<elseif _atoms gte 2>> <<set _recap += "answer: maybe. some moments held. some didn't. i'm curious which choices opened the ones that opened, and which closed the ones that didn't.">> <<elseif _atoms is 1>> <<set _recap += "answer: not really. one moment held. i want to know if that was the room, or if that was me. coming back to find out.">> <<else>> <<set _recap += "answer: no. the night didn't open. did my choices match what i said i wanted? not sure. i'm going to come back and try the question again.">> <</if>> <<else>> /* v0.1 fallback for rules_make_sense, finish_something, carry. Deferred work item: spec these against their own evidence schemas in v0.2 / Demo5 authoring pass. */ <<set _recap += "the question i picked tonight isn't quite the one i can answer yet. some threads stay open. some carry forward. i'll come back and see what they become.">> <</if>> <<journalentry "did i get what i came for" _recap "[RESOLVE] session 0 · the answer" "now">> <</silently>> <div class="ld-star-wrap"> <svg width="100" height="100" viewBox="0 0 110 110" aria-hidden="true"> <defs> <radialGradient id="ld-rg-end" cx="50%" cy="50%" r="50%"> <stop offset="0%" stop-color="#c9a84c" stop-opacity=".25"/> <stop offset="100%" stop-color="#7c3aed" stop-opacity="0"/> </radialGradient> </defs> <circle cx="55" cy="55" r="52" fill="url(#ld-rg-end)" stroke="rgba(201,168,76,.25)" stroke-width="1"/> <circle cx="55" cy="55" r="38" fill="none" stroke="rgba(201,168,76,.18)" stroke-width="1" stroke-dasharray="3 4"/> <polygon points="55,18 62,40 87,40 68,54 75,76 55,62 35,76 42,54 23,40 48,40" fill="none" stroke="rgba(201,168,76,.7)" stroke-width="1.5" stroke-linejoin="round"/> <circle cx="55" cy="55" r="3.5" fill="#c9a84c" opacity=".9"/> </svg> </div> <div class="ld-title-h1">STONE OF<br>COMMITMENT</div> <div class="ld-title-h2">VANQUISH DEATH</div> <div class="ld-title-h2">DEMO</div> /* v2.11.05 (17 Jun): reordered — the Sea Cave narration is the game's actual ending, so it now comes FIRST, with the "Thank you for playing" gratitude line moved BELOW it (was above). Also recolored the narration to soft gold (--accent-amber, matching the Thank-you) for visual consistency — the two served slightly different purposes but the violet/gold split read as cluttered. */ <div class="soc-end-payoff"><em>Lawrence said the cave holds the first of them. Water, bound under the dock for fifty years. He did not say what it would cost to bring her up, only that it had to be tonight, and that you would go together.</em></div> <hr class="ld-divider" /> <div class="ld-tagline"><em>Thank you for playing.</em></div> /* ═══ WHAT YOU CAME FOR — merged desire + choice-recap (v2.10.44 27 May) Single box: opens with the desire the player chose, then the consequence of their dock/captain choices. Replaces the old paired boxes (the Demo-3-placeholder "What You Came For" and the separate "Shape of Your Evening" recap), which were duplicative. Capped to ~5 lines: desire line + R1 + R3/captain. */ <div class="soc-end-callback"> <div class="soc-end-callback-kicker">What You Came For</div> <div class="soc-end-callback-body"> /* v2.10.47 (31 May 2026): rebuilt as call-and-response per author direction. CALL = the exact desire sentence the player chose at session 0 (echoed verbatim, not the mechanical $playerDesire token). RESPONSE = a direct read of whether the night delivered it, composed from the same state the recap journal reads. The shape is musical: you said you wanted X → here's what the night gave you. Each desire has its own evidence test. */ <<if $playerDesire is "matter_to_someone">> <p class="soc-end-call"><em>You'd said you came because you wanted to matter to someone tonight.</em></p> <<set _mattered = 0>> <<if window._socMomentFired("fang_ack_reciprocate") or window._socWasAnswered("fang_stari_krov_story")>><<set _mattered++>><</if>> <<if window._socMomentFired("B1_warm")>><<set _mattered++>><</if>> <<if window._socMomentFired("B4_chat_gallows_jeff_repair")>><<set _mattered++>><</if>> <<if window._socMomentFired("marcus_lute_witnessed")>><<set _mattered++>><</if>> <<if _mattered gte 3>><p class="soc-end-response">You did. Not because you asked for it, but because you showed up the way they needed, and they felt it. Fang let you in. Clare made room. The table stopped being a table and became a place that knew your name.</p> <<elseif _mattered gte 1>><p class="soc-end-response">A little. One person reached you, because for one moment you let them in, and the rest of the table you kept at arm's length without meaning to. You're left wondering which choice opened the door, and which one held it shut.</p> <<else>><p class="soc-end-response">Not tonight. The table stayed a table, because you never quite let it be anything more, and the night kept the distance you brought to it. Was that the room, or was it you? You came back to find out.</p> <</if>> <<elseif $playerDesire is "rules_make_sense">> <p class="soc-end-call"><em>You'd said you came because you wanted a room where the rules make sense.</em></p> <<set _rulesRead = 0>> <<if $R1_spoke>><<set _rulesRead++>><</if>> <<if $R1_castNet>><<set _rulesRead++>><</if>> <<if $R1_castYardarm>><<set _rulesRead++>><</if>> <<if $trickster_stepback>><<set _rulesRead++>><</if>> <<if _rulesRead gte 2>><p class="soc-end-response">And you tested them. You read the fight instead of forcing it, found the rule under the rule, and used it. The room answered.</p> <<elseif _rulesRead is 1>><p class="soc-end-response">Some of it. You found one rule and used it, then muscled through the rest when reading was slower than swinging. The room half-answered. You know there was more it would have told you.</p> <<else>><p class="soc-end-response">You learned them the hard way. The room didn't hand you its rules, it made you bleed for each one. You know more now than when you walked in.</p> <</if>> <<elseif $playerDesire is "finish_something">> <p class="soc-end-call"><em>You'd said you came to see if you could finish something you started.</em></p> <<if $trickster_stepback or $R3_standDown or $R2_stepBack>><p class="soc-end-response">And you finished it, the way a thing actually gets finished, by knowing when it wasn't yours to close alone. You started it. You let the others bring it down. That counts. That's the part most people never learn.</p> <<elseif $R1_struckChanter>><p class="soc-end-response">You saw it through to the end. The chant stopped because you didn't. You finished what you started, and you felt every yard of it.</p> <<else>><p class="soc-end-response">You finished it, but you're still not sure it's done. It closed because you wouldn't stop, not because you found the clean way through. Something's unsettled in it. You'll go back to see what you missed.</p> <</if>> <<elseif $playerDesire is "carry">> <p class="soc-end-call"><em>You'd said you came because you wanted this to stay with you.</em></p> <p class="soc-end-response">It will. Whatever you did down there, ash, or blood, or the line holding without you, it's in your chest now, in a place you can't reach. You'll carry it. That's what you asked for.</p> <</if>> </div> </div> /* v2.11.02: EE-010 (Forestella *White Night*) — survey pivot. The intimate second-person line reframes the feedback ask as a continuation of the game's voice rather than a chore. Reads as pure send-off voice to non-fans; the Forestella listener catches the lyric (White Night is in the wishlist below — end-credits is the sanctioned co-presence exception per EE-010). No on-screen attribution. */ <div class="soc-end-pivot"><em>Whisper your secrets to me. I began my adventure for you.</em></div> <<socexitsurvey>> /* v2.11.05 (16 Jun): external longer-form survey block REMOVED per author — simplifying measurement for now. The in-game survey above is the single feedback surface. The block was a <div class="soc-survey-external"> with a Google Forms link ("There's more you can tell us... the longer survey..."). Re-add here if a deeper opt-in is wanted later; the viewform URL lived in git history / prior versions. */ <hr class="ld-divider" /> <!-- v2.00.30 (08 Jul): WISHLIST MUSIC list removed from credits (author call). Each track is already surfaced in-game via its scene music banner, so the end-credits repeat was redundant. Voice-actor inspirations retained (those are NOT surfaced in-game). If a consolidated music-credits list is wanted later, it can be regenerated from the Music Architecture doc's deployment rows rather than hand-maintained here. --> /* v2.11.02: Voice-actor inspirations — ported from v27_7. Demo-4 cast only. Kai (Ok Taec-yeon) is intentionally COMMENTED OUT for this demo. Kai does not appear in Demo 4. Restore the Kai row in future demos where he features. Per EE/homage discipline: these are creative-direction references, covered by the artist promise below; no actor has endorsed the project. Order note: voice actors sit ABOVE the rights/IP statement per author direction, so the IP statement reads as the closing rights block. */ <div class="ld-name-prompt" style="margin-top: 1.4rem;">VOICE ACTOR INSPIRATIONS</div> <div class="ld-name-sub"><em>Creative references only. The performers who inspired these voices, contacted first if funded.</em></div> <div class="soc-vactor-list"> <div class="soc-vactor-row"><span class="soc-vactor-char">Lawrence</span><a href="https://en.wikipedia.org/wiki/Lee_Jun-ho" target="_blank">Lee Jun-Ho</a></div> <div class="soc-vactor-row"><span class="soc-vactor-char">Fang</span><a href="https://www.therealslimsherri.com" target="_blank">Sherri Dindal</a></div> <div class="soc-vactor-row"><span class="soc-vactor-char">Marcus</span><a href="https://linktr.ee/pat.mandziy" target="_blank">Pat Mandziy</a></div> <div class="soc-vactor-row"><span class="soc-vactor-char">Tiberius</span><a href="https://www.joshjohnsoncomedy.com/" target="_blank">Josh Johnson</a></div> /* KAI — restore in future demos where Kai appears (Demo 4 does not feature him): <div class="soc-vactor-row"><span class="soc-vactor-char">Kai</span><a href="https://en.wikipedia.org/wiki/Ok_Taec-yeon" target="_blank">Ok Taec-yeon</a></div> */ </div> <hr class="ld-divider" /> /* v2.11.02: Artist-promise merge (Option C) — fuses Demo 4's existing music- wishlist promise + original-work statement with the fuller "no AI likenesses / first calls when funded" pledge ported from the 3D build (v27_7). One coherent rights-and-promise block, no overlapping paragraphs. The original- work / historical-setting statement (Demo 4's, stronger than v27_7's) is retained. No player-facing em-dashes (house rule). */ <div class="ld-body" style="font-size: 0.92rem;">All music, art, and casting in this demo is wishlist material: placeholder cues, reference images, and dream-casting that signal the register, tone, and feel we hope to commission or license. The musicians, performers, and artists who inspired this game have not endorsed it. They are the first people we will contact when funding is secured, for proper licensing, fair compensation, and full credit. No copyrighted work, and no AI-generated likenesses, enter any commercial release without a signed agreement. No exceptions. We didn't build this around what we could afford. We built it around what the story deserves, and the artists who inspired it deserve the same.</div> <div class="ld-body" style="font-size: 0.88rem; margin-top: 1.2rem;">Stone of Commitment: Vanquish Death is an original work of fiction. Characters, plot, and worldbuilding © Studio Zisha 2026. The Silk Road historical setting (1402, Smyrna) is treated with the care a research-backed romantasy deserves: period-accurate clothing, weapons, mercantile geography. Errors are ours.</div> <hr class="ld-divider" /> <div class="ld-name-prompt" style="margin-top: 1.4rem;">CREATED BY</div> <div class="soc-credits-team"> <p><strong>Dani McKenzie</strong><br><span>CEO & Creative Director, Studio Zisha</span></p> </div> /* v2.11.02: EE-011 (RM / Kim Nam-joon interview quote) — final send-off line, placed immediately before the REPLAY action (release → "play again"). Reads as original send-off prose; RM-aware player catches it. No on-screen attribution. Source: RM interview, citation TBD (logged in EE inventory). */ <div class="soc-end-sendoff"><em>Don't be afraid, just dream.</em></div> <div class="ld-begin-wrap" style="margin-top: 2rem;"> <<link "▷ REPLAY">> <<script>> /* v2.10.44 (27 May 2026): Full state-reset replay pattern. Demo 4 has too many state variables to enumerate (~100+ across chase, dock combat, Mo Stór, IRL chat, party bonds, consent moments, journal log). Engine.restart() is SugarCube's clean restart — clears State.variables, re-runs StoryInit, navigates to the start passage (Demo4_Loader per Story Init Passage). */ try { if (window._socClearProgress) window._socClearProgress(); } catch (e) {} if (window._socTrack) window._socTrack('credits_replay', {}); try { SugarCube.Engine.restart(); } catch (e) { /* Fallback if Engine.restart fails for any reason: reload the page, which produces the same effect (fresh State, StoryInit runs, Loader is the start passage). */ try { window.location.reload(); } catch (e2) {} } <</script>> <</link>> </div> <div class="ld-buildtag">Studio Zisha · Confidential Playtest Build · Demo 5 <<= setup.version>> · June 2026 · © 2026</div>
<<script>> $('#ui-bar').hide(); <</script>> <div class="ld-star-wrap"> <svg width="100" height="100" viewBox="0 0 110 110" aria-hidden="true"> <defs> <radialGradient id="ld-rg" cx="50%" cy="50%" r="50%"> <stop offset="0%" stop-color="#c9a84c" stop-opacity=".25"/> <stop offset="100%" stop-color="#7c3aed" stop-opacity="0"/> </radialGradient> </defs> <circle cx="55" cy="55" r="52" fill="url(#ld-rg)" stroke="rgba(201,168,76,.25)" stroke-width="1"/> <circle cx="55" cy="55" r="38" fill="none" stroke="rgba(201,168,76,.18)" stroke-width="1" stroke-dasharray="3 4"/> <polygon points="55,18 62,40 87,40 68,54 75,76 55,62 35,76 42,54 23,40 48,40" fill="none" stroke="rgba(201,168,76,.7)" stroke-width="1.5" stroke-linejoin="round"/> <circle cx="55" cy="55" r="3.5" fill="#c9a84c" opacity=".9"> <animate attributeName="r" values="3.5;5.5;3.5" dur="2.2s" repeatCount="indefinite"/> <animate attributeName="opacity" values=".9;.4;.9" dur="2.2s" repeatCount="indefinite"/> </circle> </svg> </div> <div class="ld-title-h1">STONE OF<br>COMMITMENT</div> <div class="ld-title-h2">VANQUISH DEATH</div> <div class="ld-title-h2">GAME DEMO</div> <div class="ld-tagline"><em>An RPG about trust. The slow burn kind.</em></div> <div class="ld-body">Stone of Commitment is a romantasy: fantasy worldbuilding with the slow-burn emotional register of a K-drama and the combat depth of a premium RPG.</div> <div class="ld-name-wrap"> <div class="ld-name-prompt">Every guard on the Silk Road carries a road name.</div> <div class="ld-name-sub"><em>Keep this one, or pick your own.</em></div> <<textbox "$avatarName" "Fortune">> </div> <div class="ld-bar-wrap"><div class="ld-bar"></div></div> <div class="ld-pct">100%</div> <div class="ld-begin-wrap"><<link "BEGIN" "Demo4_Beat1_Debt">><<soctrack "loader_begin">><</link>></div> <div id="ld-notebook-mount"></div> /* v2.11.05 (16 June 2026): Landing-footer reorder. New order below BEGIN: wishlist (Ghost Town) → promise → jump-to-section → copyright. Rationale: the playing track is named where the player's attention already is, and the artist promise sits directly under it as one "here's the song / here's our pledge about its artists" unit (gap tightened — promise belongs to the music box, not floating). Page now CLOSES on the confidential/copyright stamp. The dev-only jump-links are demoted to just above the closing notice AND gated (see below) so they vanish in clean investor builds. */ /* Wishlist music + artist promise — one unit. The .ld-music-footer keeps its own spacing; the promise is pulled tight beneath it via inline margin-top so it reads as attached to the track rather than as a standalone statement. */ <div class="ld-music-footer"> <span class="ld-music-dot"></span> <span class="ld-music-label">Wishlist Music</span> <span class="ld-music-track"><a href="https://youtu.be/sQ72u1KqJwU?si=rZfDzcf0dtPmxf0G&t=43" target="_blank">Ghost Town</a></span> <span class="ld-music-artist">Chen & Hwe Seung · K-pop collaboration</span> </div> <div class="ld-body" style="margin-top: 0.6rem;">The artists, actors, and musicians who inspired this game will be the first people we contact when funding is secured.</div> <hr class="ld-divider" /> /* v2.10.39 (21 May 2026): Playtest jump links. Skips to the start of each demo section for faster iteration on dialogue/animation/branching/visuals. KNOWN LIMITATION: Jumping bypasses state setup that earlier passages normally perform. State variables ($avatarName, $arrivedB3Via, $fangTrust, $lawrenceTrust, $ishaniMinjaeBond, $ishaniClareBond, $ishaniJeffBond, $sashLeft, $sashRight, etc.) all start at StoryInit defaults. For visual and dialogue checks this is fine; for branching tests (e.g., does the Aggressive path's Novgorod plant pay off?), you'll want to play from BEGIN to set the canonical state. Section mapping (per setheader §-tags): §0: Demo4_Desire (kitchen-table desire-pick + Lawrence's first appearance) §1: Demo4_Chase_B1 (chase begins, North-Quarter Streets) §2: Demo4_PostChase_ToMostor (harbor approach, then Mo Stór) §3: Demo4_Dock_Approach (dock combat sequence) NOTE (v2.11.05): These jump-links are ALWAYS VISIBLE in source so Twine's in-editor preview works without query params. They are author tooling and must NOT ship externally — the strip toolchain (strip_jump_links.py, run via build_player.py before the comment strip) removes this entire .ld-jump-wrap block from the compiled player HTML. Keep the wrapper's class and structure stable; the stripper block-matches on <div class="ld-jump-wrap"> ... </div>. */ <div class="ld-jump-wrap"> <span class="ld-jump-label">Jump to section <em>(playtest only)</em>:</span> <span class="ld-jump-link"><<link "§0 · Kitchen Table" "Demo4_Desire">><<soctrack "loader_jump" "section_0">><</link>></span> <span class="ld-jump-link"><<link "§1 · Chase" "Demo4_Chase_B1">><<soctrack "loader_jump" "section_1">><</link>></span> <span class="ld-jump-link"><<link "§2 · Mo Stór" "Demo4_PostChase_ToMostor">><<soctrack "loader_jump" "section_2">><</link>></span> <span class="ld-jump-link"><<link "§3 · Dock" "Demo4_Dock_Approach">><<soctrack "loader_jump" "section_3">><</link>></span> </div> <div class="ld-buildtag">Studio Zisha · Confidential Playtest Build · Demo 5 <<= setup.version>> · June 2026 · © 2026</div> /* ═══════════════════════════════════════════════════════════════════════════ DESIRE-PICK — chat in PANE mode (tutorial); prose-audited. Prose moves into scene-overlay (cut prose preserved as image-stand-in). ═══════════════════════════════════════════════════════════════════════════ */
<<setchat "bubble">> <<setheader "MO STÓR · MAIN ROOM" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d20ad98c-a62e-4b7a-93ab-39354b08221e/Fang_Standing.png?content-type=image%2Fpng","left":"18%","bottom":"-5%","width":"28%","front":true,"pose":"still"}' '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Arrival">> /* v2.00.22 (08 Jul): PROGRESSIVE ROSTER first reveal. The party is now a party — Fortune + Fang arrive to find Marcus already at the table (his lute, Fang's easy familiarity). This is the teaching beat: the roster APPEARS with You + Fang + Marcus seated, plus a HELD SEAT for Lawrence (who arrives at the briefing). Unlock the roster surface, then join Marcus (jeff). You + Fang are joined from init. */ <<unlocksurface "roster">> <<partyjoin "jeff">> /* v2.10.39 (21 May 2026): Actor sprites added for Tiberius and Marcus. FIRST-PASS COORDINATES (expect render-check iteration): MARCUS (left 42% / bottom 22% / width 14%): - Positioned near second-table-from-foreground (mid-room left) - Width 14% — Marcus is a literal ~800lb grizzly bear (Story Bible §3.9), so substantially wider than human sprites (~6-8%) - bottom 22% places him at seated-on-low-bench height; his lute and torso fill mid-frame - Sprite is "Marcus_Lute_playing" — already framed for the in-room seated playing pose TIBERIUS (left 77% / bottom 18% / width 7%): - Positioned behind the bar (right foreground) - Width 7% — slim adult dark elf build per Story Bible §3.10 - bottom 18% is the FAKE-OCCLUSION value: sprite's bottom edge lands roughly at the top edge of the bar wood in the scene image. The bar appears to occlude his legs/lower torso because the sprite ends where the bar starts (not because the bar is layered above the sprite — that would require z-index work the engine doesn't currently support). KNOWN LIMITATIONS: - True bar-occlusion (where Tiberius's legs would be partially visible THROUGH the bar wood) is not possible without engine z-index work. The fake-occlusion approach reads correctly if the bottom value matches the bar's top edge in the rendered scene. - Render-check: if Tiberius's sprite-bottom doesn't align with the bar's top edge, adjust the bottom value up or down accordingly. - The Marcus sprite is a full-body bear-with-lute; render-check that 14% width doesn't make him too imposing relative to the human-sized party portraits in the party pane. FORWARD COMPATIBILITY: The <<artprompt>> commissioned-art block below is preserved with suppression flag true. When commissioned art lands for MoStor-arrival, it will show Tiberius+Marcus in the scene background directly, which CONFLICTS with these sprite placements. At that point: either (a) remove the sprite overlays (use the commissioned art only), (b) keep sprites for animation/interaction beats that the static art can't carry, or (c) commission an alternate "empty room" version of the scene art and rely entirely on sprites for character placement. This decision is downstream — for now, sprites carry the character presence. */ <<artprompt "MoStor-arrival" "Wide interior shot of Mo Stór's main room, late-afternoon light through high narrow windows. Period Smyrna tavern interior — heavy oak beams, low ceiling, stone floor, scattered tables, a hearth on the far wall. A bar/counter foreground-right where Tiberius (per Story Bible §3.10 — 340-year-old Irish dark elf, medium brown skin, slim build, age-undefined adult presentation that does not map cleanly to human aging, subtle non-human ear shape, calm working hands, voice/casting reference Josh Johnson) stands wiping a copper pot. Two small clay tea cups already steaming on the table closest to the hearth — cardamom-spice color, brass tray. In the back-left corner: Marcus (per Story Bible §3.9 — a literal full-grown grizzly bear, ~800 lbs, in a green embroidered period vest, full human cognition behind the bear face, seated on a sturdy low bench built to take his weight; holding a small wooden lute between his paws, mid-strum, not performing — playing for himself). The bear-playing-the-lute is canonical and not a joke about the canvas — Smyrna residents have grown used to the talking bear over the centuries he has visited, and the scene treats his presence as completely normal. Fortune and Fang enter through the doorway — Fortune (per Story Bible §3.1) is removing her turban at the threshold (Mo Stór is sanctuary, off-duty; the put-down gesture is part of her arrival). Fang has the wolf-puppy in her chest sling. The room is half-empty. Style: warm cinematic interior, the kind of cozy that a tired person comes home to. Reference: Persona 5 Leblanc cafe quietness, but Smyrna-period and Greek-tavern-coded with a grizzly bard in the corner. Aspect 16:9." true>> <<soundprompt "ambient" "Mo Stór interior bed: low hearth crackle, distant copper-on-copper from Tiberius's bar work, the wood-creak of someone shifting on a bench, Marcus's lute (single instrumental — the Irish Washerwoman jig melody, lute solo, no vocals, played slowly and quietly in self-soothing register per Music Architecture §1.4 Marcus Lute Mode Framework — the lively jig taken at a contemplative pace, the way someone hums a happy tune to themselves when they're in their own head). Outside-the-window: Smyrna harbor sounds receding into background. ~60-second loopable.">> <<soundprompt "music-cue" "Marcus's lute is the music. Diegetic — he is actually playing in the room. The tune is the Irish Washerwoman (a traditional Irish jig melody), but Marcus is in self-soothing mode and is taking it slowly, finger-picked, low and dry — not the dance-tempo most listeners would know but the same tune phrased like a private thought. Reference: traditional Irish Washerwoman jig melody on solo lute, played quietly at a private tempo. (Easter-egg credit-line for the music-architecture-fluent: the same melody underpins the Brobdingnagian Bards filk Do Virgins Taste Better — Marcus's repertoire reflects his IRL-pilot Jeff's Renn-Faire / RSC craft lineage per Game Bible §10.12. Do not surface in player-facing copy; the joke only works if discovered.)">> /* ─── Mo Stór entry — Marcus's diegetic lute is the music. (v2.10.44, 27 May 2026): replaced the prior <<musictransition White Night → Irish Washerwoman>> with a single <<music>> call. Per author canon update 27 May: music is a state, not a per-passage event. The track set here persists across all Mo Stór passages via author repetition with "continues" annotation (Demo 3 pattern). No URL: Marcus's Irish Washerwoman is diegetic in-world music, not a wishlist- licensed track. The non-diegetic White Night (Forestella) that was playing during the walk to Mo Stór is interrupted by the door opening into the live room music; no crossfade visual needed. */ <<music "Irish Washerwoman" "traditional Irish jig played soft and low by Marcus" "" "">> /* ─── THIRD-STAIR-CREAK PLANT — MOVED UPSTREAM (v2.10.40, 22 May late session, second pass). The plant originally lived here as a sceneprose line at Arrival: "The third step down creaks under Fang's weight. The fourth doesn't." On playtest, the line read as redundant addition under the chat banner — too late in the arrival sequence, after the player had already crossed the threshold visually. Moved upstream to Demo4_PostChase_ToMostor's overlay text: "The entrance to Mo Stór sits at the bottom of a long, stone street. The third step from the bottom creaks, announcing your arrival." The plant now lands at the approach (the visual moment when Fortune and Fang are descending the stairs to the door) rather than at the already-inside-the-room Arrival passage. This is cleaner diegetic timing — the creak announces the arrival; the prior passage IS the arrival. Payoff: the plant lives in the prior passage's overlay (Demo4_PostChase_ToMostor) and is implicit when Lawrence subsequently arrives at the Briefing — the player who paused on the overlay knows what sound just happened in the room as Lawrence crosses to the table. v2.10.40 (22 May late session, third pass): Briefing's opening third-stair-creak sceneprose line ("The third step down creaks. Lawrence crosses the room. He sets the wooden tube on the dark wood of the table without looking at it. The parchment stays under his arm.") was cut per author direction. Reasons: 1. The creak callback is implicit from the approach overlay plant 2. The parchment reference was leaving room for the Port Rhea map reveal which is now Demo 5+ work (out of scope this demo) 3. Lawrence's crossing-the-room action moved to the dlg parenthetical pattern (matching chase B7 canon) so it renders below the game pane with character attribution instead of in the overlay band where the roster card occludes it Forensic players recognize the callback from the prior overlay. First-time players feel the building's specificity (Mo Stór has a body that announces arrivals audibly; Tiberius knows it). The line stays narrator-detached — no commentary, no spotlight, just stage business. */ <<dlg "tiberius" "(gestures Fortune to sit) \"A moment, your tea will be ready shortly.\"">> <<dlg "tiberius" "(hands Fang a mug of boza; turns toward Marcus) \"If you're going to play it slow, at least don't play it sad.\"">> /* ─── Tiberius's musical-snark + multi-thread micro-beat. v2.10.39 restructure (21 May late session). Sets up several things at once: (1) Tiberius has musical taste and reads what Marcus is doing in the corner; (2) Tiberius and Marcus have a centuries-old friendship the player has not yet been told about; (3) the snark is character- readable for every player (slow-vs-sad is a music observation anyone can clock) while ALSO providing a second layer of payoff for filk- and Irish-trad-fluent players who recognize that the Irish Washerwoman is normally a *fast* tune; (4) Marcus refusing to respond is its own character bit: he is committed to the bit at his own tempo (Story Bible §3.9 stillness-as-tell canon). NEW THIS PASS (v2.10.39, 21 May): Fang gets two intervening beats between Tiberius's lines. First a silent toast (lifts boza toward Tiberius without dialogue) — wordless-recognition register adjacent to §13.1 chemistry. Then a verbal response to Tiberius's "sulking for two hours" line — "He'll outlast you. He always does." — a multi-century insider-family-joke about Marcus's stubborn lute-tempo refusal that Fang and Tiberius share as Mo Stór regulars of 100+ and 200+ years respectively. PRIOR CONTENT RETIRED: the prior version had Marcus's paw-salute prose ("does not look up, one paw lifts briefly, returns to strings, tempo does not adjust") between Tiberius's slow/sad line and his "ignoring me for two hundred years" line. Both retired this pass — Marcus's silence is now carried implicitly through Fang's "he'll outlast you" line + Tiberius's "sulking for two hours" frame, and the two-hundred-years pattern moves from in-scene dialogue to Story Bible §3.10 (already canon there). The scene-specific timing becomes "sulking for two hours" — situational, not eternal pattern. Per Style Sheet §5 Tiberius voice register (Sam Malone, load-bearing word placement, truth-as-comedy) and Music Architecture v4.8 §2.3 Marcus track entry. */ <<dlg "fang" "(lifts her boza toward Tiberius in a silent toast.)">> <<dlg "tiberius" "He's been sulking for two hours.">> <<chatpush "jeff" "now" "hey, leave my bear alone">> <<chatpush "jeff" "now" "he's NOT sulking">> <<chatpush "clare" "now" "lol">> <<dlg "fang" "He'll outlast you. He always does.">> <<dlg "marcus" "(without stopping) \"I am not sulking. I am observing. The two are different.\"">> <<dlg "tiberius" "(to Fortune, dry) \"Functionally the same; however.\"">> /* ─── EASTER EGG (v2.10.40, 22 May 2026, updated late session) ───────── Marcus's "I am not sulking. I am observing. The two are different." is Marcus Aurelius's Stoic distinction (apatheia vs. ekklisis — the refusal to be moved by passion vs. the active turning-away). The philosophical-distinction-as-comedy register. Tiberius's response "Functionally the same; however." is the Easter egg in a different shape from the v2.10.40-mid draft. Two layers: (1) On the surface: Tiberius gently mocks Marcus's distinction — "academically the difference matters; functionally it does not." Casual players hear an old-friend dig at Marcus's tendency to split philosophical hairs. (2) The forensic payoff: "Functionally the same; however." is ITSELF a Marcus-Aurelius rhetorical form — the concession-with-pivot structure that runs through Meditations. Tiberius is using Marcus's own move on him. After two centuries of regular customer-hood at Mo Stór, Tiberius has absorbed Marcus's sentence-architecture and now wields it back. Forensic players who later learn Marcus = Marcus Aurelius retroactively recognize that the rhetorical structure of Tiberius's line IS the recursion. Per Game Bible Easter Egg Inventory v0.3 Category A (Pilot–Character Mirrors): Marcus's authorial weight runs in parallel to Jeff's MFA- theater register. Both Jeff-the-pilot and Marcus-the-character carry the philosophical-distinction-as-comedy register. Jeff plays Marcus committed-to-the-bit per Atomic Shakespeare principles (Style Sheet §1 v1.6). */ /* ─── P1 BANTER ends here. Mother-tea + charm-blend + Marcus signaling the wait happen in the next passage (Demo4_MoStor_Tea). Architecturally this passage is the *arrival register* — the room is registered as sanctuary, the long-time-customer-banter establishes Mo Stór as a place Fang and Marcus have history with. The chemistry-anchor and the substantive Q&A happen downstream. */ <<advance "Sit down for tea" "Demo4_MoStor_Tea">>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Tea">> /* v2.10.44 (27 May 2026): Marcus is still playing. Music persists per author canon — every Mo Stór passage repeats the call with "continues" annotation until Marcus stops playing the lute. */ <<music "Irish Washerwoman" "traditional Irish jig played soft and low by Marcus · continues" "" "">> /* ─── P2 SANCTUARY (v2.10.40, 22 May 2026) ───────────────────────────── New passage extracted from prior Demo4_MoStor_Arrival in the Option II three-passage restructure. Function: 1. §13.1 INVIOLABLE — mother-tea beat. Tiberius presents cup two-handed, Fortune inhales cardamom. The recognition is wordless. (Carried forward from prior MoStor_Arrival verbatim.) 2. Charm-blend beat (per workshop 22 May architecture (P)): the charm-warmth from the alley blends with the tea-warmth + room-warmth until Fortune cannot tell them apart. She is distracted by the tea and the sanctuary; the Heartbeat register surfaces here but is indistinguishable from the room's care. Single sceneprose line — doesn't take the scene, surfaces once, then back to action. 3. Marcus signals the wait. His first substantive line ("Sit. The road is over for tonight. He'll be back when he's done.") is the heart- of-the-party register working through philosophical-authority-as- gentleness (per Story Bible §3.9, Marcus Aurelius canon). He is not pushing for revelation yet — that's the briefing's job. Here he is *managing Fortune's anxiety* and *naming the structure of what comes next*. 4. The "He." / "Lawrence." / "Mm." micro-exchange. Fortune registers they are using a pronoun for someone; Marcus answers; Fang's "Mm" into the boza is the whole hedge in one syllable. Sets up P3. PRESERVED: §13.1 dialogue/parenthetical structure (Tiberius two-handed presentation, Fortune cardamom inhale). ADDED: charm-blend sceneprose, Marcus's wait-signal, the three-line micro-handoff. NO JOURNAL ENTRIES added — voice audit pending (see SOC_Todo.md HIGH PRIORITY: Journal Entries Voice & Volume Audit). The prior "Tea, the way it was" journal moves to *after* this passage if audited and approved; for now we don't author new entries we'd have to re-audit. */ <<artprompt "MoStor-tea-served" "Tight two-shot — Tiberius (per Story Bible §3.10) standing at the side of the table, presenting a small porcelain cup and saucer two-handed to Fortune (per Story Bible §3.1) who is seated at a small wooden table near the hearth. The tea is cardamom — warm copper-amber color, visible steam, the saucer wider than the cup, the presentation deliberate. Tiberius's hands are calm, working-hands, not theatrical — he is presenting tea, not performing presentation. Fortune is leaning slightly toward the cup, body responding before mind catches up. Marcus is visible in the background corner with his lute, soft-focus. Mood: the specific intimacy of a kind gesture from a stranger who is not a stranger. Style: late-afternoon Smyrna interior, warm side-light from a high narrow window. Aspect 16:9." true>> /* ─── §13.1 INVIOLABLE — mother-tea beat (carried from prior arrival). Per Demo 4 Story Bible §13.1: this beat is load-bearing and must ship intact. The architecture: Tiberius reads Fortune well enough to serve tea the way her dead mother served it (eleven years gone). The recognition is wordless. Tiberius does not check whether Fortune noticed. Fortune does not perform acknowledgment. Both choose not to perform the recognition; that choice IS the gesture. */ /* §13.1 MOVED (25 Jun, Option A): the mother-tea recognition beat (Tiberius's two-handed "east of Constantinople" presentation, the cardamom inhale, the soft "Efharistó") was RELOCATED to the Ch1-hub (Demo5_MoStor_Hub) — Fortune's FIRST Mo Stór visit, where the first-time recognition belongs. To avoid the inviolable beat firing TWICE, the plot-path Tea now gets a LIGHTER greeting. If a player reaches this plot-path Tea WITHOUT having visited the hub, they miss the §13.1 beat — flagged as a follow-up (recognition may need to be reachable on either first-visit path; banked in SOC_Todo). */ <<if $moStorTeaSeen>> /* Path 1 (rested — already got the full §13.1 recognition at the Ch1 hub). LIGHTER callback: continuity, not repetition — he remembers how she takes it. */ <<dlg "tiberius" "(sets the cardamom tea down at her elbow, unhurried) \"You know where the cups are now. There is always more.\"">> <<dlg "fortune" "(softly) \"Efharistó.\"">> <<else>> /* Path 2 (did NOT rest — this is Fortune's FIRST Mo Stór tea). FULL §13.1 INVIOLABLE recognition fires here so the immersion moment is never missed (the "east of Constantinople" two-handed presentation + cardamom inhale). Mirrors the hub beat. */ <<dlg "tiberius" "(readies the tea then presents a porcelain cup and saucer two-handed to Fortune, the way tea is served east of Constantinople) \"I hope this is to your liking.\"">> <<dlg "fortune" "(The smell of cardamom reaches you before the cup does. You inhale before you sip.)">> <<dlg "fortune" "(softly) \"Efharistó.\"">> <<set $moStorTeaSeen to true>> <</if>> /* ─── §13.1 INVIOLABLE — Fortune's response. "Efharistó" (Ευχαριστώ) is the Greek everyday thank-you, in continuous use from ancient through Byzantine to modern Greek; period-correct for 1402 Smyrna under Ottoman administration. The parenthetical (softly) honors §13.1 canon: "Both choose not to perform the recognition; that choice IS the gesture." A small Efharistó under her breath registers the mother-tea recognition without naming it. Stronger landing than a longer thank-you would be — the understatement IS the recognition. */ /* ─── CHARM-BLEND BEAT (v2.10.40, 22 May 2026) ───────────────────────── Per workshop architecture (P): the charm-warmth from B6 blends with the tea-warmth and room-warmth until Fortune cannot tell them apart. Per §5.7 canon: "the Heartbeat-plant-payoff arc made legible." First payoff lands here, subtle. Full payoff lands at the briefing sleeve-touch (downstream). Watching for journal-voice drift: this prose is in-fiction-Fortune- register (her body in the moment), not Ishani-journal-register. The literary-drift risk is real here ("warm... warm... warm" triplet). Audit pass should review whether this line survives the voice register doc when written. RESOLUTION (v2.10.40, 22 May late session): line cut entirely per author direction. The dialogue + action beats already in this passage (Tiberius's two-handed tea presentation, Fortune's inhale-before-sip + softly-spoken Efharistó, Marcus's "Enjoy the quiet while it lasts. He'll be back when he's done.") carry the body-state and lull-before- Lawrence work that this interiority line was attempting to name. The line was restating what character mouths were already doing — which is the failure mode of overlay overuse. Broader principle banked from this cut: OVERLAYS ARE EARLY-DRAFT SCAFFOLDING. They name what the dialogue/action should be doing. Once the dialogue/action lands, the overlay/interiority is removable. Author flagged this as a recurring overuse pattern to watch for in downstream passage authoring. Future passes should sweep for interiority/overlay lines that restate work the dialogue already does and cut them. */ <<dlg "marcus" "(quietly, looking up from the lute for the first time) \"Enjoy the quiet while it lasts. He'll be back when he's done.\"">> <<dlg "fortune" "Who?">> <<dlg "marcus" "The vampire you met. Lawrence.">> <<dlg "fang" "(into her boza) \"Mm.\"">> <!-- v2.00.17 (07 Jul): BOARD/OTHER-PLAYERS'-NOTES placeholder — same fixture as the Ch1 hub (Demo5_MoStor_Hub). Added here so a Path-2 player (who skipped the hub) still sees the persistent-features note; the board is canonically always present in Mo Stór. Shown once per plot-visit at the settled tea beat, matching the hub's placement (after the tea, in the sanctuary register). --> <div class="d4-prose"><p class="--ingame">[Not in scope for the demo. Mo Stór will include: a quest board, a graffiti wall of comments from other players, the ability to re-spec your avatar, IAP, and other features.]</p></div> <<advance "Sit with Fang" "Demo4_MoStor_Wait">>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/bb37431b-04e4-4edf-9f45-6af5682d1afa/MoSto%CC%81r_Entrance3.png?content-type=image%2Fpng">> <<setactors '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/93d927e4-c9b5-4fee-b94c-dfcfa6c99d43/Lawrence_Standing_Flared_Coat.png?content-type=image%2Fpng","left":"32%","bottom":"0%","width":"36%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Briefing">> /* v2.10.44 (27 May 2026): Marcus is still playing. Music persists per author canon — every Mo Stór passage repeats the call with "continues" annotation until Marcus stops playing the lute. */ <<music "White Night" "Forestella" "https://www.youtube.com/watch?v=pOVNGANwcrk" "">> /* v2.10.45: White Night now enters HERE at Briefing (was Irish Washerwoman · Fades out.) per author thematic direction. The song's read — magic in the air, in the night, being who you were meant to be (Free your Colors / Sing your Chorus) — is the arc Fortune is being led into, and Lawrence's arrival is the threshold. Marcus stops playing as Lawrence arrives; the audio engineer handles the lute-fade + White Night-entry crossfade. From this point through Departure_Go, no return to Irish Washerwoman. */ /* ─── v2.10.40 BRIEFING REWRITE (22 May late session) ──────────────────── FULL REWRITE per workshop. Previous version had Lawrence delivering cosmological monologue immediately on arrival — too much, wrong canon (Air/Earth/Fire/Water instead of the five Guardian children), under-staged Fang and Marcus. NEW STRUCTURE (this passage = Lawrence-arrives staging beat, modeled on Demo 3 PathWait): 1. Third-stair-creak callback (planted in Arrival) 2. Lawrence enters with the wooden tube + parchment 3. Marcus lifts his hand from the lute. The music stops. 4. Fang's eyes go to the tube before they go to Marcus. 5. Lawrence: "I have updates." 6. Tiberius moves to the bar, turns his back (gives the room) 7. Fang sits — Fortune's LEFT 8. Lawrence sits — Fortune's RIGHT 9. Fang: "Slow, Lawrence." — protective register, institutional memory from previous mortal recruitment attempts 10. Lawrence: "Slow." — acknowledgment 11. Fang's hand flat on the table between her and Fortune 12. Marcus sees what passed between them. He says nothing. 13. Lawrence dismisses Stari Krov in one line — pivots to tapestries The cosmological reveal + recruitment + sleeve-touch happens in Demo4_MoStor_TapestryReveal (next passage). STAGING CANON ESTABLISHED (per Story Bible needs banking): - Fortune sits at the hearth-side table from the prior Wait/Unfinished passages. Lawrence takes the empty seat to her right when he arrives. Fang already on her left. This seating geometry is load-bearing for the heartbeat sleeve-touch in TapestryReveal (Lawrence reaches across the table, coat brushes Fortune's right side). - Marcus's lute-stopping IS the cosmological signal arriving in the room. Forensic players: Marcus's lute = stability indicator. - Fang's verbal protection beats live in TapestryReveal, not here. Earlier draft had "Slow, Lawrence" + Lawrence "Slow." landing at seating in this passage; both retired per author 22 May late session — Lawrence's "Slow." doesn't make sense to say, and Fang's "Slow, Lawrence" lands stronger when fired AT the sleeve-touch in TapestryReveal (the moment Lawrence's body actually crosses into Fortune's space and his charm-field reactivates at proximity). - Character-action lines in this passage (Lawrence crossing, Marcus's lute stopping, Fang's eyes, Tiberius giving the room) all render as <<dlg>> parenthetical action prose per chase B7 canon. Renders below the game pane with character attribution, not in the overlay band where the roster card occludes. */ <<dlg "lawrence" "(enters the tavern. He sets a wooden tube on the dark wood of the table without looking at it.)">> <<partyjoin "minjae">> /* v2.00.22 (08 Jul): Lawrence joins the roster HERE — his cell animates into the held seat that's been waiting since the arrival. Second teaching beat: the roster is LIVE (membership grows). Fires on his entrance so the seat fills as he physically arrives. */ <<artprompt "MoStor-lawrence-arrives" "Mid-shot. Lawrence in the doorway of Mo Stór, dark coat, dark hair, the spathē sheathed across his back. Tiberius nodding from the bar — small, knowing, not surprised. Lawrence is looking past Tiberius at Fortune and Fang at the hearth-side table. The light from the late afternoon outside backlights him slightly. Fang has not turned to look — she has registered him in her peripheral vision and chooses not to perform recognition. Fortune is looking at him directly. The wooden tube he carries is in his left hand. Style: cinematic — the entrance of someone whose entrance is itself a kind of language. Aspect 16:9." true>> <<soundprompt "ambient" "Door-creak as Lawrence enters. Marcus's lute holds one suspended note, then stops. Tiberius's footsteps moving away from the table area to the bar — deliberate, not announced. Lawrence's bootfalls on stone, three steps from doorway to the table.">> <<dlg "marcus" "(lifts his hand from the lute. The music stops.)">> <<dlg "fang" "(eyes go to the tube before they go to Marcus.)">> <<dlg "lawrence" "I have updates.">> <<dlg "tiberius" "(does not return to the table. He moves to the bar and turns his back. Mo Stór is giving you the room.)">> <<sceneprose "Fang takes the table's left side. Lawrence comes around and stands to your right.">> /* ─── Lawrence dismisses Stari Krov in one line, pivots to the tapestries. Per workshop direction: the war band is clan-political (Lawrence as First-Among-Equals of the vampire reformist faction) and has ZERO connection to the Water rescue mission (Lawrence as Net's champion). For demo scope, Lawrence acknowledges the clan problem in one sentence and moves on. The clan-political work happens off-screen. */ <<dlg "lawrence" "Stari Krov isn't the biggest issue tonight. I have a lead on where Death is holding the Water Guardian.">> <<advance "Turn to Lawrence." "Demo4_MoStor_TapestryReveal">>
<<setchat "bubble">> <<setheader "MO STÓR · DEPARTING" "Evening · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d20ad98c-a62e-4b7a-93ab-39354b08221e/Fang_Standing.png?content-type=image%2Fpng","left":"18%","bottom":"-5%","width":"28%","front":true,"pose":"still"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/c679384e-407a-4d97-b996-c4df197c971b/Lawrence_Standing_1400s_Front_filigree.png?content-type=image%2Fpng","left":"45%","bottom":"-5%","width":"28%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Departure">> /* v2.10.45 (28 May 2026): White Night continues. Music persists past Briefing (its entry point) — every subsequent Mo Stór passage repeats the call with "continues" annotation. Marcus has stopped playing the lute; the audio engineer handles fade. */ <<music "White Night" "Forestella · continues" "https://www.youtube.com/watch?v=pOVNGANwcrk" "">> /* ─── DEPARTURE (v2.10.40, 22 May late-late session) ────────────────── Major restructure per author. PREVIOUS: opened with overlay band text, three narrator sceneprose lines, "silence both layers" music cue, art prompt, journal entry, then walk-to-dock button. NEW: opens with PCMN at top (single line, no commentary), Fortune's why-me / why-now questions answered by Lawrence (partially), Clash- homage choice (Should I stay / Should I go now) with tactical=stay gated as demo-gate, aggressive=go falling through to the gear- handoff (converted to character actions) + dock-walk button. EDITS APPLIED: 1. All overlay/narrator sceneprose converted to character actions via dlg parenthetical pattern (chase B7 canon). 2. "Silence both layers" music cue removed — the audio-absence beat was author scaffolding that overcomplicated the demo's music register. 3. Art prompt block hidden as comment (artwork now produced). 4. PCMN moved to passage top, single line, no engineer-fade commentary (consistent wishlist-music register). 5. All four characters (Marcus, Tiberius, Fang, Lawrence) added as setactors sprites. CLASH HOMAGE: choice text directly lifts the song "Should I Stay or Should I Go" (The Clash, 1981). Tactical first (Should I stay), aggressive second (Should I go now). No trickster choice. Stay routes to demo-gate popup, returns to choice. Go falls through to gear handoff + walk to dock. ⚠ DELIBERATE CONVENTION EXCEPTION (do not "fix"): every other move cluster in the demo runs aggressive → tactical → trickster. This one is REVERSED (tactical → aggressive) ON PURPOSE, to preserve the Clash lyric order ("should I STAY or should I GO" — stay first). The posture labels are incidental here; the real choice is the stay/go binary, and the homage wins over the ordering convention. Author 03 June: keep the reverse order; revisit presentation in the next demo so it doesn't read as a bug (see SOC_Todo). */ /* ─── Fortune's why-me + why-now beat. The recruitment ask was made in TheAsk. Fortune's questions land here, after she's chosen to "Ask him" — i.e., after she's chosen to continue the conversation rather than refuse on the spot. Lawrence's answers are partial. He names the mortal-can-pass insight (already in cosmology speech, compressed restatement) and the operative urgency (Death-confirmed-as-captor, compounding world-consequences). He does NOT confess the recruitment history. FORENSIC-CRAFT (per two-layer Fang protection canon banked in TapestryReveal): WHY-ME answer: "you walk through what stops me" does double work — surface mortal-evasion mechanic, underlying acknowledgment that Lawrence's charm cannot move Fortune in the way she might assume it can. He is technically conceding she has agency the charm can't override. WHY-NOW answer: Lawrence's "the cost runs while you decide" is immediate charm-cycle ESCALATION, not de-escalation. Fang just said "You can say no" — offering Fortune the consent-frame to refuse. Lawrence's response uses time-pressure to FORECLOSE Fortune's right to deliberate. The line lands as urgency on the surface; underneath, it's pure cost-shifting manipulation. Lawrence is doubling down on the charm-cycle Fang warned him off from minutes earlier. Per author 22 May late-late session: this is intentional. Lawrence is character-bearing data — he continues recruiting Fortune despite Fang's protective call-offs. The forensic-craft player catches the contradiction. The surface player just feels the urgency. Both readings are valid; the two-layer architecture is the load-bearing canon. */ <<dlg "fortune" "Why me?">> <<dlg "lawrence" "Because Death's defenses are made for beings like us. You walk through what stops me. That is enough.">> /* v2.00.27 (08 Jul): NEGOTIATION-COGNITION TEACH (SOC_Combat_Architecture v1.0 §3). Fortune doesn't accept the framing Lawrence hands her — she refuses the premise itself ("that is enough" is HIS terms for her worth). This is negotiation-as- cognition modeled conversationally: not asking for more data (that's "why me/why now"), but declining the frame she's being sold. Teaches the fourth posture in a low-stakes beat before the dock makes "refuse the premise" a combat option, and it's characterful — she questions being reduced to a function even by someone recruiting her. Lawrence's reply concedes the point without abandoning the ask. */ <<dlg "fortune" "\"Enough for what you need. That's not the same as a reason I should say yes.\"">> <<dlg "lawrence" "(a pause; the warlord reconsiders the mortal) \"No. It isn't. Ask, then. I will answer what I can.\"">> <!-- v2.00.21 (08 Jul): Ishani (the PILOT) voices self-doubt in game-stats terms to The Table, while Fortune presses on in-fiction. "level 2 guard" is pilot vocabulary — the human sizing up her character's inadequacy against the quest — NOT something Fortune would say in-world (Fortune's next line stays the in-fiction "Why now?"). Lands a beat after Lawrence's "That is enough," reading as Ishani unconvinced by the reassurance. Lowercase register matches the guild feed. --> <<chatpush "you" "now" "i'm only a level 2 guard, is that gonna be enough??" 1400>> <!-- v2.00.22 (08 Jul): Min-jae FALSE-FLAG reassurance answering Ishani's self-doubt. The false-flag flavor here: he unwittingly PARROTS LAWRENCE'S recruitment logic back to her. Lawrence just said (three lines up) "You walk through what stops me. That is enough." — and Min-jae, oblivious-warm, hands her that exact framing as comfort ("you're there to walk through what stops them... that's enough"). Creepier than his own charm-reframe because the recruiter's rationalization has propagated to a TRUSTED friend: she'd push back on Lawrence, but she trusts Min-jae, so the framing she should question arrives pre-approved. Gamer-register ("build"). Staggered after her line; typing-tell first (he's composing an earnest answer). v2.00.25 (08 Jul): dropped the third push ("that's the whole build. that's enough.") — the echo lands on the two-line version; the third beat was overkill (author playtest). The beat now ends on "...walk through what stops them." --> <<chatbeat "minjae" "typing">> <<chatpush "minjae" "now" "levels don't matter for this one" 2800>> <<chatpush "minjae" "now" "you're not there to fight. you're there to walk through what stops them." 4600>> <<dlg "fortune" "Why now?">> <<dlg "lawrence" "Death has Water. Death has all of them. While I look for the way through, the earthquakes continue. The famines. The empty nets.">> <<dlg "lawrence" "(pauses) \"You can refuse. But the cost runs while you decide.\"">> /* ─── Clash homage choice. "Should I stay or should I go" lifted from the Clash song (1981). Tactical = stay (demo-gated via inline dialog). Aggressive = go (proceeds to gear handoff). No trickster — this isn't a moment for a sideways read. Fortune commits or defers. TACTICAL CHOICE IMPLEMENTATION (v2.10.40 22 May late-late session): Per author direction, the demo-gate is an INLINE non-routing handler rather than a dedicated downstream passage. Reasons: - Avoids dead-end risk if the playtest jump button is hidden from external playtesters - Player stays on the Departure choice menu after dismissing the dialog — the choice is preserved, not consumed - No passage-transition cost (state remains intact, no soctrack pollution from a one-line acknowledgment passage) Implementation: raw HTML matching d4-choice render structure (tactical sigil + prose layout from chasechoice macro), with JS click handler that fires SugarCube.Dialog.open() instead of navigating. (Dialog is namespaced under SugarCube, NOT a bare global — same pattern as SugarCube.State / SugarCube.Engine used in the save-state work. Bare `Dialog` reference throws ReferenceError.) The button looks IDENTICAL to a chasechoice tactical button — player sees no visual difference between the two choices until they click. */ /* v2.10.44 (27 May 2026): The choice cluster below is HYBRID — first option is hand-written HTML (the demo-gated Tactical "stay" path), second is a <<chasechoice>> macro call (Aggressive "go" path). The YOUR MOVE header is normally rendered by the chasechoice macro on its first call in a passage, BUT because the first visible choice here is HTML (not a chasechoice), the header was rendering BETWEEN the two options instead of above the cluster. Fix: render the header manually above the cluster, then set _chasechoiceHeaderShown so the chasechoice's own header-render logic skips. */ <<set $_chasechoiceHeaderShown = passage()>> <div class="d4-choices-header"> <span class="d4-choices-header-prompt">YOUR MOVE,</span> <span class="d4-choices-header-name">$avatarName</span> </div> <div class="d4-choices"> <div class="d4-choice --tactical"> <a href="#" onclick="(function(ev){ev.preventDefault();SugarCube.Dialog.setup('');SugarCube.Dialog.wiki('This branch unlocks in the full game. For tonight, walk to the docks with them.');SugarCube.Dialog.open();})(event); return false;"> <div class="d4-choice-meta"> <span class="d4-choice-sigil --tactical">TACTICAL</span> </div> <div class="d4-choice-prose">"Should I stay?"</div> </a> </div> <<chasechoice "aggressive" "" "\"Should I go now?\"" "Demo4_MoStor_Departure_Go">> </div>
<<setchat "bubble">> <<setheader "MO STÓR · DEPARTING" "Evening · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/d20ad98c-a62e-4b7a-93ab-39354b08221e/Fang_Standing.png?content-type=image%2Fpng","left":"18%","bottom":"-5%","width":"28%","front":true,"pose":"still"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/c679384e-407a-4d97-b996-c4df197c971b/Lawrence_Standing_1400s_Front_filigree.png?content-type=image%2Fpng","left":"45%","bottom":"-5%","width":"28%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Departure_Go">> /* v2.10.45: Evidence atom for the matter_to_someone recap evaluator. Marcus's wordless gear-handoff is a substantive relationship beat witnessed by Fortune. Pushed unconditionally on passage entry; this passage is reached only when the player proceeds to Mo Stór for the departure scene. Idempotent — if the player navigates back-and-forth, re-entry is no-op'd by the existence check. */ <<script>> (function() { var V = State.variables; V.momentsThatMattered = V.momentsThatMattered || []; for (var i = 0; i < V.momentsThatMattered.length; i++) { if (V.momentsThatMattered[i] && V.momentsThatMattered[i].id === 'marcus_lute_witnessed') return; } V.momentsThatMattered.push({ id: 'marcus_lute_witnessed', passage: State.passage, session: 'tonight' }); })(); <</script>> /* v2.10.45 (28 May 2026): White Night continues. Music persists past Briefing (its entry point) — every subsequent Mo Stór passage repeats the call with "continues" annotation. Marcus has stopped playing the lute; the audio engineer handles fade. */ <<music "White Night" "Forestella · continues" "https://www.youtube.com/watch?v=pOVNGANwcrk" "">> <<soundprompt "ambient" "Mo Stór interior, final moments. Marcus set his lute down back at the table when Lawrence brought his news; the room has been quiet of the jig since. Tiberius's footsteps approaching the table. Outside the window: evening Smyrna sounds rising — the harbor, the calls to prayer beginning to drift up from the lower city, late-day market sounds winding down.">> <<soundprompt "foley" "Marcus's lute against the table-edge as he stands; the deliberate weight of a 1,200-year-old bear rising from a low bench. Lute-strap unbuckling. Quiver-strap. Bowstring-quiet brush. Three small sounds of gear being set down on Tiberius's bar. No words.">> /* ─── Gear-handoff staging per Story Bible §3.9 + Music Architecture §3E Beat 3.5. The wordless transfer of lute, bow, and quiver to Tiberius is the canonical transition signal: Marcus is going somewhere he thinks his instruments could be damaged. The gear PHYSICALLY STAYS WITH TIBERIUS — when the party walks out of Mo Stór, the lute, bow, and quiver remain on the bar. The handoff happens before the party rises to leave; on departure Marcus is unburdened. */ <<dlg "marcus" "(lifts the lute strap over his head)">> <<dlg "tiberius" "(at the table before Marcus has finished standing. Wordless. The lute goes to Tiberius's hands. Then the quiver. Then the bow.)">> <<dlg "tiberius" "(sets all three behind his bar, the way he has set them behind his bar before. The gear stays. Marcus does not.)">> <<dlg "fortune" "I've never seen a bear shoot a bow.">> <<dlg "marcus" "And you never will.">> /* v2.10.44 (27 May 2026): Jeff + Clare chat callout per author 27 May. Jeff's voice = peanut-gallery wink that hints at Marcus's shapeshifter canon without exposition. Clare's "shh" is her in noticing-mode (she reads the table's dynamic and knows when to gentle the table). The beat plants the shapeshifter reveal without spoiling it — attentive players catch the implication; casual players read it as banter. Authoring pattern: chat-side-channel side effects on a striking in-fiction beat. Phase 2 (banked) chat-reactivity system will eventually generalize this; for now it's a hand-placed instance. */ <<chatpush "jeff" "now" "oh man wait til she sees he's not just a bear">> <<chatpush "clare" "now" "shh you'll spoil it">> <<dlg "lawrence" "(hands Tiberius the wooden tube without looking down.)">> <<journalentry "why does a bear have a bow?" "as we were leaving mo stór, marcus gave tiberius his lute, bow, and quiver. the lute i get if we're going into a fight. but why does he carry a bow and quiver of arrows if he's not going to use them. now i'm really curious and want to bug jeff later about this." "[REL] mostor · marcus-lute-handoff">> /* ─── Art prompt block (hidden as comment 22 May late-late session — artwork now produced for this beat). PREVIOUS ARTPROMPT (preserved for archaeology): "MoStor-departure" — Wide shot. The four of them — Fortune, Fang, Lawrence, Marcus — exiting Mo Stór's door into evening Smyrna. Tiberius (340-year-old Irish dark elf — medium brown skin, slim build, subtle non-human ears) in the doorway behind them, watching them go, neither waving nor calling out — the kind of farewell of someone who has watched many people walk out of his door toward many things and trusts his door to still be there when some of them come back. CRITICAL CONTINUITY DETAIL: Marcus's lute, bow, and quiver are NOT on his person and ARE visible inside the room behind Tiberius — the lute set against the bar's back wall, the bow and quiver leaning beside it. Per Story Bible §3.9 canon, Marcus hands his gear to Tiberius before any combat he can foresee; the gear physically stays at Mo Stór until Marcus returns. Marcus on the threshold is the 800-lb grizzly walking on all fours alongside the party, unburdened. Fortune (per §3.1, in caravan- guard kit) is replacing her turban as she steps outside — the put-on gesture mirrors her threshold-take-off on arrival. The four are walking abreast — Lawrence and Fang in front, Fortune and Marcus a half-step behind. The harbor-light is copper, low. Style: the moment of a party leaving a sanctuary to walk toward something they cannot see yet. The bear walking alongside three armed humans should READ as completely normal — Smyrna has known the talking bear for centuries; no passerby is startled. Aspect 16:9. */ /* v2.00.18 (07 Jul): CHAPTER 2 END lands here (author: Ch2 ends at the tavern departure; the dock confrontation is Ch3's opening). Continue → the dock (Ch3); "Rest at the Tavern" → the Mo Stór hub (which now returns the player onward to the dock via $_hubReturnTarget, not back into Ch2). Replaces the old single "Walk to the Furthest Dock" advance. The seal text is empty (no oxytocin-seal line authored for this beat yet — the departure dialogue above IS the closing beat); add one here if a Ch2 seal line is wanted. */ <<chapterend 2 "" "Demo4_To_The_Dock" "Demo5_MoStor_Hub">>
<<setchat "bubble">> <<setheader "SMYRNA · TO THE DOCK" "Evening · 1402" "DEMO 5 · §3">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/63e4a774-d693-43de-96cd-65ccbac855d7/Jetty2.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>The harbor is going gray. The water stinks of decaying fish and kelp.</p>">> <<soctrack "scene_enter" "To_The_Dock">> <<soundprompt "ambient" "Walking from Mo Stór toward the furthest dock. Evening Smyrna winding down — late market sounds dropping off, calls to prayer fading, the harbor air taking over. Footfalls of four people walking abreast on cobble, then planking. Gulls. The dock's wooden creak ahead.">> /* v2.10.43 (25/26 May 2026) — TO THE DOCK passage. Architectural function: 1. The first one-on-one conversation between Lawrence and Fortune since the charm-cast at chase B6. Player witnesses the charm operating in a social register: Lawrence offering interest, Fortune deflecting cleanly. Charm-affected register left implicit (no fragmentation, no body-reaction spectacle) — preserves ambiguity, lets player decide whether they're seeing it or not. 2. Marcus pulls focus off Fortune via pompous bardic register — protection-via-attention-redirect, not protection-via-naming. The "three against twelve" count correctly excludes Marcus (he wasn't in the chase; canon-physics: 800lb grizzly would have made Lawrence unnecessary). 3. Jeff (out of character; he plays Marcus) observes MJ's performance shift in guild chat. Tabletop convention: player steps out of character to comment, then back in. Naming what MJ is doing without naming the mechanism (the "REAL polite" framing is observational, not protective-alarm). Beats the player MUST receive: - Lawrence-Fortune intimacy attempt - Fortune's clean deflection (uncle/caravan-guard canon reaffirmed) - Marcus's pompous focus-pull - Jeff's chat-witness of MJ's tonal shift Beats that should stay IMPLICIT (do not name on the page): - "Charm is operating" - "Fortune's body is responding" - "MJ is performing a consent-erosion pattern" Players assemble the pattern; the demo does not narrate it. */ <<dlg "lawrence" "(to Fortune) \"You held up well in the alley. Most humans would have panicked at a war band.\"">> <<dlg "fortune" "I didn't have time to think. I just reacted the way my uncle taught me.">> <<dlg "marcus" "A war band turned away by three against twelve! Songs will undersell it for centuries.">> /* ─── DECLARED INTENT PAYOFF: fang_stari_krov_story (v2.10.45) ────────────── Declared at Demo4_Chase_B2_Aggressive_Engage when Fortune said "I want to hear that story later." Gated below so only aggressive-path players (who raised the question on the rooftop) receive Fang's partial reveal here. Architecture (consumed-when-asked, per StoryInit $declaredIntents notes): - Fang opens the topic herself — Fortune doesn't need to re-ask. Earned by the rooftop declaration. - Marcus's second bardic interjection punctuates the quiet beat without collapsing it. Matches the tonal device established by his first line. - Fang gives the SHAPE of the feud, not the substance. Canon stays open for Demo5+; "old debt, hers to call, mine to answer" reads regardless of what the eventual canon turns out to be. - <<consumeintent>> closes the queue entry. The intent is resolved at the system level (question raised + answered) even though the narrative substance remains partial. */ <<if window._socHasDeclaredIntent("fang_stari_krov_story")>> <<dlg "fang" "(to Fortune, quieter) \"You asked me a question on a roof.\"">> <<dlg "fortune" "I did.">> <<dlg "fang" "Stari Krov's matriarch and I have a debt between us. Old. Hers to call, mine to answer.">> <<dlg "marcus" "(declaiming, undeterred) \"And in time the very stones of this harbor shall remember!\"">> <<dlg "fang" "(to Fortune, lower) \"That's the shape of it. The rest you can have when we're not walking toward water.\"">> <<resolveintent "fang_stari_krov_story">> <</if>> /* ─── Guild chat sequence (v2.10.43, 25/26 May 2026) ────────────────────── Six-message exchange staggered across ~13s of dwell time. Architecture: - Jeff (line 1) observes MJ's tonal shift on Lawrence - MJ (line 2) deflects via false-green-flag pattern — invokes Lawrence's "ready to try friendship again" sympathetic frame. The "again" hints at Lawrence's 1000-year-grief substrate (Story Bible canon TBD — TODO item 10). Per TODO item 9b: friendship-as-frame deployment. - MJ (line 3) smirk emoji — immediately undercuts the protective framing he just constructed. Forensic tell. - Jeff (line 4) tests MJ's framing: if Lawrence is ready for friendship, why not Fang (the relationship he already has)? Jeff playing dumb-protective — the question itself is the test. - MJ (line 5) passes the test via deflection: confirms-then-defers. "Next time" pushes the Fang arc out of this scene's stakes; "clare, you up for that" puts a future-tense scheduling burden on Clare. Reduces Fang to a future romance plot point. - Clare (line 6) DOES NOT engage with MJ's framing at the relationship level. Pivots to team-cohesion and Ishani-as-load- bearing-variable. Topic-management as protection. Per Clare-canon (TODO item pending): her protective function is topic redirection, not direct accusation. None of the underlying pattern (debt-leveraging, false-green-flag) is named on the page. Forensic players assemble it; casual players see normal table banter. Clare's line: *"yeah, with ishani here, we need to play as a team if we want this quest."* — 78 chars, fits under the 80-char chatpush warning threshold. Tightened from a 97-char draft. Verb register intentionally non-win/lose-coded: "want this quest" not "win this quest" — SOC is a consequences-and-choices game, not a winning-and-losing one. "Want" is the right verb because it carries player-agency without smuggling in the wrong framing. */ <<chatpush "jeff" "now" "uh. lawrence is REAL polite all of a sudden" 1800>> <<chatpush "minjae" "now" "i'm just playing the character. he's ready to try friendship. again." 4500>> <<chatpush "minjae" "now" "😏" 5500>> <<chatpush "jeff" "now" "so what about fang, mj?" 8000>> <<chatpush "minjae" "now" "yeah, that too. clare, you up for that next time?" 10500>> <<chatpush "clare" "now" "yeah, with ishani here, we need to play as a team if we want this quest." 13000>> <<advance "Step onto the dock" "Demo4_Dock_Approach">> /* ═══════════════════════════════════════════════════════════════════════════ SECTION 4 — FURTHEST DOCK The party walks to the dock. Marcus reads the captain's emotional state. Lawrence speaks; Song Min-jae posts to chat; Ishani picks her register. Solo combat (Fortune vs. 3 Death-touched workers) plays with a menu shaped by Ishani's chat response. Then party combat (full team vs. captain in red coat). Victory routes to cave-entrance. ═══════════════════════════════════════════════════════════════════════════ */
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_Wait">> /* v2.10.44 (27 May 2026): Marcus is still playing. Music persists per author canon — every Mo Stór passage repeats the call with "continues" annotation until Marcus stops playing the lute. */ <<music "Irish Washerwoman" "traditional Irish jig played soft and low by Marcus · continues" "" "">> /* ─── P3 THE WAIT (v2.10.40, 22 May 2026) ────────────────────────────── New passage RENAMED FROM Demo4_MoStor_FangAnswer in the Option II three-passage restructure. Function: 1. Fortune asks substantive personal-relational question ("How long have you known him?"). Fang gives the THREE-LINE HEDGE per author direction 22 May: - "Most of my life." — true (Fang ~370 years old), understates time scale by ~250 years if heard at human scale - "We've served together." — true (Silk Road) but reframes ~200 years of sister-in-arms as professional collaboration - "He's a good commander." — operational praise instead of relational truth (brother-in-all-but-name) Each line costs Fang something — the wound layer per Jiwon canon (1363 → 1402 = 39 years ≈ "40 years"), reopened by tonight's forced proximity to Lawrence + the war band attack. The hedge is competence-as-attraction running in REVERSE: Fang's withhold tells Fortune the relationship is bigger than Fang will name. 2. Fortune presses on the POLITICAL question (war band, matriarch). Fang deflects per author direction Q-D: "Lawrence wants to deal with something else tonight." The deflection is BOTH a promise (Lawrence will name it) AND a non-answer (Fang isn't telling). Sets up the briefing. 3. Tiberius's CENTURY-OBSERVATION REFRAME. Per workshop 22 May — Sam Malone with 100 years of watching Fang's drinks at this table. "Last time you sat at that table you were drinking something stronger than boza." Tiberius isn't asking; he's *naming*. Fang's response — "I had a different reason" — closes it without acknowledging the texture. Tiberius's "Mm" and moving on respects the close. (Per Story Bible §3.10: Tiberius opened Mo Stór ~200 years ago; Fang's been a regular ~100 years; both numbers locked.) 4. Marcus's REFRAME-WITHOUT-PUSH: "She's protecting something that isn't hers to share. Lawrence will be here soon. He'll tell you what you need to know." Per author direction Q-F: in the pre- briefing Marcus's role is SETUP, not delivery. He defends Fang's right to hedge AND promises Fortune the briefing-answers are coming. The push for full revelation happens at the briefing. 5. MJ WHISPER (per author direction Q-G). MJ knows Lawrence is on his way; previews to Ishani that "the charm thing earlier wasn't an accident." Three response chips for Ishani — engage / defer / still-mad. The "unlocks a quest line for him" line is MJ's commit-to-the-frame voice; the subtext (Lawrence's romance arc) is what the forensic player catches. MJ-as-character is doing reparative work for his B6 overstep — offering information as apology-shaped repair. Doesn't fully repair, but attempts. 6. CLARE-OFFLINE / FANG-STILL BEAT. Single sceneprose at the end — Fang has gone still in a different way, boza in both hands, not looking at anyone. Meta-layer reading: Clare just stepped away from the keyboard for her sick five-year-old (per author direction Q-C). Fiction-layer reading: Fang is sitting with what was almost said. Both true, neither resolved. FLOWS INTO: Demo4_MoStor_Unfinished — the canonical consent- architecture choice (press / accept / name the silence). The Unfinished branch text needs review against the new trigger context (deflection now political, not personal); flagged for next-session pass. */ <<artprompt "MoStor-fang-answer" "Two-shot, intimate. Fortune and Fang seated across a small wooden table near the hearth, two clay cups of cardamom tea steaming between them. Late-afternoon light falling sideways through a high narrow window. Fang's hands are wrapped around her cup, both of them, the way someone holds a thing for the warmth. The wolf-puppy is asleep in her lap now, having been transferred from the chest sling. Fang is looking at the cup, not at Fortune. Fortune is looking at Fang. Style: K-drama interior — the camera holding still on a woman who is not yet ready to say something, and another woman waiting. Aspect 16:9. Mood: the silence between someone who knew the man on the rooftop and someone who is asking who he was." true>> <<soundprompt "ambient" "Mo Stór interior, quieter still. Marcus's lute continues in the back, softer now (volume drop ~20%). Hearth crackle. Tiberius is moving between the bar and the table. The wolf-puppy makes one small breathing sound. Fang's cup against the table — single ceramic-on-wood click as she sets it down, then picks it back up.">> <<dlg "fortune" "How long have you known him?">> <<dlg "fang" "(into the cup) \"Most of my life.\"">> <<dlg "fang" "We've served together. He's a good commander.">> <<dlg "fortune" "And the war band? What does the matriarch want from you?">> <<dlg "fang" "(small pause) \"Lawrence wants to deal with something else tonight.\"">> <<deflectintent "fang_stari_krov_story">> /* v2.10.45: fires unconditionally — the tea deflection happens for all players regardless of whether they declared on the rooftop. The intentLog distinguishes "declared-then-deflected-then-answered" (aggressive path) from "deflected-only" (other paths). */ /* ─── DECLARED INTENT PAYOFF (resolved v2.10.45). The fang_stari_krov_story intent (declared at Chase_B2_Aggressive_Engage) is consumed at Demo4_To_The_Dock during the walk-to-the-dock dialogue — gated on _socHasDeclaredIntent so only aggressive-path players receive Fang's partial reveal. This passage's unconditional deflection ("Lawrence wants to deal with something else tonight") remains: it works as scene tension for all players regardless of intent state, and for aggressive- path players it pre-stages the eventual walk-to-dock reveal as a deflection-then-relent shape. */ <<sceneadvance "Drink the tea." "Demo4_MoStor_Unfinished">>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/c679384e-407a-4d97-b996-c4df197c971b/Lawrence_Standing_1400s_Front_filigree.png?content-type=image%2Fpng","left":"45%","bottom":"-5%","width":"28%","pose":"still"}' '{"id":"tapestry","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/416e167f-d7a1-47f8-86cc-e14c40c3f218/Tapestry_Water_Transparent.png?content-type=image%2Fpng","left":"44%","bottom":"20%","width":"11%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_TapestryReveal">> /* v2.10.44 (27 May 2026), updated v2.10.45: White Night now ENTERS at Briefing per author direction (Lawrence's arrival = the threshold; song's theme — magic in the air, being who you were meant to be — is the arc Fortune is being led into). By TapestryReveal it's continuing, not entering. Mo Stór passage convention: every subsequent passage repeats the call with "continues" annotation. */ <<music "White Night" "Forestella · continues" "https://www.youtube.com/watch?v=pOVNGANwcrk" "">> /* ─── v2.10.40 SPRITE STAGING (22 May late session) ────────────────────── TapestryReveal sprite composition. Five sprites total, source-ordered for correct render layering (later = on top): 1. MARCUS (mid-ground left, 42%/28%/18%): - At his lute-bench, existing canonical Mo Stór coords matching Tea/Wait/Unfinished passages - pose: still (lute has stopped per Briefing prose; no animation) 2. TIBERIUS (mid-ground right, 58%/-5%/30%): - Behind the bar, existing canonical fake-occlusion coords - pose: still 3. FANG (foreground left, 18%/0%/22%): - Standing at the table's left side, facing the table-center - Per author direction 22 May: "have the sprites stand in front of the table and we ignore that they should be sitting down" - Width 22% sized for foreground standing human at table-edge - Per Briefing seating-staging canon: Fang to Fortune's LEFT 4. LAWRENCE (foreground right, 60%/0%/22%): - Standing at the table's right side - Per Briefing seating-staging canon: Lawrence to Fortune's RIGHT — engineered specifically for the heartbeat sleeve-touch beat in this passage (Lawrence reaches across, coat brushes Fortune's right side) - Sprite asset: Lawrence_standing_period_garb_sword.png - Overlaps Tiberius mid-ground (x=60-82% vs Tiberius 58-88%); source-order puts Lawrence on top (correct — foreground wins) 5. TAPESTRY (foreground center-table, 38%/15%/24%): - Foreground sprite acting as the unrolled-on-table tapestry - Width 24% sized to read as the cloth object on the table between Fang and Lawrence - bottom: 15% lifts it off the floor to "lying on the table" height - VISIBLE FROM PASSAGE ENTRY — no mid-passage gating tonight (no <<addactor>> primitive built yet; polish item) - Per author direction 22 May: "We can show this as a popup for now [...] confirm. we can polish later." POLISH ITEMS DEFERRED: - Custom CSS class .d4-tapestry-popup with fade-in animation - <<addactor>> engine primitive for mid-passage timed sprite insertion - Better visual gating: tapestry appears WHEN Lawrence unrolls, not at passage entry - Render-test the coords against actual Mo Stór interior background Per author direction 22 May (running session): "Confirm. we can polish later." */ /* ─── v2.10.40 TAPESTRY REVEAL REWRITE (22 May late session) ───────────── FULL REWRITE. Previous version used incorrect canon ("the fourth Guardian is missing," "binding is four parts") that conflicted with Game Bible §3.2 + §3.6 (five Guardians, all imprisoned by Death, sequential fall order over ~150 years, Water 4th to fall, ~50 years cold). Also missing: the 150-year campaign canon, the mortal-evasion insight, the explicit recruitment ask, Fang's protective beats. NEW STRUCTURE (modeled on Demo 3 S3_Briefing_Cosmology, restructured 22 May late session per author workshop): wishlist register; player doesn't parse engineer fade timings) 2. Lawrence character-action: uncaps tube, slides out bundle, "He has done this many times" (dlg parenthetical action) 3. Lawrence character-action: begins to unroll bundle. His coat brushes Fortune's right sleeve (BRUSH #1, accidental during unrolling action) 4. Fortune body-knowing (dlg parenthetical): "You feel it before you can think it. Same as the alley. Same as the cup." 5. Fang protective preemption: "Slow, Lawrence." (called-off signal between long-time comrades; see two-layer canon banked below) 6. Sceneprose: Fang's gaze is on Lawrence, not the tapestry (forensic texture — Fang is reading Lawrence's physiology, not his pitch) 7. Lawrence speech 1 (to Fortune): cosmology + consequence (Net's five children, Death imprisoned them, Water cold for fifty, Smyrna dying) 8. Lawrence speech 2 (gaze to Marcus, then Fang): 150-year campaign + mortal insight ("We three have been searching since Sun was first taken. Death's defenses are made for beings like us. The three of us cannot pass through. A mortal might.") 9. Lawrence speech 3: the ask ("I have a lead on Water tonight. I need someone who can walk where I cannot.") 10. Sceneprose: Lawrence reaches across to begin rolling up the tapestries. His coat brushes Fortune's right sleeve (BRUSH #2 — not strictly accidental; the charm field is operative) 11. Fang protective verbal escalation: "(to you, quiet) You can say no." (intervention in active charm cycle, making sure Fortune has agency despite the physiological pull) 12. Lawrence acknowledgment (to Fortune): "She's right." (acknowledging at the charm-level, not just at recruitment-level — yes she can refuse despite what his body is doing to hers) 13. Journal entry — Fortune's voice landing the asymmetry she perceived 14. Closing sceneprose — re-rolling, tube under arm, threshold business CANON COMPLIANT per Game Bible §3.6 Imprisonment Timeline: - 5 Guardians, all imprisoned by Death over ~150 years - Sun first (~1252), Stone (~1292), Sky (~1322), Water (~1352), Moon (~1390, still fading) - Water cold for fifty years - 8-month acceleration threshold (game opens during this period) CANON COMPLIANT per Game Bible §3.7 Tapestry Sets: - Lawrence holds full set of five - Five tapestries rolled around common axis, onion layer - ROLLED never folded (period-realism rule) - Water current outermost because harbor crisis is the active concern - Bundle is wool-and-silk NEW CANON BANKED (urgent Story Bible work — see SOC_Todo.md): - The "send a mortal" insight: Lawrence's realization that Death's defenses are calibrated against immortals, so a mortal might pass through. The recruitment logic for the entire demo. - Fortune is NOT the first mortal recruited. She is the latest. The pattern has run for some unspecified duration (canon to be locked in writers' room). Previous attempts have ended badly. - Lawrence does NOT confess the recruitment-history layer in this passage. The asymmetry of information is intentional — Fortune doesn't know she's one of a series. The player can infer it from Fang's protective register and Marcus's silence. - Demo 4 closes after the dock combat. Water rescue is Demo 5+ work. This briefing is RECRUITMENT, not mission-payoff. - TWO-LAYER FANG PROTECTION CANON (banked 22 May late session) — see detailed comment block below Fang's "Slow, Lawrence" beat for the full architecture. Summary: Fang's protection has a surface layer (don't push the pitch) and an underlying layer (don't escalate the charm cycle, charm-precedes-feeding canon, Fortune is under Fang's protection via §3.8 Caravan-Guard History). Both layers should be held when authoring future Fang-protection beats. */ <<artprompt "MoStor-tapestry-bundle" "Close-up. Lawrence's hands on the table at Mo Stór: a small wooden tube, just being uncapped. Lawrence pulling a bundle of rolled wool-and-silk out of the tube — five tapestries rolled together around a common axis, like onion layers. The outermost layer's blue-green edge visible. The tube being set aside. The bundle on the dark wood of the table, just beginning to unroll. Fortune's hands visible nearby — at her cup, not yet on the tapestry. Fang's hand flat on the table beside Fortune. Marcus's massive paw resting on his knee, no longer on the lute. Hearth light catching the silver thread in the cloth. Style: hands and ritual — the unrolling of something done many times. Aspect 16:9. The tapestry should READ as cold even in the hand-position, pale blue undertones." true>> <<soundprompt "foley" "Wooden tube uncapping — soft pop of waxed leather seal. The bundle sliding free against the wood interior, dry whisper of silk on wood. The bundle setting onto the table — heavier than five rolled cloths should sound, the weight of centuries of cooling. The unroll, slow — the silk against silk against wool, a sound the room has not heard in this iteration of Smyrna.">> /* ─── HEARTBEAT MUSIC at passage top, above all character dialogue. Per author direction 22 May late session: keep wishlist-music cue consistent for demo. Player doesn't need to parse fade timings from the engineer's perspective. v2.10.44 (27 May 2026): The Heartbeat (2PM) music call that was here has been REMOVED. Per author canon update 27 May, the reframed Mo Stór scene uses White Night (Forestella) for the tapestry reveal through departure — awe/weight register + bookend with the arrival walk (you arrive on White Night, Marcus's diegetic lute holds the room, you leave on White Night). The Heartbeat alley→tavern chase-motif callback is retired here; Heartbeat's plant in the chase no longer pays off at this passage. White Night is set at the top of this passage via the <<music>> call above. */ <<dlg "lawrence" "(uncaps the wooden tube. Slides out a bundle of wool and silk. Five small tapestries, rolled together. He has done this many times.)">> <<dlg "lawrence" "(unrolls bundle. His coat brushes your right sleeve.)">> /* v2.11.05 (16 June 2026): charm-perception beat converted from a Fortune dlg-parenthetical ("You feel it before you can think it") to standalone- italic INTERIORITY (the boza register, §<see Register Style Sheet: sceneprose interiority>). Rationale: - The prior line was abstract/literary (named the concept rather than giving Fortune a body in the room) and read as pretentious in playtest. - This is a charm-PERCEPTION beat (something happening TO Fortune's body, invisible from outside), not an action she performs — so it belongs in the interiority register, not a dlg-parenthetical. Matches the B6 boza line markup exactly (italic + --text-mid, no speaker attribution). - The unease lives UNDER the warmth, not in conscious wariness: the trust is comfortable and certain, and the wrongness is that it is "not quite yours" (the charm arrived from outside her, same tell as the boza line's register). Per canon, Fortune is too new to read the charm-precedes- feeding pattern consciously; the body knows before she does. No em dash (house rule). - Cross-layer rhyme: "not quite yours" at the in-world charm level echoes Ishani's IRL grievance that MJ cast this on her character without asking (agency-taken-without-consent, the pattern from her old guild). The line carries both layers. */ <!-- v2.11.06 (17 Jun 2026): re-tagged from .d4-dlg + inline font-style:italic to .d4-prose > p.--ingame (dormant charm-register class, now activated). Omniscient second-person charm-register narration, not dialogue. Paired with the boza-voice line above per the author's "same tell as the boza line's register" note. --ingame: white + left-aligned (matches dialogue/action) + italic + violet left-border. --> <div class="d4-prose --ingame-wrap"><p class="--ingame">The warmth you felt earlier was back, sinking into your skin like a warm afternoon. It felt weird to trust a vampire, but the trust was there anyway, warm and certain and not quite yours.</p></div> <<dlg "fang" "(stares at him) \"Slow, Lawrence.\"">> /* v2.10.44 (27 May 2026): The <<sceneprose "Fang's gaze is on Lawrence, not the tapestry.">> line that previously rendered here has been REMOVED. It was overlay-style narrator voice that crowded the scene window per author 27 May. The stage-direction work it was doing (Fang's gaze direction signaling she's reading him, not the artifact) has been folded into the dialogue line itself as a parenthetical "(stares at him)" — same beat, one fewer rendered block. */ /* ─── Two-layer Fang protection canon (banked 22 May late session). Fang's "Slow, Lawrence" operates on TWO LAYERS simultaneously: SURFACE LAYER (what casual players parse): - Generic protective register — don't push hard on Fortune emotionally, slow the recruitment pitch, give the mortal room to think. UNDERLYING LAYER (forensic-craft, banked for Story Bible migration): - Charm precedes feeding in vampire physiology (Game Bible §4.1). Lawrence's charm field activates at proximity. The sleeve-brush is evidence the cycle has started. Fortune's body-knowing is the player's signal that the feeding-precursor is operative. - Fang has institutional protocol with Lawrence for breaking the charm cycle when the mortal is someone Fang considers under her protection. "Slow, Lawrence" is the called-off signal — known between long-time comrades. Lawrence understands what Fang means because he has been called off before. - Specifically applies because Fortune is Fang's caravan-guard buddy (Story Bible §3.8 Pre-Demo4 Caravan-Guard History). Fang's protective protocol is NOT generic toward all mortals — it activates only for those under her protection. - Author canon clarification 22 May: Fortune at L2 is "still too new to really, truly understand what Lawrence is doing to her." She does not yet have the framework to read the charm-precedes-feeding pattern. Fang is the only voice that can break the field for her. IMPLICATIONS for the rest of the scene: - Lawrence speaking to Fortune anyway, after Fang's called-off signal, is character-bearing. He chooses to continue the recruitment over Fang's protest. This is Lawrence-fault-line material. - The second sleeve-brush (during re-rolling, after the ask) reads as not-strictly-accidental. Lawrence reaches across again. The charm field is operative. He knows it. - Fang's "You can say no" is intervention in the active charm cycle — making sure Fortune has agency despite the physiological pull. - Lawrence's "(to Fortune) She's right" is acknowledgment at the charm-level, not just at the recruitment-level. He is naming, in code, that yes she can refuse despite what his body is doing to hers. NEEDS STORY BIBLE MIGRATION before any other writer touches charm-adjacent scenes. See SOC_Todo.md HIGH PRIORITY entry. */ <<dlg "lawrence" "(to Fortune) \"Death has captured and bound all five of the Goddess Net's children. She hid them one by one, over a hundred and fifty years. I can no longer find Water or the others from their tapestries. The world is dying because they are gone.\"">> <<advance "Hear him out." "Demo4_MoStor_TheAsk">>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"lawrence","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/c679384e-407a-4d97-b996-c4df197c971b/Lawrence_Standing_1400s_Front_filigree.png?content-type=image%2Fpng","left":"45%","bottom":"-5%","width":"28%","pose":"still"}' '{"id":"tapestry","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/416e167f-d7a1-47f8-86cc-e14c40c3f218/Tapestry_Water_Transparent.png?content-type=image%2Fpng","left":"44%","bottom":"20%","width":"11%","pose":"still"}' >> <<soctrack "scene_enter" "MoStor_TheAsk">> /* v2.10.45 (28 May 2026): White Night continues. Music persists past Briefing (its entry point) — every subsequent Mo Stór passage repeats the call with "continues" annotation. Marcus has stopped playing the lute; the audio engineer handles fade. */ <<music "White Night" "Forestella · continues" "https://www.youtube.com/watch?v=pOVNGANwcrk" "">> /* ─── THE ASK (v2.10.40, 22 May late-late session) ───────────────────── New passage splitting the original TapestryReveal at the cosmology speech. TapestryReveal now ends at "...the world is dying because they are gone." with button "Hear him out." routing here. Architectural reason for the split (per author 22 May late-late): - Author flagged overlay-overuse pattern: TapestryReveal's tail had three narrator sceneprose lines that should've been character actions. - Splitting the passage gives each half its own visual breathing room and prevents the roster card from occluding multi-line overlays. - Forensic-craft payoff: the split makes Fang's "You can say no" + Lawrence's "She's right" more layered. Implies Fortune could say no to (a) helping rescue Water, (b) being charmed, or (c) both. The two-layer Fang protection canon (banked in TapestryReveal comment block) lands harder when isolated from the cosmology speech. STRUCTURE: 1. PCMN music cue at top (single line, no engineer-fade commentary — consistent wishlist-music register for the demo) 2. Lawrence speech 2 (gaze to Marcus, then Fang): 150-year campaign + mortal insight 3. Lawrence speech 3: the ask 4. Lawrence character-action: reaches across to begin rolling up the tapestries (BRUSH #2, not strictly accidental — charm field operative) 5. Fang: "(to you, quiet) You can say no" — verbal escalation, active charm-cycle intervention 6. Lawrence: "(to Fortune) She's right" — acknowledgment at charm-level 7. Lawrence character-action: re-rolls bundle, tube under arm 8. Fang character-action: stands 9. Journal entry 10. Button "Ask him." → Departure (Fortune's why-me/why-now questions continue the recruitment conversation as the party stands to leave) Closing time-passage line ("The afternoon has bent toward evening") CUT per author direction Q3 — the visual transition is carried by the Departure passage's artwork (early-evening Mo Stór exterior) and the dock scene's evening artwork. No prose line needed. */ <<dlg "lawrence" "(gaze to Marcus, then Fang) \"We three have been searching since Sun was first taken. Death's defenses are made for beings like us. The three of us cannot pass through. A mortal might.\"">> <!-- v2.00.21 (08 Jul): pilot-banter over Min-jae's typing beat. As Lawrence delivers the quest hook, Min-jae is "typing" (composing the ask), and Jeff/Clare fill the pause in GAMER register (pilots reacting to a game beat, not characters to a story beat). Deliberately placed on the SEARCHING speech, NOT the ask — so the chatter clears BEFORE Fang's "You can say no." consent beat, which it must not step on. Clare's third line ("...he's being serious rn") lands as the ask arrives, so the players' chatter quiets INTO the serious moment — the meta-layer mirrors the fiction going quiet. Jeff's line pays off his established "at this bar for an hour" boredom (guild feed callback, not a cold joke). --> <<chatbeat "minjae" "typing">> <<chatpush "jeff" "now" "finally. i was about to go afk" 1000>> <<chatpush "clare" "now" "main quest UNLOCKED. ishani you're gonna carry" 2400>> <<chatpush "clare" "now" "...wait, he's being kind of serious rn" 4000>> <<dlg "lawrence" "(one hand curls closed on the table. He meets your eyes, and for the first time there is urgency in his.) \"I have a lead on Water tonight. I need someone who can walk where I cannot.\"">> <<dlg "fang" "(to you, quiet) \"You can say no.\"">> <<dlg "lawrence" "(to Fortune as he returns the tapestries to the tube.) \"She's right.\"">> <<dlg "fang" "(stands.)">> <<journalentry "the tapestry" "this is beautiful. i wonder why lawrence has these portraits? what is their purpose? fang and marcus know what they are.\n\nfang says i can say no. no to what? his charm, the quest? isn't that why i'm here?" "[PLOT] mostor · tapestry-the-ask">> <<advance "Ask him." "Demo4_MoStor_Departure">>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> /* v2.10.44 (27 May 2026): Marcus is still playing. Music persists per author canon — every Mo Stór passage repeats the call with "continues" annotation until Marcus stops playing the lute. */ <<music "Irish Washerwoman" "traditional Irish jig played soft and low by Marcus · continues" "" "">> /* ─── UNFINISHED HUB (v2.10.40 22 May trigger-context update + late-session bridge consolidation) ─────────────────────────────────── Originally triggered after Fang's personal hedge ("Someone I used to walk with"). The May 22 Mo Stór restructure changed the trigger: Fang now hedges TWICE — first the three-line personal hedge ("Most of my life. We've served together. He's a good commander.") and then the Volkhva deflect ("Lawrence wants to deal with something else tonight"). The Unfinished moment now fires after BOTH. LATE-SESSION RESTRUCTURE (22 May): the Tiberius century-observation exchange + Marcus's reframe + MJ whisper + Clare-offline beat moved FROM the Wait passage's tail INTO this passage's head. Reason: those beats are the room's *response* to Fang's deflect, not part of the deflect itself. They belong with the moment Fortune is sitting with, not the moment Fang created. Also: this passage was previously a bare choice menu — orphan-line feel. The moved block gives it substance before the choice. The three branches absorb the new trigger context without rewrite: - ACCEPT (+5 fangTrust): Fortune lets both stand. Strongest read: Fortune respecting Fang's right to hedge across BOTH personal and political layers. - NAME (+10 fangTrust): "You don't have to tell me." Now reads as Fortune seeing Fang's protective hedge ACROSS both layers — a bigger gift than the original personal-only read. Stronger earned. - PRESS (+0 fangTrust): "That's not an answer." Now reads as tactical demand on the political deflect AS WELL AS the personal — Fang's "It is the answer I am giving you" carries political weight too. Branch texts kept as-is; the trigger shift sharpens what's at stake rather than changing what each branch DOES. */ /* ─── Tiberius century-observation reframe. Sam Malone with 100 years of watching this table. He's not asking; he's naming. Fang closes it without acknowledging texture. He moves on. */ <<dlg "tiberius" "(passing the table, refilling Fang's mug without being asked) \"Last time you sat at that table you were drinking something stronger than boza.\"">> <<dlg "fang" "Last time I sat at that table I had a different reason.">> <<dlg "tiberius" "(moving on) \"Mm.\"">> /* ─── Marcus reframes — defends Fang's right to hedge AND promises the briefing. Setup, not delivery. */ <<dlg "marcus" "(to Fortune, quiet) \"She's protecting something that isn't hers to share. Lawrence will be here soon. He'll tell you what you need to know.\"">> /* ─── MJ WHISPER (Q-G, v2.10.40 22 May; reworked v2.11.05 16 June). MJ previews the alley charm-violation in a quest-frame. Ishani chooses how to respond. The reparative arc per workshop architecture: MJ offering information as apology-shape after his B6 overstep. v2.11.05 REWORK: the prior line ("fyi the charm thing earlier, that wasn't an accident.") read as a SECOND helping of whisper-1's "the charm is fine, don't fight it" — duplicative, because in the Whisper tab MJ's thread accumulates across passages and the two land adjacent with no Clare/Jeff between them. Both were the same flavor of false green flag (dismiss the discomfort). The rework makes this a DIFFERENT flavor: instead of dismissing the effect, MJ relabels the deliberate non-consensual charm as a GOOD thing ("the game telling you you matter") — a fake-apology that defends the thing it's apologizing for, which is the truer false green flag and escalates rather than repeats. "isn't that what we all want in a game?" keeps MJ OBLIVIOUS-warm (he universalizes it, musing/self-soothing, not needling) — if it read as pointed it would break the "he thinks he's helping" frame. Cross-layer: "you matter" hits Ishani's specific fear (being made to matter on someone else's terms, the old-guild pattern) precisely because MJ can't see why it would; and "what we all want" exposes MJ's OWN ache (competence shadowed by doubt, the need to matter he writes into Lawrence). Triple duty: false green flag, hooks Ishani's fear, reveals MJ. No em dash (house rule). v2.11.05 DELIVERY (17 Jun, Option 2b): the reframe above is NO LONGER on the standalone whisper — it now fires as MJ's ANSWER to Ishani's "what was it then?" chip (see whisperreply below), in two staggered bubbles + a third quest-tease. As a standalone it answered the very question the chip asked (non-sequitur); pulling it out via her curiosity makes her complicit in drawing out the thing working on her — a sharper false green flag. The analysis above still holds; only the delivery vector changed. v2.00.22 (08 Jul): the standalone "lawrence is on his way back." whisper is DELETED (author). It read oddly as a WHISPER (a public logistics update in a private, intimate channel), and it was a non-sequitur wedged between MJ's earlier charm whisper ("fyi he's charming you...") and Ishani's follow-up chips about it. With it gone, the chips ("what was it then?" etc.) sit directly after the charm whisper they actually refer to — tighter thread, no orphaned antecedent (the chip asks about the CHARM comment from B7, never about "on his way back"). The curiosity-gated reframe (whisperreply below) is UNCHANGED — the v2.11.05 ruling holds: the false-green-flag reframe is still drawn out by Ishani asking, not volunteered. */ /* v2.11.05 (17 Jun) — Option 2b restructure. The charm-reframe ("the charm wasn't an accident. it's the game telling you you matter. isn't that what we all want in a game?") was MOVED off the standalone whisper and into the "what was it then?" chip's response. Why: as a standalone, the message already ANSWERED "what was it" — so the chip re-asked a question MJ had just answered (playtest non-sequitur). Now Ishani's curiosity PULLS the reframe out of him, which is the sharper false-green-flag: she's complicit in drawing out the thing that's working on her, and the reframe arrives as earned answer, not volunteered lecture. Delivered as TWO staggered bubbles (2b): the reframe, then a beat later the oblivious-warm "isn't that what we all want" trailing into MJ's own ache (musing/self-soothing, not needling — per the design note above). The "unlocks a quest line" tease is kept as a third, later bubble so the plot-hook survives. All three ride respondImmediate's array + fallback- queue, so they fire in-passage or queue to next entry if the player advances. Chips now make sense in BOTH the engaged path (after "you're good, trust me") and the deferred B6 path (no prior exchange) — none re-asks an answered Q. */ <<whisperreply '{"icon":"❓","text":"what was it then?","stat":"ishaniMinjaeBond","delta":1,"momentId":"Wait_charm_curious","respondImmediate":[{"who":"minjae","text":"the charm wasn\u2019t an accident. it\u2019s the game telling you you matter.","delayMs":2000,"surface":"whisper"},{"who":"minjae","text":"isn\u2019t that what we all want in a game?","delayMs":3800,"surface":"whisper"},{"who":"minjae","text":"unlocks a quest line for him. you\u2019ll see.","delayMs":6000,"surface":"whisper"}]}' '{"icon":"⏸","text":"don\u2019t respond","defer":true,"momentId":"Wait_charm_defer"}' '{"icon":"❗","text":"i\u2019m still mad about it","stat":"ishaniMinjaeBond","delta":-2,"momentId":"Wait_charm_still_mad","respondImmediate":{"who":"minjae","text":"fair. it was a lot to drop on you. we\u2019ll talk after.","delayMs":2200,"surface":"whisper"}}' >> <div class="d4-choices"> <<chasechoice "aggressive" "" "\"That's not an answer.\"" "Demo4_MoStor_Unfinished_Press">> <<chasechoice "tactical" "" "(nod. don't press. drink the tea.)" "Demo4_MoStor_Briefing" "" "MoStor_accept" "fangTrust" 5 "Fang gave me an unfinished sentence. I let it be unfinished.">> <<chasechoice "trickster" "" "(nice weather, isn't it, Fang?)" "Demo4_MoStor_Unfinished_Name">> </div>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> /* v2.10.44 (27 May 2026): Marcus is still playing. Music persists per author canon — every Mo Stór passage repeats the call with "continues" annotation until Marcus stops playing the lute. */ <<music "Irish Washerwoman" "traditional Irish jig played soft and low by Marcus · continues" "" "">> <<setoverlay "<p>You named the silence. She heard you.</p>">> <<consentmoment "MoStor_name" "fangTrust" 10 "Fang gave me an unfinished sentence. I told her she didn't have to finish it." '{"offered":["that\u2019s not an answer","drink the tea, don\u2019t press","you don\u2019t have to tell me"],"chosen":"you don\u2019t have to tell me","silenceVariant":false,"replayVisible":true}'>> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Anyway. The tea's getting cold. Some sentences are better unfinished."</div> <<sceneprose "interiority" "She looks at you. The look has a length to it.">> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "I know."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (smaller) "Thank you."</div> <<journalentry "what isn't she telling me?" "fang started to say something, then stopped. i could ask clare, but she'd just say it's plot stuff and tell me nothing. so i guess i wait. i hate waiting." "[REL] mostor · unfinished-name">> /* v2.10.47 (31 May 2026): reframed to Ishani forward-stance per author direction. Prior versions (transcript, then a still-Fortune-leaning reflection) recounted the scene; this version is Ishani-at-her-keyboard carrying the question forward, meta-aware (she knows Clare-the-pilot won't spoil the questline). Title is a question — the Ishani-journal pattern (cf. "what is fang hiding?", "why?"). "i hate waiting" rhymes with the "Lawrence on the roof" entry's "i'm not patient." */ <<soundprompt "music-cue" "Marcus's lute warms — a single low note added under the melody, almost subliminal. The room registers what just happened.">> <<sceneadvance "Lawrence arrives." "Demo4_MoStor_Briefing">>
<<setchat "bubble">> <<setheader "MO STÓR · BY THE HEARTH" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/8db0383c-5d4e-4d4f-85e9-61ae79e65f11/MoSto%CC%81r_Interior.png?content-type=image%2Fpng">> <<setactors '{"id":"fang","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/b57b823f-52f6-42ea-bc20-b46201c01894/Fang_Sitting.png?content-type=image%2Fpng","left":"24%","bottom":"-12%","width":"27%","front":true,"pose":"still"}' '{"id":"marcus","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/68ac80bc-446a-4f59-a558-bd3b22088e79/Marcus_Lute_playing.png?content-type=image%2Fpng","left":"42%","bottom":"28%","width":"18%","pose":"still"}' '{"id":"tiberius","src":"https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a33f6e17-b26c-4ada-9718-e3e7f651f7cb/AI-Tiberius_Standing.png?content-type=image%2Fpng","left":"58%","bottom":"-5%","width":"30%","pose":"still"}' >> /* v2.10.44 (27 May 2026): Marcus is still playing. Music persists per author canon — every Mo Stór passage repeats the call with "continues" annotation until Marcus stops playing the lute. */ <<music "Irish Washerwoman" "traditional Irish jig played soft and low by Marcus · continues" "" "">> <<setoverlay "<p>You pressed. She set the cup down. The lute continued.</p>">> <<consentmoment "MoStor_press" "fangTrust" 0 "Fang gave me an unfinished sentence. I told her it wasn't enough." '{"offered":["that\u2019s not an answer","drink the tea, don\u2019t press","you don\u2019t have to tell me"],"chosen":"that\u2019s not an answer","silenceVariant":false,"replayVisible":true}'>> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "That's not an answer."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (small pause) "No. It is not."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "It is the answer I am giving you."</div> <<journalentry "what is fang hiding?" "fang's hiding something. i bet clare will say that i need to be patient. i want to know fang's backstory though." "[REL] mostor · unfinished-press">> <<sceneadvance "Lawrence arrives." "Demo4_MoStor_Briefing">>
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>She turns. The look she gives you is the one she does not give people who have not earned it.</p>">> <<soctrack "scene_enter" "PostChase_FangAck">> /* ─── Consent moment 4 (PostChase Fang Ack) — the soft trust-gated beat Spec §6.3 — fourth small consent moment, only fires on the bilateral-read path ($fangTrust >= 60 — i.e. HoldBeside or StepFront at A). Three options: reciprocate (warm), deflect (don't make it bigger), decline (refuse the framing). */ <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (quiet) "You held."</div> /* v2.10.47 (31 May 2026): Option C — deepen the existing trust-gated "You held" beat with Fang's protective "Fortune is mine" register. One added line, no change to gating/branches/consentmoment math. FENCE: Fang↔Fortune only — Lawrence, the charm, the pattern, and any history are NOT referenced (the Fang/Lawrence charm-tension is a banked full-game beat, Consent Arch Spec §5.2). "Keeping" is possessive in the found-family/protective sense, in Fang's flat operator register. PROTOTYPE — revert by deleting this one line. WATCH IN PLAYTEST: if "You should know that's what just happened" reads as too-much speech for Fang, trim to just the first sentence and let the silence carry it. */ <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "I don't fight beside people I'm not keeping. You should know that's what just happened."</div> <div class="d4-choices"> <<chasechoice "aggressive" "" "\"I had your back. You had mine.\"" "Demo4_PostChase_FangAck_Reciprocate">> <<chasechoice "tactical" "" "\"...Yeah. Let\u2019s keep moving.\"" "Demo4_PostChase_FangAck_Deflect">> <<chasechoice "trickster" "" "\"Don't make it a thing.\"" "Demo4_PostChase_FangAck_Decline">> </div>
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>She tilts her chin. The thing remains a thing whether you wanted it to or not.</p>">> <<consentmoment "PostChase_decline" "fangTrust" -5 "Fang said I held. I told her not to make it a thing." '{"offered":["i had your back, you had mine","keep moving","don\u2019t make it a thing"],"chosen":"don\u2019t make it a thing","silenceVariant":false,"replayVisible":false}'>> /* v2.10.47 (31 May 2026): journal entry CUT per author direction — FangAck decline beat leaned literary/transcript. consentmoment (fangTrust -5) untouched above. Re-add if playtest wants journal trace on this path. */ /* v2.10.47 (31 May 2026): rewrote per Journal Entry Rubric Filter 1 / Anti-pattern 2. Was transcript ("fang said i held. i told her not to make it a thing. she didn't make it a thing..."). Now leads with Ishani's reflection; keeps the decline-path meaning (she deflected, Fang read it anyway). */ <<advance "Walk to Mo Stór" "Demo4_PostChase_MoStorDoor">>
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>She lets it pass. She does not let it pass.</p>">> <<consentmoment "PostChase_deflect" "fangTrust" 0 "Fang said I held. I said yeah, and kept us moving." '{"offered":["i had your back, you had mine","keep moving","don\u2019t make it a thing"],"chosen":"keep moving","silenceVariant":false,"replayVisible":false}'>> /* v2.10.47 (31 May 2026): journal entry CUT per author direction — FangAck deflect beat literary. consentmoment (fangTrust 0) untouched above. Re-add if playtest wants it. */ /* v2.10.47 (31 May 2026): rewrote per Journal Entry Rubric Filter 1 / Anti-pattern 2. Was transcript ("fang said i held. i said yeah. she let it pass..."). Now leads with Ishani's reflection; keeps the deflect-path meaning (minimal answer, Fang gave room). */ <<advance "Walk to Mo Stór" "Demo4_PostChase_MoStorDoor">>
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>She nods. That is everything she has to say about it.</p>">> /* v2.10.45: Evidence atom for the matter_to_someone recap evaluator. The reciprocate variant is the substantive one — Ishani returns the ack rather than deflecting it ("yeah") or evading ("don't make it a thing"). This is the only one of the three Fang-ack branches that counts as evidence the player let themselves matter. */ <<script>> (function() { var V = State.variables; V.momentsThatMattered = V.momentsThatMattered || []; for (var i = 0; i < V.momentsThatMattered.length; i++) { if (V.momentsThatMattered[i] && V.momentsThatMattered[i].id === 'fang_ack_reciprocate') return; } V.momentsThatMattered.push({ id: 'fang_ack_reciprocate', passage: State.passage, session: 'tonight' }); })(); <</script>> <<consentmoment "PostChase_reciprocate" "fangTrust" 5 "Fang said I held. I told her we had each other\u2019s backs." '{"offered":["i had your back, you had mine","keep moving","don\u2019t make it a thing"],"chosen":"i had your back, you had mine","silenceVariant":false,"replayVisible":false}'>> /* v2.10.47 (31 May 2026): journal entry CUT per author direction — FangAck reciprocate beat literary. consentmoment (fangTrust +5) untouched above. Re-add if playtest wants it. */ <<advance "Walk to Mo Stór" "Demo4_PostChase_MoStorDoor">>
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>Mo Stór's door is the same door it always is. Tiberius always has it cracked an inch.</p>">> <<soctrack "scene_enter" "PostChase_DoorArrival">> <<advance "Step inside" "Demo4_MoStor_Arrival">> /* ═══════════════════════════════════════════════════════════════════════════ SECTION 3 — MO STÓR Arrival. Cardamom tea. Marcus's lute. Fang's unfinished sentence. Lawrence's cosmology. The tapestry that earns the party's trust. ═══════════════════════════════════════════════════════════════════════════ */
<<setchat "bubble">> <<setheader "SMYRNA · MO STÓR" "Late afternoon · 1402" "DEMO 5 · §2">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/794214b6-0767-492c-b743-e972820ba7b5/MoSto%CC%81r_Entrance_afternoon.png?content-type=image%2Fpng">> <<setactors>> /* v2.10.44: explicit clear — actor-free transition passage (setscene no longer auto-clears) */ <<setoverlay "<p>The entrance to Mo Stór sits at the bottom of a long, stone street. The third step from the bottom creaks, announcing your arrival.</p>">> <<soctrack "scene_enter" "Postchase_Transit">> <<soundprompt "ambient" "Smyrna harbor late-afternoon: gulls, distant water lapping at quay, cordage creak from anchored boats, market wind-down sounds (vendors calling closing prices, awnings being rolled). Footfalls on stone — Fortune and Fang walking, deliberate. ~45-second loopable bed.">> <<music "Heartbeat" "2PM · continues" "https://www.youtube.com/watch?v=8dWBzAetyXc" "">> /* v2.10.45: was <<musictransition>> Heartbeat → White Night (Forestella). Transition removed (caught in playtest) — this descent passage is too short for White Night to play before the player enters Mo Stór. Heartbeat continues here; Irish Washerwoman starts inside at MoStor_Arrival. White Night (Forestella, youtu.be/pOVNGANwcrk) is no longer referenced in this stretch. */ <<if not $moStorEntered>> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "Have you been here before?"</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "No. I've heard about it though."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "The tea is good. The company is... acquired."</div> <</if>> <<set $moStorEntered to true>> /* v2.00.21 (08 Jul): first-visit exchange gated on $moStorEntered. A hub-rester already set the flag (at Demo5_MoStor_Entrance), so they SKIP "Have you been here before?" here (they were just at Mo Stór) and go straight to the charm-aftermath beat below. Plot-only players arrive with the flag false → see the first-visit exchange, then set it. Either way it's true afterward. */ /* v2.10.48 (03 June 2026): all-branch charm-aftermath beat. Surfaces the B6 gaze-charm as FELT behavior, never named: Fortune's attention pulls back toward Lawrence (the look over the shoulder; the question is about where HE is going / when she'll see him), disguised as a tactical query. "Oh." carries the small unearned deflation. FENCE HOLDS: the text is purely logistical; charm is entirely in the subtext of why she asks. Fang answers flat-tactical — not annoyed at Fortune, faintly annoyed at LAWRENCE (the matriarch/Lawrence history), which is how it leaks. All branches (B7 always routes here); distinct from the $castMelons spell- depletion beat below (that stays cast-path-only). Author note: pull-only for now; tiredness stays exclusively the depletion beat — revisit per playtester read. Canon: dramatizes L-4 (charm working on her) as felt, not stated; Friday todo to revise the B6-fence language (charm now surfaces as felt aftermath across post-B6 branches; NAMING stays B6-only). */ <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (looks over her shoulder) "Is he leaving us to see the Matriarch?"</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "No, he said he’d meet us here. He’s probably making sure they leave town."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "Oh."</div> /* v2.10.47 (31 May 2026): deferred melon-cast cost beat. Per Magic Primer §1.3 amendment — adrenaline masked the cost mid-chase; it comes due now that she's stopped running, larger than the cast looked (the masking let her overspend). Placed HERE (universal, ungated walk) rather than in PostChase_FangAck (gated $fangTrust>=60) so every trickster-path caster gets the cost-system teaching beat. Two voices: Fang names the mechanism (250yr of watching human casters overspend under fire — cost-system curriculum, Standing Rules §A2); Fortune's journal echoes it (first-time-at-intensity). FENCE: Fang names the DEPLETION only, never the charm (charm beat is B6; these stay separate signals). Trickster-path-conditional. */ <<if $castMelons>> <<set $fortuneVIT -= 8>> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> (crouches down, breathing hard and in pain)</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> (glancing at how you're breathing) "That cast's catching up to you."</div> <div class="d4-dlg"><span class="d4-who --fortune">$avatarName:</span> "...I didn't feel it at the time."</div> <div class="d4-dlg"><span class="d4-who --fang">Fang:</span> "You never do, running. That's the trap of it, you can't feel what you're spending, so you spend too much. Seen it put down better casters than you. Pace it next time. There won't always be a next time to learn it in."</div> <<journalentry "the melons" "throwing melons at the vampires was fun and silly. i liked it." "[REL] postchase · cast-cost-late">> <</if>> /* ─── Section 2D: PostChase Fang Acknowledgment (gated) ────────────── If $fangTrust crossed the bilateral-read threshold during the chase (Beat 5 / A consent moment: HoldBeside or StepFront — i.e. not the passive Stay path), Fang turns toward Fortune at the harbor descent for a small fourth consent moment. Spec §6.3. Otherwise, demo continues directly to Mo Stór. */ <<if $fangTrust >= 60>> <<advance "Enter Mo Stór" "Demo4_PostChase_FangAck">> <<else>> <<advance "Enter Mo Stór" "Demo4_MoStor_Arrival">> <</if>>
<<set $avatarName = "Fortune">> <<set $playerDesire = "">> /* ─── CONSENT ARCHITECTURE STATS (per Spec §2 + §6) ───────────────────────── These are the bilateral-trust stats the closing surface composes against. Range: 1–100, baseline 50 at demo start. Per-moment deltas are roughly ±5 to ±15 (Spec §2.1). End-state is what the closing surface composes against. Baseline 50 ensures stats never go negative on any demo path — worst-case low ends at ~45, well above zero. Schema (locked per author 18 May; rubric clarified per Game Bible §15.3 update 22 May): <name>Trust = in-fiction character trust (e.g., fangTrust = Fang's read of Fortune as a fellow caravan guard) ishani<Name>Bond = IRL meta-layer bond (e.g., ishaniClareBond = Ishani's friendship with Clare-the-pilot) The suffix is load-bearing: Trust = in-fiction rubric, Bond = meta-layer rubric. See Game Bible §15.3 Surface-Rubric Mapping. TODO (architectural cleanup, parked): - $minjaeTrust on line below is misnamed under the new convention. It tracks MJ-as-Lawrence (the IRL pair's directorial state), which is meta-layer, not in-fiction. Under the locked convention it should be $ishaniMinjaeBond-adjacent or $minjaeDirectorial — NOT *Trust. Rename in a future twee pass once the canonical name is chosen. - The inline comment on $minjaeTrust below says "In-world: MJ-as- Lawrence's trust in Fortune" — that's a layer conflation. MJ lives meta-layer; Lawrence lives in-fiction. Two stats, two layers. Some chips tick one, some tick both via stat2/delta2 (dual-plane work). See SOC_Stat_System_Recommendation_v1.md for the longer rationale. */ <<set $fangTrust = 50>> /* In-world: Fang's read of Fortune. Beat 5 (A) is the primary mover; PostChase ack gates on >=60. */ <<set $minjaeTrust = 50>> /* In-world: MJ-as-Lawrence's trust in Fortune. */ <<set $lawrenceTrust = 50>> /* In-world: Lawrence's character trust in Fortune. Distinct from minjaeTrust iff Lawrence's interiority diverges from MJ's directorial intent later. */ <<set $ishaniClareBond = 50>> /* IRL: Ishani's bond with Clare-the- friend. Beat 3 (B1) primary mover. */ <<set $ishaniMinjaeBond = 50>> /* IRL: Ishani's bond with MJ-the-friend. Beat 3 (B2) primary mover. */ <<set $ishaniJeffBond = 50>> /* IRL: Ishani's bond with Jeff-the-friend. */ <<set $ishaniFangBond = 50>> /* IRL: Ishani's bond with Fang's pilot. Currently no chip writes; init'd for symmetry and future use. */ <<set $lawrenceFirstRead = "">> /* State, not graded stat. Set by Beat 6 (C). Values: "lean" / "anchor" / "name" / "default-anchor". */ /* ─── MOMENTS-THAT-MATTERED (per Spec §3) ─────────────────────────────────── Curation pool for the closing surface. Every <<consentmoment>> macro call pushes one record; player anchors 3 at closing. */ <<set $momentsThatMattered = []>> /* ─── DECLARED INTENTS (open questions the player has marked) ────────── v2.10.38 — Architecture B (consumed-when-asked queue) per author direction 18 May. Players can journal forward-pointing wishes ("I want to know more about X"); the engine records the intent here, then future passages can conditionally surface a chip / dialogue option to ask the question. When the player asks on a given surface, the intent can be consumed (removed) so it doesn't re-appear elsewhere. Consumption semantics (v2.10.38 initial implementation): B3 don't- consume-by-default. hasDeclaredIntent(tag) returns true once the intent is declared; consumeIntent(tag) removes it. Most surfaces that surface the chip will call consumeIntent() in the chip's reply handler, so the chip disappears from other surfaces after first ask. But the don't-consume default lets us delay decisions about whether a particular surface should remove the intent (e.g., if Clare's answer is a deflection that doesn't actually answer the question, maybe the chip should stay live for Fang to be asked too — that decision is made per-payoff, in the chip's handler). Storage shape: dict of tag → metadata object. metadata: { declaredAt: passage, declaredVia: source } Example: $declaredIntents["fang_stari_krov_story"] = { declaredAt: "Demo4_Chase_B2_Aggressive_Engage", declaredVia: "declareintent" } ─── DECLARED INTENTS LEDGER (v2.10.45) ───────────────────────────────── Maintained by author. Update when adding any of: <<declareintent>>, <<deflectintent>>, <<resolveintent>> Column "Feeds desire" planning column — names which $playerDesire options should read this tag's resolution state in their recap evaluator. | Tag | Declared at | Deflected at | Resolved at | Feeds desire | |------------------------|-----------------------------------|--------------------------|--------------------|--------------------------| | fang_stari_krov_story | Demo4_Chase_B2_Aggressive_Engage | Demo4_MoStor_Fang_Answer | Demo4_To_The_Dock | matter_to_someone, carry | Audit grep (run from project root against any Demo .twee): grep -nE '<<declareintent "|<<deflectintent "|<<resolveintent "|<<consumeintent "|_socHasDeclaredIntent\(|_socWasDeflected\(|_socWasAnswered\(' SOC_Demo4_*.twee Cross-reference output against ledger; anything unmatched is either a missing wire or a missing ledger entry. <<consumeintent>> hits are deprecation flags — should be migrated to <<resolveintent>>. ────────────────────────────────────────────────────────────────────── See: declareIntent(), hasDeclaredIntent(), consumeIntent() helpers (defined in the SugarCube setup block), and the <<declareintent>> / <<consumeintent>> macros for non-journal contexts. */ <<set $declaredIntents = {}>> /* ─── INTENT LOG (v2.10.45) ───────────────────────────────────────────── Permanent record of intent state transitions across the session. Distinct from $declaredIntents (active queue, purged on outcome) — $intentLog accumulates and is never purged. Used by end-of-session evaluators (e.g., the "did i get what i came for" recap at credits). Schema: $intentLog[tag] = { declared: { at: passage, via: source } | null, deflected: { at: passage, via: source } | null, answered: { at: passage, via: source } | null } Three flags are INDEPENDENT, not a state machine. A question can be deflected without prior declaration (the tea passage deflects for all players); answered without declaration (canon reveals that bypass player curiosity); or hit all three flags across a single playthrough. See: _socDeflectIntent(), _socResolveIntent(), window._socWasDeflected(), window._socWasAnswered(), window._socIntentLog() helpers, and the <<deflectintent>> / <<resolveintent>> macros. */ <<set $intentLog = {}>> /* ─── ENCOUNTER OUTCOMES LEDGER ───────────────────────────────────────── v2.10.49: Single source of truth for consequential-encounter results. Keyed by encounter id (like $intentLog is keyed by intent tag); accumulates, never purged. The game-wide outcome ledger — the dock is the first adopter; every future consequential encounter gets its own key under the SAME schema. This is a deliberate migration-durable contract: one shape to map into the engine-side save format when the project moves to Unreal, not N bespoke per-encounter var pairs. Schema: $encounterOutcomes[id] = { action: <string>, // what the PLAYER chose (the decision/button). // dock: "trickster" | "end_chant" | "killed_captain" // | "stood_down" | "stepped_back" | "walked_through" result: <string>, // what the WORLD became — DERIVED from `actors`, // never authored independently (B2 / single source // of truth). "clean" | "lethal". // "clean" = no death by anyone's hand (dock: trickster // ash path only — the canon register is "nobody died"). // "lethal" = at least one actor dead. actors: { <npcId>: <disposition> }, // per-NPC end state. Dispositions are // open-vocabulary per encounter. dock captain: // "alive" | "dead" | "walked" | "ash"; dock chanter: // "dead" | "ash". at: <passage>, // where it resolved (provenance, cf. intentLog.at) ts: <epoch ms> // resolution time } Set ONCE at encounter resolution via window._socSetEncounterOutcome(id, action, actors). `result` is computed inside the setter from `actors` so it cannot drift. Read EVERYWHERE downstream via window._socEncounterOutcome(id) — save-picker label (System 1, navigation) and recap/Victory/journal surfaces (System 2, evaluation, per Todo #12). Do NOT re-derive from raw R1/R2/R3 flags anywhere else; that duplication is the exact drift #12 exists to kill. */ <<set $encounterOutcomes = {}>> /* ─── B3 ARRIVAL-PATH TRACKING ────────────────────────────────────────── v2.10.38: Demo4_Chase_B3 receives players from two upstream routes (Dive vs Tactical/Trickster→Tactical). The canon-correct B3 content differs: - Dive players: never heard "war band" — B3 is the reveal moment - Tactical players: already had collaborative reveal at Side Street ("they want me alive") — B3 is the post-reveal beat This var is set in each predecessor passage before <<advance>> to B3. Values: "dive" | "tactical" | "" (uninitialized; B3 defaults to dive content as a fallback). */ <<set $arrivedB3Via = "">> /* ─── CHASE-STYLE STATS (in-world flavor, NOT consent architecture) ───────── These track which movement style the player favored during the chase. Used downstream so e.g. Lawrence can reference the specific micro-detail ("the side street" / "the melons" / "the wall-cut") later. They are NOT part of the consent system. */ <<set $dex = 0>><<set $flow = 0>><<set $end = 0>><<set $xp = 0>> <<set $chase = { aggressive: 0, tactical: 0, trickster: 0, detail: "", mjRunPushed: false, choicesMade: 0 }>> /* choicesMade: v2.00.05 — total chasechoice clicks, branch-blind counter driving whisper-surface unlock at 2. */ <<set $heartbeatCount = 0>> <<set $tibTellCount = 0>> /* ─── DOCK COMBAT STATE (v2.10.44 — Phase A + Phase B) ───────────────────── The dock encounter at Smyrna · Furthest Dock runs on a passage-tree model rather than the menu-driven combat engine used elsewhere. Per the design spec (May 27): Phase A is Fortune's solo agency test (3 rounds, 4 enemies, party in observer mode per Lawrence's "We will watch" directive); Phase B is the conditional party encounter triggered by chant completion. Fortune VIT: starts 100. Thresholds 80/50/30. Critical <30 (Recovery Fracture incoming if struck again). Tracked via $fortuneVIT. Mutterer HP: starts 55. Protected (-25% dmg) while both signal AND muscle are alive and in formation. Chant-failure threshold: HP ≤ 30 at end of R3 means chant CANNOT complete regardless of mutterer's survival. Chant clock: advances 1 beat per round unless disrupted. Completion at end of R3 fires Phase B. Disrupted twice across encounter = chant fails. */ <<set $fortuneVIT = 100>> <<set $muttererHP = 55>> <<set $signalAlive = true>> <<set $signalInFormation = true>> <<set $muscleAlive = true>> <<set $muscleInFormation = true>> <<set $captainAlive = true>> <<set $chantBeat = 1>> <<set $chantInterruptCount = 0>> /* v2.10.46 (29 May 2026): directorial vector + no-harm vow latch. $minjaeVector is set by the directorial chasechoice (hard/aware/soft); initialized empty so the R1-entry <<if>> gates are defined on a clean start and across save-game schemas that predate these vars. $nonviolentLock is the trickster no-harm vow — latched true in the soft branch at R1 entry, consumed by the first lock-break click. */ <<set $minjaeVector = "">> <<set $nonviolentLock = false>> /* v2.00.26 (08 Jul): dock board-state engine tracking (SOC_Combat_Architecture v1.0). $dockSpent gates posture rotation (a posture rotates out once used); $dockPrimary records the aggressive-triage target (wrong-target reads); $vowBroken latches if the player takes the lethal ceiling. Seeded here so a clean start / old save has them defined; SOC_DOCK.ensure() re-seeds defensively. */ <<set $dockSpent = { aggressive: false, tactical: false, trickster: false, negotiation: false }>> <<set $dockPrimary = "">> <<set $vowBroken = false>> /* v2.10.46 (29 May 2026): cast-capacity prototype meter (Reading-1, cheap). Fortune at L2 knows ONE working — manus motoria (move an object). Per the Magic Primer: no new spells without story, and "the location is part of the spell" — so the dock options are all the SAME spell pointed at different matter (rope / net / yardarm / box / a body). Cost scales with mass. $fortuneCast is felt, not metered: NO HUD this build. It surfaces only in prose (breath catches, hand trembles, nosebleed). It exists so the architecture is present to evolve when the full magic system is designed; the starting value and per-cast costs are deliberately UNBALANCED prototype numbers, not a tuned economy. When it runs low, the Step Back (ask the team to disable, don't kill) becomes the rewarded mastery move — the trickster path's equivalent of Demo 3's No-Recovery-Fracture step-back. */ <<set $fortuneCast = 3>> <<set $castMelons = false>> /* v2.10.47: latched true at B2_Trickster melon cast; gates the deferred cost beat on the post-chase walk + the depletion-scaled charm hit. Path-conditional (trickster only). */ <<set $R1_castNet = false>> <<set $R1_castYardarm = false>> <<set $R1_castWater = false>> <<set $trickster_stepback = false>> /* Per-round R1/R2/R3 continuity flags — drive R2 menu restructure, captain's R3 response gating, and Lawrence's dialogue branching. */ <<set $R1_struckChanter = false>> <<set $R1_capitanHeld = false>> <<set $R1_baited = false>> <<set $R1_cutThrough = false>> <<set $R1_spoke = false>> <<set $R1_captainAnsweredR1 = false>> <<set $R2_pressedChanter = false>> <<set $R2_disabled = false>> <<set $R2_named = false>> <<set $R2_stepBack = false>> <<set $R3_walkThrough = false>> <<set $R3_killedCaptain = false>> <<set $R3_standDown = false>> <<set $D4_firstKill = false>> <<set $captainR3Response = "">> /* "lowers" | "strikes" | "speaks" | "walks" */ /* ─── SCENE-PROSE QUEUE (Section 2A) ─────────────────────────────────────── The unspoken-layer surface lives in the left-pane overlay. Multiple paragraphs queue here and reveal cumulatively as the player advances within a passage. Cleared on passage transition. */ <<set $_sceneQueue = []>> /* array of { kind, html } */ <<set $_sceneRevealed = 0>> /* index of last revealed paragraph */ <<set $_sceneRevealTarget = "overlay">> /* v2.00.16 (07 Jul) — B-1: reveal render target. 'overlay' (default, legacy) renders the sceneprose queue into the .d4-scene-overlay card OVER the art; 'prose' renders it into the .d4-lower-row prose column BELOW the art (roomy, art stays clear). A passage opts into prose-column reveal with <<set $_sceneRevealTarget = "prose">> before its <<sceneprose>> calls. Reset to 'overlay' on every scene clear so it never leaks across passages. */ <<set $_sceneActors = []>> /* v2.6: array of { src, left, bottom, width, z, flip } */ <<set $_whisperReplyPending = []>> /* v2.6: chips awaiting Ishani’s reply (the ACTIVE cluster the UI reads) */ <<set $_whisperClusterQueue = []>> /* v2.00.09 (06 Jul): FIFO of WAITING reply-clusters behind the active one. Design A: when a second <<whisperreply>> fires while a cluster is still pending, it queues here instead of clobbering $_whisperReplyPending (the orphan bug). Drains one cluster into the active slot per chip-answer. Whisper-only; guild path untouched. Each queued cluster carries an optional surfaceDelayMs (inert default now; the scene-driven chatTempo layer scales it later). */ <<set $_lastChipAnswerTurn = 0>> /* v1.01.10: last turn any chip was picked (Disengagement primitive, July-15 system) */ <<set $_whisperReplyThread = null>> /* v2.10.43: thread chips belong to (e.g., "clare", "minjae") */ <<set $_whisperActiveThread = null>> /* v2.10.43: active sub-tab; null = use default-thread rules */ <<set $_guildReplyPending = []>> /* v2.6: chips awaiting Ishani's public reply */ <<set $pendingWhispers = []>> /* v2.6: queued Clare-responses, fire on passage entry */ /* ─── PORTRAITS ─────────────────────────────────────────────────────────── */ <<set $portraits = { fortune: "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/97faf03a-a19a-4252-b84a-191beed05a44/Fortune_Portrait.png?content-type=image%2Fpng", fang: "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/10c17a56-892e-48ae-97f2-1f5b95476850/Fang_Portrait.png?content-type=image%2Fpng", lawrence: "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/c76820c6-58b5-4b3b-8a2d-291dd451c433/Lawrence_Portrait2.png?content-type=image%2Fpng", marcus: "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/82a9d763-f9e7-49e7-9270-f3508203cf91/Marcus_Portrait.png?content-type=image%2Fpng", tiberius: "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/a12855a8-a83c-485c-b3b1-c1a24a1746bb/Tiberius-headshot.png?content-type=image%2Fpng" }>> /* ─── NPC PRESENTATION STATE (per SOC_NPC_Presentation_Standard_v1_0) ──── $npcsMet tracks recurring-NPC intro cards. Set true after card fires; read by <<npcintro>> to suppress repeat firings. Per-save only for D4. $_lastSpeaker is the per-passage run-collapse tracker for <<dlg>>. */ <<set $npcsMet = {}>> /* ─── GUILD ROSTER ──────────────────────────────────────────────────────── */ /* v2.10.6: Roster name for Ishani's slot changed from "You" to "Ishani" to match how the other three pilots are labeled (Clare/Fang, Song Min-jae/Lawrence, Jeff/Marcus — pilot's name / character's name). Per Easter-Egg Inventory EE-004 (mirror-held-open) and Register Style Sheet v1.9.9 §1 Per-Pilot Trust Asymmetry: Ishani is a peer at the table, not a special-cased second-person "you." Interface convention of "You" labels was creating daylight between player and Ishani that the consent architecture is built to dissolve. Single-source change: cascades automatically to roster identity chip ("Ishani / Fortune"), chip-stack avatar letter ("I"), chat message author labels ("Ishani · now: starting"), and chat message portrait avatars. CSS class names .--you and .--me intentionally NOT renamed — internal scaffolding, stable. */ <<set $chatRoster = [ { id: "you", name: "Ishani", handle: "fortune", status: "online" }, { id: "clare", name: "Clare", handle: "fang", status: "online" }, { id: "minjae", name: "Min-jae", handle: "lawrence", status: "online" }, { id: "jeff", name: "Jeff", handle: "marcus", status: "online" } ]>> /* ─── GUILD TAB LOG ───────────────────────────────────────────────────────── Public guild chat. Each entry: { kind: 'day'|'quiet', text } or { who, time, text, read }. read=true → muted (yesterday's scrollback). */ <<set $chatLog = [ { kind: "day", text: "yesterday" }, { who: "jeff", time: "6:31 PM", text: "Mo Stór tomorrow?", read: true }, { who: "jeff", time: "6:31 PM", text: "usual time", read: true }, { who: "clare", time: "6:48 PM", text: "i'm in", read: true }, { who: "minjae", time: "7:02 PM", text: "see you there", read: true }, { who: "jeff", time: "7:14 PM", text: "marcus has a new song", read: true }, { kind: "day", text: "today" } ]>> /* ─── WHISPER TAB LOG ─────────────────────────────────────────────────────── Private one-to-one IRL channels. Each entry: { from, to, time, text, read }. The Clare priming whisper at Beat 1 ("hey fyi mj is dealing with personal stuff tonight") fires here. */ <<set $whisperLog = []>> /* ─── JOURNAL TAB LOG ─────────────────────────────────────────────────────── Ishani's gamer-voice journal. Each entry: { title, body, tag, time }. Populated by <<journalentry>> macro. Surfaces as anchorable candidates on the closing-surface curation interaction. */ <<set $journalLog = []>> /* ─── ACTIVE TAB ──────────────────────────────────────────────────────────── Which right-pane tab is currently showing. Default to GUILD; the priming-whisper at Beat 1 will switch to WHISPER once for the tutorial. */ <<set $activeChatTab = "guild">> <<set $tabUnread = { guild: false, whisper: false, journal: false }>> /* v2.00.02 — PROGRESSIVE DISCLOSURE ledger. The Table reveals its surfaces as they become necessary, so a cold player meets guild chat first (one scrolling column) instead of the full four-pilot / three-tab / roster HUD on second zero. Unlock is MONOTONIC (one-way latch via <<unlocksurface>>); once true, a surface never re-locks. FAIL-SAFE: buildChatHTML treats an UNDEFINED $tableSurfaces as all-true, so every existing passage renders the full Table exactly as before — this change is purely additive; only passages that opt in (set surfaces false, then unlock) get gating. roster stays locked until party > 2-with-Fortune (author 03 Jul). */ <<set $tableSurfaces = { guild: true, whisper: false, journal: false, roster: false }>> <<set $partyJoined = { you: true, clare: true, jeff: false, minjae: false }>> /* v2.00.22 (08 Jul): PROGRESSIVE ROSTER membership gate. Keyed by pilot id (roster/portrait key). You (Ishani/Fortune) + clare (Fang) are the core party from the start. jeff (Marcus) joins at the plot Mo Stór arrival; minjae (Lawrence) joins at the briefing. The roster grid renders a FILLED cell for joined members and a HELD-SEAT placeholder for not-yet-joined ones, in a FIXED seat order (you, clare, jeff, minjae) so Lawrence's specific chair (cell 4) is the one held empty until he arrives. Gate is monotonic in practice (members only join), set via <<partyjoin "id">> at the reveal beats. */ /* ─── CHAT MODE ───────────────────────────────────────────────────────────── 'pane' = always-open (tutorial); 'bubble' = collapsed-with-popup. */ <<set $chatMode = "pane">> <<set $chatModeManual = false>> /* v2.6: true once player explicitly closes pane */ <<set $chatTutorialShown = false>> <<set $whisperTutorialShown = false>> /* Legacy v1.1 vars retained for compatibility with existing chase passages */ <<set $fang = 0>><<set $lawrence = 0>> <<set $journal = []>> <<set $buildScope = "DEMO4">>
<<setchat "bubble">> <<setheader "ONE RING — CLASSIFIER DEMO" "Sandbox · token-free mock" "DEMO 5 · DEV">> <<setscene "https://images.squarespace-cdn.com/content/69b081e46b04f75d4e5e8c7f/f606323b-590f-4d2e-b776-8bf9c3a40ca0/Merchant_Quarter_Alley_Fight.png?content-type=image%2Fpng">> <<soctrack "scene_enter" "OneRing_Demo">> /* DEMONSTRATOR BEAT (Option A, 25 Jun 2026). Proves the <<onering>> macro → orMockClassify → route pipeline end-to-end in the actual build, token-free. Type any input; the mock classifies it (disclosure / action / impossible / unsafe / out_of_tone / drift) and the panel shows the route it would dispatch to (trust_engine / intent_engine / refusal_ladder / narrative_gravity), the secondary class if any, the default rung, the reading, and confidence. This is a SANDBOX — it shows the route rather than acting on it. The real integration is "B" (One Ring as pre-filter upstream of trustvetting; see SOC_Todo). Not linked into the main flow — navigate here directly in Twine to test, or call orSelfTest() in the browser console for the plumbing-corpus check. */ <div class="d4-prose"><p class="--ingame">The One Ring, offline. Type anything below — a confession, an action, an impossible demand, a hostile jab, a non-sequitur — and watch which engine it routes to. This is the token-free mock; the lexicon is a keyword heuristic, not real judgment (that arrives with the live model).</p></div> <<onering "OneRing_Demo">>