JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<main class="rc-about-page" aria-labelledby="rc-about-title"> <header class="rc-about-topbar"> <p class="rc-about-record">Survival record <strong>RC-2037 / Overview</strong></p> <a class="rc-about-return" data-passage="MainMenu"><span aria-hidden="true">←</span> Return to menu</a> </header> <section class="rc-about-hero" aria-labelledby="rc-about-title"> <div class="rc-about-hero-copy"> <p class="rc-about-overline">Day 180 / The world after the fall</p> <h1 id="rc-about-title">About the <span>game</span></h1> <p class="rc-about-lead">Six months after the dead began to move, your supplies are running out. You leave home, secure a small house, and begin to find out who else survived.</p> </div> <figure class="rc-about-hero-art" aria-hidden="true"> <div class="rc-about-skyline"><i></i><i></i><i></i><i></i><i></i></div> <figcaption class="rc-about-caption">City status / Collapsed</figcaption> </figure> </section> <section class="rc-about-intro" aria-label="The premise"> <p class="rc-about-section-label">01 / The premise</p> <div> <p>Risen City is a browser survival story. The streets are dangerous, useful supplies are scarce, and other survivors have needs and plans of their own.</p> <p>Your choices shape individual encounters and who may share your safehouse. Exploring reveals routes to places beyond your first neighborhood.</p> </div> </section> <section class="rc-about-features" aria-labelledby="rc-about-features-title"> <div class="rc-about-features-head"><h2 id="rc-about-features-title">In this build</h2><span class="rc-about-tag">Field capabilities / Alpha</span></div> <div class="rc-about-grid"> <article class="rc-about-card"><span class="rc-about-card-number">01 /</span><div><h3>Explore & scavenge</h3><p>Search the ruins, discover locations, and hunt for food while watching your stamina.</p></div></article> <article class="rc-about-card"><span class="rc-about-card-number">02 /</span><div><h3>Survive encounters</h3><p>Manage health, provisions, weapons, and medkits. Some threats lead to combat.</p></div></article> <article class="rc-about-card"><span class="rc-about-card-number">03 /</span><div><h3>Meet survivors</h3><p>Make choices in character encounters and follow the stories that unfold from them.</p></div></article> <article class="rc-about-card"><span class="rc-about-card-number">04 /</span><div><h3>Keep a safehouse</h3><p>Interact with residents, assign available work, and trade for supplies at the settlement.</p></div></article> </div> </section> <div class="rc-about-notes"> <section class="rc-about-note" aria-labelledby="rc-about-play-title"><h2 id="rc-about-play-title">Before you play</h2><p>Choose a name to start a new story. Use Saves in the main menu to save or load, and export a save file if you want a separate copy. Settings controls music and sound.</p><p>This is an alpha build; story content and systems are still in development.</p></section> <aside class="rc-about-note rc-about-warning" aria-labelledby="rc-about-warning-title"><h2 id="rc-about-warning-title">Adults only / 18+</h2><p>Contains explicit sexual content, coercion and enslavement themes, violence, and disturbing imagery. Some character routes involve abuse or captivity.</p></aside> </div> <footer class="rc-about-foot"><span>Risen City / Survival record</span><span>End of overview</span></footer> </main>
<style> body { background: #121212; color: #e0e0e0; font-family: 'Courier New', monospace; line-height: 1.6; text-shadow: 0 0 5px rgba(255, 255, 255, 0.3); } .dialogue { background: #191a17; border-left: 4px solid #9a3b30; padding: 10px; margin: 10px 0; border-radius: 5px; box-shadow: 0 2px 10px rgba(154, 59, 48, 0.4); } .dialogue span { display: block; margin: 5px 0; } .choice-container { display: flex; justify-content: center; gap: 15px; margin: 20px 0; } .choice-container .button { padding: 10px 20px; background: #292a25 !important; color: #ffffff !important; text-decoration: none; border: 2px solid #9a3b30 !important; border-radius: 5px; transition: all 0.3s; box-shadow: 0 0 8px rgba(154, 59, 48, 0.4); text-shadow: 0 0 3px rgba(255, 255, 255, 0.5); } .choice-container .button:hover { background: #292a25 !important; transform: scale(1.05); box-shadow: 0 0 15px rgba(154, 59, 48, 0.7), 0 0 30px rgba(154, 59, 48, 0.4); text-shadow: 0 0 5px #ffffff; } .reward { color: #22ff88; font-weight: bold; text-shadow: 0 0 8px rgba(34, 255, 136, 0.6); animation: glow 3s infinite; } @keyframes glow { 0% { text-shadow: 0 0 5px rgba(34, 255, 136, 0.6); } 50% { text-shadow: 0 0 15px rgba(34, 255, 136, 0.8), 0 0 30px rgba(34, 255, 136, 0.4); } 100% { text-shadow: 0 0 5px rgba(34, 255, 136, 0.6); } } </style> <img src="assets/cast/cory.jpg" alt="Cory" class="character-image"> <<if !$player.met_cory>> <<set $player.met_cory = true>> <<set $player.cory_dialogue_state = "initial">> <div class="dialogue"> <span>*You enter the administration building. A stern woman, Cory, leader of this settlement, eyes you sharply.*</span> <span>"New face, huh? I'm Cory. We survive here, but it’s tough. Got anything to offer?"</span> </div> <div class="choice-container"> <a class="button" data-rc-admin-action="ask-work">Ask for work</a> <a class="button" data-passage="Settlement">Leave</a> </div> <<elseif $player.cory_dialogue_state is "ask_work">> <div class="dialogue"> <span>*Cory leans forward.*</span> <span>"Work, huh? We always need fresh meat to feed the settlement and slaves to keep things running. Interested?"</span> </div> <<if !$player.meat_quest_active>> <div class="dialogue"> <span>"Quest: Bring 20 units of raw meat. Reward: 100 coins."</span> <span> <a class="button" data-rc-admin-action="accept-meat">Accept Meat Quest</a> </span> </div> <</if>> <<if !$player.slave_quest_active and $slave_quest_completed == 0>> <div class="dialogue"> <span>"Quest: Capture and deliver two slaves. Reward: 500 coins and a shotgun."</span> <span> <a class="button" data-rc-admin-action="accept-slaves">Accept Slave Quest</a> </span> </div> <</if>> <div class="choice-container"> <a class="button" data-rc-admin-action="back">Back to Cory</a> <a class="button" data-passage="Settlement">Leave</a> </div> <<elseif $player.meat_quest_active or $player.slave_quest_active>> <div class="dialogue"> <span>*Cory looks at you expectantly.*</span> <span>"Back already? Got what I asked for?"</span> </div> <<if $player.meat_quest_active and $player.Raw_meat gte 20>> <div class="dialogue"> <span>*You hand over 20 units of raw meat.*</span> <span>"Good haul. This’ll feed us for a while." *Cory hands you 100 coins.*</span> <span class="reward">*Received 100 coins.*</span> <<set $player.Raw_meat -= 20>> <<set $player.Caps += 100>> <<set $player.meat_quest_active = false>> <<set $player.quests = $player.quests.filter(quest => quest !== "Bring 20 Meat")>> </div> <<elseif $player.meat_quest_active>> <div class="dialogue"> <span>"Still need that meat. At least 20 units. Keep hunting."</span> </div> <</if>> <<if $player.slave_quest_active and $player.slaves gte 2>> <div class="dialogue"> <span>*You deliver two captured slaves to Cory.*</span> <span>"Impressive work. They’ll serve the settlement well." *She hands you a pouch of coins and a shotgun.*</span> <span class="reward">*Received 500 coins and a Shotgun.*</span> <<set $player.slaves -= 2>> <<set $player.Caps += 500>> <<set $player.Shotgun +=1>> <<set $player.slave_quest_active = false>> <<set $slave_quest_completed = 1>> <<set $player.quests = $player.quests.filter(quest => quest !== "Capture 2 Slaves")>> </div> <<elseif $player.slave_quest_active>> <div class="dialogue"> <span>"Where are the slaves? I need two. Don’t waste my time."</span> </div> <</if>> <div class="choice-container"> <a class="button" data-rc-admin-action="ask-work">Ask for more work</a> <a class="button" data-passage="Settlement">Leave</a> </div> <<else>> <div class="dialogue"> <span>*Cory nods as you approach.*</span> <span>"Got business? We’re always looking for capable hands."</span> </div> <div class="choice-container"> <a class="button" data-rc-admin-action="ask-work">Ask for work</a> <a class="button" data-passage="Settlement">Leave</a> </div> <</if>>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / EMILY</span><h1>Accept</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-sequence-report"> <h2>Accepting Emily</h2> <<run setup.recruitResident($player, "emily_status", "ally")>> <p> You agree to take her with you. Emily starts to thank you, stops, then tries again. She says she can help around the house. </p></section></div> <nav class="rc-sequence-actions"> <a class="button" data-passage="Safehouse">Return home</a> </nav></main>
<main class="rc-task-page rc-task-result-page rc-task-result-cleared"> <figure class="rc-task-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Emily</h1><p>Task canceled</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>No task assigned</strong></div> <div class="rc-task-result-copy"><p>You recall Emily from her task. She is now available for other interactions.</p> <<set $player.emily_work = "none">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<div class="scene-content"> <div class="scene-text"><p>You stay by the gate. Emily watches your hand on the latch.</p></div> <<run setup.recruitResident($player, "emily_status", "slave")>> <div class="npc-character"> <div class="dialogue-line"> <span class="speaker-label">(Emily)</span> You can open it, right? </div> </div> <div class="player-character"> <div class="dialogue-line"> <span class="speaker-label">(You)</span> I can. But if you come with me, you do what I say. You'll be my slave. </div> </div> <div class="npc-character"> <div class="dialogue-line"> <span class="speaker-label">(Emily)</span> I... I can work. I used to answer phones and keep records. I can learn something else. Please, just don't leave me here. </div> </div> <div class="player-character"> <div class="dialogue-line"> <span class="speaker-label">(You)</span> Then say you understand. </div> </div> <div class="npc-character"> <div class="dialogue-line"> <span class="speaker-label">(Emily)</span> (looking at the gate) Yes. I understand. </div> </div> <div class="scene-text"><p>You lift the gate. Emily ducks under it and follows you out of the supermarket.</p></div> <div class="choice-container"><a class="button dark-choice" data-passage="Safehouse">Return home</a></div> </div>
<main class="rc-scream-page rc-emily-reveal"><header class="rc-scream-header"> <span class="rc-ui-kicker">OUTSIDE / FIRST CONTACT</span><span class="rc-scream-alert">SURVIVOR FOUND</span> <h1>Emily</h1><p class="rc-scream-context">Behind the security gate</p></header> <figure class="rc-scream-portrait"><img src="assets/cast/emily.jpg" alt="Emily inside the abandoned supermarket"></figure> <div class="rc-scream-copy"> <p> At the back of the supermarket, you find a young woman behind a jammed security gate. She holds a bent metal bar, but puts it down when she sees you. </p> <p> "Oh, thank God. Two bandits attacked me outside two days ago. I ran in here and pulled the gate down. Now it won't open. Can you help me?" </p> </div> <nav class="rc-scream-actions"><a class="button dark-choice" data-passage="Emily_Enslave">Offer to make her a slave</a> <a class="button" data-passage="Emily_Help">Help her</a><a class="button" data-passage="Emily_Leave">Leave her to die</a></nav> </main>
<div class="scene-content"> <div class="dialog-container"> <p class="narrator-text">Emily pauses for a moment, searching for the right words.</p> <div class="emily-dialog"> <<if $player.emily_status == "slave">> <p>"I thought you'd help when you came to the gate. I should have asked what you wanted first. I still think about my group. I don't know what happened to them."</p> <<else>> <p>"I keep wondering if my group came back after I left. I know it doesn't make sense, but... I still listen for them sometimes. Thank you for letting me stay. I can help, really."</p> <</if>> </div> </div> <div class="choice-container"> <a class="button neutral-choice" data-passage="Emily_Talk_Menu">Return to the conversation</a> </div> </div>
<div class="scene-content"> <div class="scene-text"> <p>You force the gate up. The woman ducks under it, almost trips, then brushes the dust from her clothes.</p> </div> <div class="npc-character"><div class="dialogue-line"><span class="speaker-label">(Emily)</span> Oh. You really got it open. I'm Emily. Thank you. My friends haven't come back, and I... I don't have anywhere to go. Could I come with you?</div></div> <div class="choice-container"> <a class="button dark-choice" data-passage="Emily_Accept">Accept her</a> <a class="button" data-passage="Emily_Reject">Refuse</a> </div> </div>
<main class="rc-resident-page"> <header class="rc-resident-header"><div class="rc-resident-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></div> <div class="rc-resident-identity"><span class="rc-ui-kicker">SAFE HOUSE / RESIDENT</span><h1>Emily</h1> <div class="rc-resident-facts"><div><span>Status</span><strong><<if $player.emily_status == "slave">>Slave<<else>>Ally<</if>></strong></div> <div><span>Current task</span><strong><<if $player.emily_work == "scavenging">>Scavenging for supplies<<elseif $player.emily_work == "Cooking">>Cooking<<else>>None<</if>></strong></div></div> </div></header> <section class="rc-resident-options"><div class="rc-resident-options-heading"><span class="rc-ui-kicker">AVAILABLE ACTIONS</span><h2>Spend time with Emily</h2></div> <nav class="rc-resident-actions" aria-label="Interact with Emily"> <a class="rc-resident-action" data-passage="Emily_Talk_Menu"><span>01 / Conversation</span><strong>Talk</strong><small>Speak with Emily</small></a> <<if $player.emily_status == "slave" && $player.emily_work != "scavenging">> <a class="rc-resident-action rc-resident-action-private" data-passage="Emily_Service"><span>02 / Private</span><strong>Have sex</strong><small>Spend time together</small></a> <</if>> <a class="rc-resident-action" data-passage="Emily_Work"><span>03 / Work</span><strong>Assign a task</strong><small>Choose a job for Emily</small></a> </nav> </section><nav class="rc-resident-exit"><a class="button back-btn" data-passage="Safehouse">← Back</a></nav> </main>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / EMILY</span><h1>Leave</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-sequence-report"> <h2>Fate of Emily</h2> <<set $player.emily_status = "dead">> <p> You decide to leave her to her fate. Her cries for help gradually fade into the distance... </p></section></div> <nav class="rc-sequence-actions"> <a class="button" data-passage="Safehouse">Return home</a> </nav></main>
<div class="scene-content"> <div class="dialog-container"> <p class="narrator-text">Emily takes a deep breath, gathering her thoughts.</p> <div class="emily-dialog"> <p>"I worked reception at the police station. I answered calls, took reports, tried to calm people down while they waited. I wasn't an officer. When the epidemic started, I kept telling people help was coming. I believed it for longer than I should have."</p> <p>"After the station emptied, I stayed with a group of survivors. A week ago, they went out for food and never came back. I waited. I kept telling myself they were just taking the long way home."</p> <p>"Two days ago, I went looking for supplies on my own. Two bandits attacked me outside the supermarket. I ran into the service corridor and pulled down the security gate. It kept them out, but then it wouldn't open again. I thought someone might hear me. You did."</p> </div> </div> <div class="choice-container"> <a class="button neutral-choice" data-passage="Emily_Talk_Menu">Return to the conversation</a> </div> </div>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / EMILY</span><h1>Reject</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-sequence-report"> <h2>Rejecting Emily</h2> <<set $player.emily_status = "rejected">> <p> You refuse her. Emily looks heartbroken but nods in understanding and walks away. </p></section></div> <nav class="rc-sequence-actions"> <a class="button" data-passage="Safehouse">Return home</a> </nav></main>
<<if $player.stamina < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><img src="assets/cast/emily.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Emily</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Emily_Interact">← Back</a> </div> </div> <<else>> <div class="scene-content rc-service-page" data-rc-service="emily"> <header class="rc-service-header"><img src="assets/cast/emily.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Emily</h1></div></header> <div class="scene-text"> <p> Emily obediently waits for your orders, ready to fulfill any of your desires. </p> </div> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/emily/blowjob (1).webm" type="video/webm"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="anal" role="button" tabindex="0">Anal</a> <a class="service-btn" data-rc-video="cum" role="button" tabindex="0">Finish</a> </div> <a class="button back-btn" data-passage="Emily_Interact">← Back</a> </div> </div> <</if>>
<main class="rc-task-page rc-task-result-page rc-task-result-assigned"> <figure class="rc-task-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Emily</h1><p>Task assigned</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>Scavenging</strong></div> <div class="rc-task-result-copy"><p>You send Emily to scavenge for supplies in the city. It's a dangerous task, but necessary for survival.</p> <<set $player.emily_work = "scavenging">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<div class="scene-content"> <div class="dialog-container"> <<if $player.emily_status == "ally">> <p class="narrator-text">Emily stops fiddling with her sleeve when you approach.</p> <div class="emily-dialog"> <p>"Oh. Did you need something?"</p> </div> <<elseif $player.emily_status == "slave">> <p class="narrator-text">Emily lowers her eyes when you approach.</p> <div class="emily-dialog"> <p>"Yes, master?"</p> </div> <</if>> <div class="dialog-options"> <a class="button light-choice" data-passage="Emily_Past">Ask about her past</a> <a class="button light-choice" data-passage="Emily_Feelings">Ask about her feelings</a> <a class="button neutral-choice" data-passage="Emily_Interact">End the conversation</a> </div> </div> </div>
<main class="rc-task-page"><figure class="rc-task-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-task-body"><header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Emily</h1><p>Assign a task</p></header> <<if $player.emily_work != "none">> <div class="rc-task-current"><span>Current assignment</span><strong><<print $player.emily_work>></strong> <a class="button danger-choice" data-passage="Emily_Cancel_Work">Cancel task</a></div> <<else>> <nav class="rc-task-options" aria-label="Tasks for Emily"> <a class="rc-task-option" data-passage="Emily_Start_Scavenging"><span>01 / Outside</span><strong>Start scavenging</strong><small>Search for supplies on the next day</small></a> <a class="rc-task-option" data-passage="Emily_Cooks"><span>02 / Safe house</span><strong>Cooking</strong><small>Prepare food when raw meat is available</small></a> </nav> <</if>> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Emily_Interact">← Return to Emily</a></nav> </section> </main>
<main class="rc-task-page rc-task-result-page rc-task-result-assigned"> <figure class="rc-task-portrait"><img src="assets/cast/emily.jpg" alt="Emily"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Emily</h1><p>Task assigned</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>Cooking</strong></div> <div class="rc-task-result-copy"><p>Emily tries to cook something edible.</p> <<set $player.emily_work = "Cooking">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<main class="rc-settlement-page rc-place-page"> <header class="rc-settlement-heading"> <div><span>Settlement / Social</span><h1>Bar Matriarch</h1></div> <p>A fortified bar built from machine parts and bulletproof glass. Salvaged trophies and the names of fallen residents cover the walls.</p> </header> <section class="rc-npc-panel"> <div class="rc-npc-portrait"><img src="assets/cast/lesana.jpg" alt="Lesana"></div> <div class="rc-npc-copy"> <span>Available NPC / Proprietor</span> <h2>Lesana</h2> <p>Stern but fair, Lesana commands the room from behind the bar. She is the person available to speak with here.</p> <nav class="rc-npc-actions choice-container"> <<if $player.lesana_status == "unknown">><a class="button" data-passage="Lesana_First_Dialog">Talk with Lesana</a> <<else>><a class="button" data-passage="Lesana_Talk_Menu">Talk with Lesana</a><</if>> <a class="button back-btn" data-passage="Settlement">Return to Settlement</a> </nav> </div> </section> </main>
<<set $player.current_location = "Bunker">> <<set $player.stamina = Math.max(0, $player.stamina - 10)>> <div class="scene-content"> <div class="scene-text"> <h2>Abandoned Bunker</h2> <p>The bunker's metal doors are sealed. Its keypad is dark; whatever powered the lock failed long ago.</p> <<if $bunker_quest_progress == "Phase 1" or $bunker_quest_progress == "Complete" or $bunker_quest_progress == "END">> <p>Kenzie's marked route skirts the bunker and follows the ridge toward Mistral Mansion.</p> <<else>> <p>Scars in the ground lead toward the ridge. Kenzie believes a separate building lies beyond it, but has not found a safe way in.</p> <</if>> </div> <div class="choice-container"> <<if $bunker_quest_progress == "Phase 1" or $bunker_quest_progress == "Complete" or $bunker_quest_progress == "END">> <a class="button" data-passage="Bunker_To_Mistral">Go to Mistral mansion</a> <</if>> <a class="button" data-passage="Outside">Return</a> </div> </div>
<<if $player.Caps >= 400>> <<set $player.Caps -= 400>> <<set $player.slaves += 1>> <<goto "Slave_Market">> <<else>> <<goto "Slave_Market">> <</if>>
<main class="changelog-page rc-release-page"> <header class="changelog-header rc-release-header"> <div class="rc-release-heading"> <p class="rc-release-kicker">RISEN CITY / RELEASE FILE 001</p> <h1>Changelog</h1> <p class="rc-release-subtitle">What you can play in the first build.</p> </div> <a class="rc-release-back" data-passage="MainMenu"><span aria-hidden="true">←</span> Return to menu</a> </header> <div class="rc-release-edition"> <div><span>Current build</span><strong>Version 0.1 Alpha</strong></div> <p>The city is open. Start with a safehouse, find your way through the ruins, and decide who comes home with you.</p> </div> <div class="rc-release-grid" aria-label="Contents of this build"> <section class="rc-release-section"> <h2><span>01 / START</span> Your first days</h2> <ul> <li>Name your survivor, leave home after six months indoors, and secure a safehouse with a room, water, and food.</li> </ul> </section> <section class="rc-release-section"> <h2><span>02 / MAP</span> Places to explore</h2> <ul> <li>Search the city and discover the bunker, old farm, city center, survivor settlement, and forest.</li> <li>Reach Mistral Mansion through Kenzie's investigation.</li> </ul> </section> <section class="rc-release-section"> <h2><span>03 / SYSTEMS</span> Survival and combat</h2> <ul> <li>Scavenge for supplies, hunt for meat, manage food, health, stamina, inventory, and rest.</li> <li>Buy, sell, and equip weapons. Fight raiders and mutated creatures with attack, defend, and healing actions.</li> </ul> </section> <section class="rc-release-section"> <h2><span>04 / PEOPLE</span> Survivors and settlement</h2> <ul> <li>Meet Sophia, Emily, Lena, Lesana, Cory, and Kenzie. Speak with them and make choices about trust, work, and life at your safehouse.</li> <li>Visit the settlement's market, bar, administration, residential district, and adult services.</li> </ul> </section> <section class="rc-release-section rc-release-feature"> <h2><span>05 / FIRST QUEST</span> The Mistral investigation</h2> <ul> <li>Join Kenzie at the mansion, clear its rooms, face what lives inside, and choose what happens to her afterward.</li> </ul> </section> <section class="rc-release-section rc-release-last"> <h2><span>06 / OPTIONS</span> Your game</h2> <ul> <li>Save or load your progress and adjust music and playback settings from the menu.</li> </ul> </section> </div> </main>
<main class="rc-name-page"> <p class="rc-name-kicker">Survival record / Identity</p> <h1>Your name</h1> <p class="rc-name-context">Choose the name shown in your survival record.</p> <form class="rc-name-form" onsubmit="setPlayerName(); return false;"> <input id="playerName" name="playerName" type="text" value="Alex" aria-label="Your name" autocomplete="off" maxlength="40"> <button class="button" type="submit">Continue</button> </form> </main> <<script>> window.setPlayerName = function() { try { const input = document.getElementById("playerName"); let name = input && input.value ? input.value.trim() : "Alex"; if (name === "") { name = "Alex"; } State.variables.player = State.variables.player || {}; State.variables.player.name = name; State.variables.player.game_status = 1; if (Story.has("Opening_Broadcast")) { Engine.play("Opening_Broadcast"); } else { console.error("Passage 'Opening_Broadcast' does not exist."); alert("Error: The story cannot continue. Please check the passage configuration."); } } catch (error) { console.error("Error in setPlayerName:", error); alert("An error occurred. Please try again or check the console for details."); } }; <</script>>
<<set $player.current_location = "City_Center">> <<set $player.stamina = Math.max(0, $player.stamina - 10)>> <div class="scene-content"> <div class="scene-text"> <h2>City Center</h2> <p> The city center is the most dangerous area, but also potentially the richest in resources. Tall buildings tower into the sky, many damaged by fires and looting. The streets are cluttered with abandoned cars and debris. </p> <p> The center contains stores, pharmacies, banks and other establishments that might hold valuable resources. However, it's also where bandit groups are most concentrated, hunting for lone survivors. </p> <<if $discovered_lena == false or $player.lena_status == "unknown">> <<set $discovered_lena = true>> <div class="encounter"> <p class="danger">Suddenly, you hear footsteps behind you...</p> <a class="button danger-choice" data-passage="Lena_Encounter">Turn around</a> </div> <<else>> <<set _chance = random(0, 99)>> <div class="choice-container"> <<if _chance > 66>> <a class="button" data-passage="Raider_Encounter">Looking for slaves</a> <</if>> </div> <div class="choice-container"> <a class="button" data-passage="Outside">Return</a> </div> <</if>> </div> </div>
<<if $combat.turn == "player">> <<set $combat.last_action = "attack">> <<set $combat.last_player_damage = Math.min($combat.player_damage, $combat.enemy_health)>> <<set $combat.enemy_health = Math.max(0, $combat.enemy_health - $combat.player_damage)>> <<set $combat.turn = "enemy">> <<if $combat.enemy_health <= 0>> <<if $combat.enemy_name == "Scarbourg" && $player.current_location == "Mistral_Living_room" && $bunker_quest_progress == "Phase 1">><<goto "Kenzie_Final_Grab">><<else>><<goto "Combat_Victory">><</if>> <<else>> <<goto "Combat_Enemy_Turn">> <</if>> <<else>> <<goto "Combat_Enemy_Turn">> <</if>>
<main class="rc-combat-outcome rc-defeat-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / RESULT</span><h1>Defeat</h1></header><div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><<if $combat.enemy_name == "Lena">><img src="assets/cast/lena.jpg" alt="Lena"><<elseif $combat.enemy_name == "Raider">><img src="assets/cast/raider.png" alt="Raider"><<elseif $combat.enemy_name == "Zombie">><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><<elseif $combat.enemy_name == "Scarbourg">><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"><</if>><figcaption>OPPONENT / <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></figcaption></figure><section class="rc-outcome-report"><p>You have lost.</p><strong class="rc-outcome-final">GAME OVER</strong></section></div><nav class="rc-outcome-actions"><a class="button" data-passage="Game_Over">Continue</a></nav></main>
<<if $combat.turn == "player">> <<set $combat.last_action = "defend">> <<set $combat.last_player_damage = 0>> <<set $combat.is_defending = true>> <<set $combat.turn = "enemy">> <<goto "Combat_Enemy_Turn">> <<else>> <<goto "Combat_Enemy_Turn">> <</if>>
<<set $combat = { enemy_name: "Lena", enemy_health: 70, enemy_max_health: 70, enemy_damage: 10, player_damage: $player.Weapon_damage, turn: "player", is_defending: false, last_action: "start", last_player_damage: 0, last_enemy_damage: 0, last_enemy_defended: false, last_heal: 0 }>> <main class="rc-battle-page"><header class="rc-battle-header"><div><span class="rc-ui-kicker">HOSTILE CONTACT / COMBAT</span><h1>Battle with <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></h1></div> <span class="rc-battle-threat">INCOMING HIT · <<print $combat.enemy_damage>> HP</span></header> <div class="rc-battle-grid"><figure class="rc-battle-portrait"><<if $combat.enemy_name == 'Lena'>><img src="assets/cast/lena.jpg" alt="Lena"> <<elseif $combat.enemy_name == 'Raider'>><img src="assets/cast/raider.png" alt="Raider"> <<elseif $combat.enemy_name == 'Scarbourg'>><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"> <<else>><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><</if>><figcaption><span>OPPONENT</span><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong></figcaption></figure> <section class="rc-battle-panel" aria-label="Combat status and actions"><div class="rc-battle-vitals"> <div class="rc-battle-vital player"><div class="rc-battle-vital-head"><strong>You</strong><span><<print $player.health>> / <<print $player.max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Your health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> <div class="rc-battle-vital enemy"><div class="rc-battle-vital-head"><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong><span><<print $combat.enemy_health>> / <<print $combat.enemy_max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Opponent health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> </div><div class="rc-battle-tactic"><strong>When to defend</strong><p>Defend halves the next incoming hit: <<print Math.floor($combat.enemy_damage / 2)>> HP instead of <<print $combat.enemy_damage>> HP. Use it when you need to survive a hit before your next turn.</p></div> <div class="rc-battle-log" aria-live="polite"><span class="rc-ui-kicker">TURN REPORT</span><p>Combat begins. <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> is in front of you.</p></div><<if $player.health <= 0>><nav class="rc-battle-actions"><a class="combat-btn attack" data-passage="Combat_Defeat">Continue</a></nav> <<else>><<set $combat.turn = "player">><nav class="rc-battle-actions" aria-label="Combat actions"> <a class="combat-btn attack" data-passage="Combat_Attack"><strong>Attack</strong><small>Deal <<print $combat.player_damage>> damage</small></a> <a class="combat-btn defend" data-passage="Combat_Defend"><strong>Defend</strong><small>Take <<print Math.floor($combat.enemy_damage / 2)>> instead of <<print $combat.enemy_damage>> damage</small></a> <<if $player.Medkit > 0>><a class="combat-btn heal" data-passage="Combat_Heal"><strong>Use Medkit</strong><small>Recover up to 50 HP · <<print $player.Medkit>> left</small></a> <<else>><span class="combat-btn heal disabled"><strong>Medkit</strong><small>None available</small></span><</if>> </nav><</if>></section></div></main>
<<if $combat.turn == "enemy">> <<if $combat.is_defending>> <<set _damage = Math.floor($combat.enemy_damage / 2)>> <<set $combat.last_enemy_defended = true>> <<set $combat.last_enemy_damage = _damage>> <<set $player.health = Math.max(0, $player.health - _damage)>> <<set $combat.is_defending = false>> <<else>> <<set $combat.last_enemy_defended = false>> <<set $combat.last_enemy_damage = $combat.enemy_damage>> <<set $player.health = Math.max(0, $player.health - $combat.enemy_damage)>> <</if>> <</if>> <main class="rc-battle-page"><header class="rc-battle-header"><div><span class="rc-ui-kicker">HOSTILE CONTACT / COMBAT</span><h1>Battle with <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></h1></div> <span class="rc-battle-threat">INCOMING HIT · <<print $combat.enemy_damage>> HP</span></header> <div class="rc-battle-grid"><figure class="rc-battle-portrait"><<if $combat.enemy_name == 'Lena'>><img src="assets/cast/lena.jpg" alt="Lena"> <<elseif $combat.enemy_name == 'Raider'>><img src="assets/cast/raider.png" alt="Raider"> <<elseif $combat.enemy_name == 'Scarbourg'>><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"> <<else>><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><</if>><figcaption><span>OPPONENT</span><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong></figcaption></figure> <section class="rc-battle-panel" aria-label="Combat status and actions"><div class="rc-battle-vitals"> <div class="rc-battle-vital player"><div class="rc-battle-vital-head"><strong>You</strong><span><<print $player.health>> / <<print $player.max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Your health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> <div class="rc-battle-vital enemy"><div class="rc-battle-vital-head"><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong><span><<print $combat.enemy_health>> / <<print $combat.enemy_max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Opponent health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> </div><div class="rc-battle-tactic"><strong>When to defend</strong><p>Defend halves the next incoming hit: <<print Math.floor($combat.enemy_damage / 2)>> HP instead of <<print $combat.enemy_damage>> HP. Use it when you need to survive a hit before your next turn.</p></div> <div class="rc-battle-log" aria-live="polite"><span class="rc-ui-kicker">TURN REPORT</span><<if $combat.kenzie_bonus>><p><strong>Kenzie fires from your flank.</strong> Her shotgun adds 30 damage to your attacks.</p><</if>><<if $combat.last_action == "attack">><p><strong>You attack.</strong> <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> loses <<print $combat.last_player_damage>> HP.</p> <<elseif $combat.last_action == "defend">><p><strong>You defend.</strong> The incoming hit is reduced by half.</p> <<elseif $combat.last_action == "heal">><p><strong>Medkit used.</strong> You recover <<print $combat.last_heal>> HP.</p><</if>> <<if $combat.last_enemy_defended>><p><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> attacks.</strong> You lose <<print $combat.last_enemy_damage>> HP after defending.</p> <<else>><p><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> attacks.</strong> You lose <<print $combat.last_enemy_damage>> HP.</p><</if>></div><<if $player.health <= 0>><nav class="rc-battle-actions"><a class="combat-btn attack" data-passage="Combat_Defeat">Continue</a></nav> <<else>><<set $combat.turn = "player">><nav class="rc-battle-actions" aria-label="Combat actions"> <a class="combat-btn attack" data-passage="Combat_Attack"><strong>Attack</strong><small>Deal <<print $combat.player_damage>> damage</small></a> <a class="combat-btn defend" data-passage="Combat_Defend"><strong>Defend</strong><small>Take <<print Math.floor($combat.enemy_damage / 2)>> instead of <<print $combat.enemy_damage>> damage</small></a> <<if $player.Medkit > 0>><a class="combat-btn heal" data-passage="Combat_Heal"><strong>Use Medkit</strong><small>Recover up to 50 HP · <<print $player.Medkit>> left</small></a> <<else>><span class="combat-btn heal disabled"><strong>Medkit</strong><small>None available</small></span><</if>> </nav><</if>></section></div></main>
<<if $combat.turn == "player" and $player.Medkit > 0>> <<set $combat.last_action = "heal">> <<set $combat.last_heal = Math.min(50, $player.max_health - $player.health)>> <<set $combat.last_player_damage = 0>> <<set $player.Medkit -= 1>> <<set $player.health = Math.min($player.max_health, $player.health + 50)>> <<set $combat.turn = "enemy">> <<goto "Combat_Enemy_Turn">> <<else>> <<goto "Combat_Enemy_Turn">> <</if>>
<<set $combat = { enemy_name: "Raider", enemy_health: 100, enemy_max_health: 100, enemy_damage: 10, player_damage: $player.Weapon_damage, turn: "player", is_defending: false, last_action: "start", last_player_damage: 0, last_enemy_damage: 0, last_enemy_defended: false, last_heal: 0 }>> <main class="rc-battle-page"><header class="rc-battle-header"><div><span class="rc-ui-kicker">HOSTILE CONTACT / COMBAT</span><h1>Battle with <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></h1></div> <span class="rc-battle-threat">INCOMING HIT · <<print $combat.enemy_damage>> HP</span></header> <div class="rc-battle-grid"><figure class="rc-battle-portrait"><<if $combat.enemy_name == 'Lena'>><img src="assets/cast/lena.jpg" alt="Lena"> <<elseif $combat.enemy_name == 'Raider'>><img src="assets/cast/raider.png" alt="Raider"> <<elseif $combat.enemy_name == 'Scarbourg'>><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"> <<else>><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><</if>><figcaption><span>OPPONENT</span><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong></figcaption></figure> <section class="rc-battle-panel" aria-label="Combat status and actions"><div class="rc-battle-vitals"> <div class="rc-battle-vital player"><div class="rc-battle-vital-head"><strong>You</strong><span><<print $player.health>> / <<print $player.max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Your health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> <div class="rc-battle-vital enemy"><div class="rc-battle-vital-head"><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong><span><<print $combat.enemy_health>> / <<print $combat.enemy_max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Opponent health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> </div><div class="rc-battle-tactic"><strong>When to defend</strong><p>Defend halves the next incoming hit: <<print Math.floor($combat.enemy_damage / 2)>> HP instead of <<print $combat.enemy_damage>> HP. Use it when you need to survive a hit before your next turn.</p></div> <div class="rc-battle-log" aria-live="polite"><span class="rc-ui-kicker">TURN REPORT</span><p>Combat begins. <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> is in front of you.</p></div><<if $player.health <= 0>><nav class="rc-battle-actions"><a class="combat-btn attack" data-passage="Combat_Defeat">Continue</a></nav> <<else>><<set $combat.turn = "player">><nav class="rc-battle-actions" aria-label="Combat actions"> <a class="combat-btn attack" data-passage="Combat_Attack"><strong>Attack</strong><small>Deal <<print $combat.player_damage>> damage</small></a> <a class="combat-btn defend" data-passage="Combat_Defend"><strong>Defend</strong><small>Take <<print Math.floor($combat.enemy_damage / 2)>> instead of <<print $combat.enemy_damage>> damage</small></a> <<if $player.Medkit > 0>><a class="combat-btn heal" data-passage="Combat_Heal"><strong>Use Medkit</strong><small>Recover up to 50 HP · <<print $player.Medkit>> left</small></a> <<else>><span class="combat-btn heal disabled"><strong>Medkit</strong><small>None available</small></span><</if>> </nav><</if>></section></div></main>
<main class="rc-combat-outcome rc-victory-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / RESULT</span><h1>Victory</h1></header><div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><<if $combat.enemy_name == "Lena">><img src="assets/cast/lena.jpg" alt="Lena"><<elseif $combat.enemy_name == "Raider">><img src="assets/cast/raider.png" alt="Raider"><<elseif $combat.enemy_name == "Zombie">><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><<elseif $combat.enemy_name == "Scarbourg">><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"><</if>><figcaption>OPPONENT / <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></figcaption></figure><section class="rc-outcome-report"><<if $combat.last_action == "attack">><p class="rc-combat-summary">Final strike: <strong><<print $combat.last_player_damage>> damage</strong>.</p><</if>><<if $combat.enemy_name == "Lena">><p>Lena staggers back. She looks at the pistol, then at you. "All right. I'm done." She throws it past a wrecked car and raises both hands. She keeps them up as she sinks to her knees.</p><p>The pistol lies a few steps away. Something rattles farther down the street. What will you do with Lena?</p> <<elseif $combat.enemy_name == "Raider">><p>You have won and now the defeated raider is your trophy.</p><p>What will you do with her?</p> <<else>><p>You have defeated this creature.</p><p>What will you do?</p><</if>></section></div><nav class="rc-outcome-actions"> <<if $combat.enemy_name == "Lena">><a class="button dark-choice" data-passage="Lena_Enslave">Make her a slave</a><a class="button danger-choice" data-passage="Lena_Kill">Kill her</a> <<elseif $combat.enemy_name == "Raider">><a class="button dark-choice" data-passage="Raider_Enslave">Make her a slave</a><a class="button danger-choice" data-passage="Raider_Kill">Kill her</a> <<elseif $combat.enemy_name == "Zombie">><a class="button danger-choice" data-passage="Zombie_Kill">Kill him</a> <<elseif $combat.enemy_name == "Scarbourg">><a class="button danger-choice" data-passage="Scarbourg_Kill">Kill him</a><</if>> </nav></main>
<main class="rc-task-page rc-task-result-page rc-task-result-cleared"> <figure class="rc-task-portrait"><img src="assets/cast/lena.jpg" alt="Lena"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Lena</h1><p>Task canceled</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>No task assigned</strong></div> <div class="rc-task-result-copy"><p>You recall Lena from her task. She is now available for other interactions.</p> <<set $player.lena_work = "none">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<div class="scene-content"> <div class="encounter-header"> <h2>Dangerous Encounter</h2> </div> <div class="character-encounter"> <div class="encounter-image"> <img src="assets/cast/lena.jpg" alt="Lena" class="character-image"> </div> <div class="encounter-text"> <p>A woman stands a few steps away, a pistol held in both hands. She moves back when you turn, keeping a parked car beside her. Her eyes flick to your bag, then to the street behind you.</p> <div class="dialog"> <p class="lena-dialog">"Easy. Hands where I can see them."</p> </div> <p>She nods at your bag.</p> <div class="dialog"> <p class="lena-dialog">"There are buyers in the center. They pay more if you can walk."</p> </div> <p>She keeps her distance, waiting for you to move first. You could rush her or try to get around the car and run.</p> </div> </div> <div class="choice-container"> <a class="button danger-choice" data-passage="Combat_Lena">Fight</a> <a class="button" data-passage="Outside">Try to escape</a> </div> </div>
<main class="rc-combat-outcome rc-capture-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / AFTERMATH</span><h1>Subjugating Lena</h1></header> <div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><img src="assets/cast/lena.jpg" alt=""><figcaption>Subjugating Lena</figcaption></figure><section class="rc-outcome-report"> <h2>Subjugating Lena</h2> <p>You take Lena by the wrists. She tenses, but lets you bind her hands. "I threw it," she says, looking past you toward the car. "I said I'm done."</p> <<run setup.recruitResident($player, "lena_status", "slave")>> <p>You start toward the pistol. A horde of monsters spills out of the next street, knocking against the parked cars. Lena sees them too. "Come on," she says, tugging at your grip.</p> <p>The gun is out in the open. You pull Lena into an alley and leave it where it fell. The two of you make it back to the safehouse.</p> <<set $player.current_location = "Safehouse">> </section></div> <nav class="rc-outcome-actions"> <a class="button dark-choice" data-passage="Lena_Service">Secure the subjugation</a> <a class="button" data-passage="Safehouse">Go inside</a> </nav> </main>
<div class="scene-content"> <div class="dialog-container"> <p class="narrator-text">Lena glances at the door before she answers.</p> <div class="lena-dialog"> <<if $player.lena_status == "slave">> <p>"I don't like asking permission to leave a room." She rubs her wrist. "But I'm alive. That's what I've got."</p> <</if>> </div> </div> <div class="choice-container"> <a class="button neutral-choice" data-passage="Lena_Talk_Menu">Return to the conversation</a> </div> </div>
<main class="rc-resident-page"> <header class="rc-resident-header"><div class="rc-resident-portrait"><img src="assets/cast/lena.jpg" alt="Lena"></div> <div class="rc-resident-identity"><span class="rc-ui-kicker">SAFE HOUSE / RESIDENT</span><h1>Lena</h1> <div class="rc-resident-facts"><div><span>Status</span><strong><<if $player.lena_status == "slave">>Slave<<else>>Ally<</if>></strong></div> <div><span>Current task</span><strong><<if $player.lena_work == "scavenging">>Scavenging for supplies<<elseif $player.lena_work == "Cooking">>Cooking<<else>>None<</if>></strong></div></div> </div></header> <section class="rc-resident-options"><div class="rc-resident-options-heading"><span class="rc-ui-kicker">AVAILABLE ACTIONS</span><h2>Spend time with Lena</h2></div> <nav class="rc-resident-actions" aria-label="Interact with Lena"> <a class="rc-resident-action" data-passage="Lena_Talk_Menu"><span>01 / Conversation</span><strong>Talk</strong><small>Speak with Lena</small></a> <<if $player.lena_status == "slave" && $player.lena_work != "scavenging">> <a class="rc-resident-action rc-resident-action-private" data-passage="Lena_Service"><span>02 / Private</span><strong>Have sex</strong><small>Spend time together</small></a> <</if>> <a class="rc-resident-action" data-passage="Lena_Work"><span>03 / Work</span><strong>Assign a task</strong><small>Choose a job for Lena</small></a> </nav> </section><nav class="rc-resident-exit"><a class="button back-btn" data-passage="Safehouse">← Back</a></nav> </main>
<main class="rc-combat-outcome rc-execution-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / AFTERMATH</span><h1>Execution of Lena</h1></header> <div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><img src="assets/cast/lena.jpg" alt=""><figcaption>Execution of Lena</figcaption></figure><section class="rc-outcome-report"> <h2>Execution of Lena</h2> <p>You end it quickly. Lena falls beside the car. Her pistol lies farther down the street, where she threw it.</p> <<if $player.lena_status != "dead_outside">> <<set $player.Provisions += 5>> <<set $player.Medkit += 1>> <</if>> <<set $player.lena_status = "dead_outside">> <p>You search her bag. There are five cans of food and a medkit inside. From the next street comes the sound of something knocking against a car. You have time to reach for the pistol, but not to stay here.</p> <section class="loot rc-loot" aria-label="Recovered supplies"> <header class="rc-loot-header"><span>RECOVERED / LENA'S BAG</span><h3>Supplies secured</h3></header> <ul> <li><img src="assets/icons/canned_food.svg" alt=""><span>Provisions</span><strong>+5</strong></li> <li><img src="assets/icons/medkit.svg" alt=""><span>Medkit</span><strong>+1</strong></li> </ul> </section> </section></div> <nav class="rc-outcome-actions"> <<if !$player.lena_pistol_taken>><a class="button dark-choice" data-passage="Lena_Take_Pistol">Take Lena's pistol</a><</if>> <a class="button" data-passage="City_Center">Leave the pistol</a> </nav> </main>
<div class="scene-content"> <div class="dialog-container"> <p class="narrator-text">Lena's hand drifts to her empty hip. She notices and lets it fall.</p> <div class="lena-dialog"> <p>"I was a bank manager before the epidemic. I told people what to do all day." She gives a short laugh. "Funny, isn't it?"</p> <p>"When the epidemic hit, I found the pistol in a car the first week. I took it to protect myself. The first woman I pointed it at gave me her bag." She looks at you. "Then I found buyers in the center. Bringing them people paid better."</p> </div> </div> <div class="choice-container"> <a class="button neutral-choice" data-passage="Lena_Talk_Menu">Return to the conversation</a> </div> </div>
<<if $player.stamina < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><img src="assets/cast/lena.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Lena</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Lena_Interact">← Back</a> </div> </div> <<else>> <div class="scene-content rc-service-page" data-rc-service="lena"> <header class="rc-service-header"><img src="assets/cast/lena.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Lena</h1></div></header> <div class="scene-text"> <p> Lena obediently waits for your orders, ready to fulfill any of your desires. </p> </div> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/lena/blowjob (1).webm" type="video/webm"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="anal" role="button" tabindex="0">Anal</a> <a class="service-btn" data-rc-video="cum" role="button" tabindex="0">Finish</a> </div> <a class="button back-btn" data-passage="Safehouse">← Finish</a> </div> </div> <</if>>
<main class="rc-task-page rc-task-result-page rc-task-result-assigned"> <figure class="rc-task-portrait"><img src="assets/cast/lena.jpg" alt="Lena"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Lena</h1><p>Task assigned</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>Scavenging</strong></div> <div class="rc-task-result-copy"><p>You send Lena to scavenge for supplies in the city. It's a dangerous task, but necessary for survival.</p> <<set $player.lena_work = "scavenging">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<div class="scene-content"> <div class="dialog-container"> <p class="narrator-text">Lena looks up when you enter. One knee is bouncing under the table; she stills it with her hand.</p> <div class="lena-dialog"> <p>"What is it, master?"</p> </div> <div class="dialog-options"> <a class="button light-choice" data-passage="Lena_Past">Ask about her past</a> <a class="button light-choice" data-passage="Lena_Feelings">Ask about her feelings</a> <a class="button neutral-choice" data-passage="Lena_Interact">End the conversation</a> </div> </div> </div>
<main class="rc-task-page"><figure class="rc-task-portrait"><img src="assets/cast/lena.jpg" alt="Lena"></figure> <section class="rc-task-body"><header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Lena</h1><p>Assign a task</p></header> <<if $player.lena_work != "none">> <div class="rc-task-current"><span>Current assignment</span><strong><<print $player.lena_work>></strong> <a class="button danger-choice" data-passage="Lena_Cancel_Work">Cancel task</a></div> <<else>> <nav class="rc-task-options" aria-label="Tasks for Lena"> <a class="rc-task-option" data-passage="Lena_Start_Scavenging"><span>01 / Outside</span><strong>Start scavenging</strong><small>Search for supplies on the next day</small></a> <a class="rc-task-option" data-passage="Lena_Cooks"><span>02 / Safe house</span><strong>Cooking</strong><small>Prepare food when raw meat is available</small></a> </nav> <</if>> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Lena_Interact">← Return to Lena</a></nav> </section> </main>
<main class="rc-task-page rc-task-result-page rc-task-result-assigned"> <figure class="rc-task-portrait"><img src="assets/cast/lena.jpg" alt="Lena"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Lena</h1><p>Task assigned</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>Cooking</strong></div> <div class="rc-task-result-copy"><p>Lena tries to cook something edible.</p> <<set $player.lena_work = "Cooking">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<<set _exploreStaminaBefore = $player.stamina>> <<set $player.stamina = Math.max(0, $player.stamina - 20)>> <main class="rc-search-page rc-explore-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">OUTSIDE / RECONNAISSANCE</span><h1>Explore Area</h1></div><span class="rc-search-status">FIELD REPORT</span></header> <section class="rc-search-body" aria-label="Area reconnaissance"> <p class="rc-search-label">The route</p> <p class="rc-explore-intro">You decide to explore the surroundings in search of useful locations. It's dangerous, but could prove beneficial.</p> <div class="rc-explore-result"><span class="rc-search-label">What you found</span> <<if $discovered_bunker and $discovered_farm and $discovered_city_center and $discovered_settlement and $discovered_forest>> <p class="rc-explore-feedback">You already found everything nearby.</p> <<elseif random(1, 100) <= 50>> <<if $discovered_bunker == false>> <<set $discovered_bunker = true>> <p class="success">You found something interesting! An abandoned bunker stands among the ruins.</p> <a class="button light-choice" data-passage="Bunker">Explore the bunker</a> <<elseif $discovered_farm == false>> <<set $discovered_farm = true>> <p class="success">You found something interesting! An old farm is visible outside the city.</p> <a class="button light-choice" data-passage="Farm">Explore the farm</a> <<elseif $discovered_city_center == false>> <<set $discovered_city_center = true>> <p class="success">You discovered a safe route to the city center!</p> <a class="button light-choice" data-passage="City_Center">Go to the center</a> <<elseif $discovered_settlement == false>> <<set $discovered_settlement = true>> <p class="success">You spot a small settlement of survivors in the distance!</p> <a class="button light-choice" data-passage="Settlement">Approach the settlement</a> <<elseif $discovered_forest == false>> <<set $discovered_forest = true>> <p class="success">You have a view of the endless forest.</p> <a class="button light-choice" data-passage="Forest">Enter the forest</a> <</if>> <<else>> <p class="rc-explore-feedback">Nothing.</p> <</if>> </div> </section> <nav class="rc-search-actions"><span class="rc-search-cost">−<<= _exploreStaminaBefore - $player.stamina>> stamina · <<print $player.stamina>> left</span> <div class="rc-search-action-list"><a class="button rc-search-return" data-passage="Outside">Return to Outside</a></div></nav> </main>
<<set $player.current_location = "Farm">> <<set $player.stamina = Math.max(0, $player.stamina - 10)>> <div class="scene-content"> <div class="scene-text"> <h2>The Old Farm</h2> <p> Beyond the city, you find an abandoned farm. The farmhouse is still standing, though it needs repairs. A few sheds sit beside the fields, and dark soil shows through the weeds. </p> <p> Someone has reinforced part of the fence and cleared a patch of ground. The work stopped there. With repairs and enough time, you could grow food here. </p> </div> <div class="choice-container"> <a class="button" data-passage="Outside">Return</a> </div> </div>
<<set $player.current_location = "Forest">> <<set $player.stamina = Math.max(0, $player.stamina - 10)>> <div class="scene-content"> <div class="scene-text"> <h2>Forest</h2> <p> The trees are still standing, but their bark has split around pale growths. Thick, spore-covered tendrils hang from the branches. Something large buzzes overhead, then disappears deeper into the woods. </p> <p> A torn sleeve is caught on a low branch. You stay on the path and watch the trees. </p> </div> <<if $player.stamina >= 20>> <div class="choice-container"> <a class="button" data-passage="Forest_Hunt">Go hunt</a> </div> <<else>> <center><h2>*You tired!*</h2></center> <</if>> <a class="button" data-passage="Outside">Return</a> </div>
<<set _huntHealthBefore = $player.health>> <<set _huntStaminaBefore = $player.stamina>> <<set _huntOutcome = "exhausted">> <<set _huntStatus = "HUNT UNAVAILABLE">> <<set _huntTarget = "No sighting">> <<set _huntImage = "">> <<set _huntScene = "You're too exhausted to hunt!">> <<set _huntAfter = "">> <<set _huntLoot = 0>> <<set _huntLootName = "">> <<set _huntLootIcon = "">> <<set _huntRisk = "">> <<set _escaped = false>> <<if $player.stamina gte 20>> <<set _event to random(1,4)>> <<set _damage_reduce to $player.Weapon_status is "Wrench" ? 0.1 : $player.Weapon_status is "Knife" ? 0.2 : $player.Weapon_status is "Pistol" ? 0.4 : $player.Weapon_status is "Shotgun" ? 0.6 : 0>> <<set _loot_multiplier to $player.Weapon_status is "none" ? 0.5 : $player.Weapon_status is "Wrench" ? 1 : $player.Weapon_status is "Knife" ? 1.2 : $player.Weapon_status is "Pistol" ? 1.3 : 1.5>> <<if _event is 1>> <<set _huntTarget = "Mutant wolf">> <<set _huntImage = "assets/monsters/hunt/wolf_mutant.png">> <<set _huntScene = "A mutant wolf lunges from the brush!">> <<set _damage to Math.max(1, Math.floor(($player.wolf_mutant_damage + random(10,30)) * (1 - _damage_reduce)))>> <<if $player.health - _damage lte 0>> <<set _escaped = true>> <<set _huntOutcome = "retreat">> <<set _huntStatus = "FORCED RETREAT">> <<set _huntRisk = "You have " + $player.health + " health, but this attack would deal " + _damage + " damage!">> <<set $player.stamina = 0>> <<else>> <<set $player.health to Math.max(0, $player.health - _damage)>> <<set _huntLoot to Math.floor(random(2,6) * _loot_multiplier)>> <<set $player.Raw_meat += _huntLoot>> <<set $player.stamina -= 20>> <<set _huntOutcome = "success">> <<set _huntStatus = "HUNT COMPLETE">> <<set _huntAfter = "You kill it, but lose " + _damage + " health.">> <<set _huntLootName = "Raw meat">> <<set _huntLootIcon = "assets/icons/raw_meat.svg">> <</if>> <<elseif _event is 2>> <<set _huntTarget = "Mutant rat swarm">> <<set _huntImage = "assets/monsters/hunt/rat_mutant.png">> <<set _huntScene = "Mutant rats swarm from the ground!">> <<set _damage to Math.max(1, Math.floor(($player.rat_mutant_damage + random(5,20)) * (1 - _damage_reduce)))>> <<if $player.health - _damage lte 0>> <<set _escaped = true>> <<set _huntOutcome = "retreat">> <<set _huntStatus = "FORCED RETREAT">> <<set _huntRisk = "You have " + $player.health + " health, but this attack would deal " + _damage + " damage!">> <<set $player.stamina = 0>> <<else>> <<set $player.health to Math.max(0, $player.health - _damage)>> <<set _huntLoot to Math.floor(random(1,2) * _loot_multiplier)>> <<set $player.Raw_meat += _huntLoot>> <<set $player.stamina -= 20>> <<set _huntOutcome = "success">> <<set _huntStatus = "HUNT COMPLETE">> <<set _huntAfter = "You fend them off, but lose " + _damage + " health.">> <<set _huntLootName = "Raw meat">> <<set _huntLootIcon = "assets/icons/raw_meat.svg">> <</if>> <<elseif _event is 3>> <<set _huntTarget = "Spore-sick raiders">> <<set _huntImage = "assets/monsters/hunt/raider_mutant.png">> <<set _huntScene = "Spore-sick raiders ambush you!">> <<set $player.raider_damage = $player.raider_damage ?? 15>> <<set _damage to Math.max(1, Math.floor(($player.raider_damage + random(10,40)) * (1 - _damage_reduce)))>> <<if $player.health - _damage lte 0>> <<set _escaped = true>> <<set _huntOutcome = "retreat">> <<set _huntStatus = "FORCED RETREAT">> <<set _huntRisk = "You have " + $player.health + " health, but this attack would deal " + _damage + " damage!">> <<set $player.stamina = 0>> <<else>> <<set $player.health to Math.max(0, $player.health - _damage)>> <<set _huntLoot to Math.floor(random(5,50) * _loot_multiplier)>> <<set $player.Caps += _huntLoot>> <<set $player.stamina -= 20>> <<set _huntOutcome = "success">> <<set _huntStatus = "HUNT COMPLETE">> <<set _huntAfter = "You survive, but lose " + _damage + " health.">> <<set _huntLootName = "Money">> <<set _huntLootIcon = "assets/icons/money.svg">> <</if>> <<else>> <<set $player.stamina -= 20>> <<set _huntOutcome = "empty">> <<set _huntStatus = "NO CATCH">> <<set _huntScene = "The forest is empty, nothing found.">> <</if>> <</if>> <<set _huntStaminaSpent = Math.max(0, _huntStaminaBefore - $player.stamina)>> <<set _huntHealthLost = Math.max(0, _huntHealthBefore - $player.health)>> <style> html body #passages #passage-forest-hunt .rc-hunt-page { box-sizing: border-box !important; display: block !important; width: 100% !important; max-width: 1040px !important; min-width: 0 !important; margin: 0 auto !important; padding: 0 !important; overflow: hidden !important; border: 1px solid #696354 !important; border-radius: 2px !important; background: #e7ddc8 !important; box-shadow: 0 14px 38px rgba(0, 0, 0, .25) !important; } html body #passages #passage-forest-hunt .rc-hunt-page br { display: none !important; } html body #passages #passage-forest-hunt .rc-hunt-header { box-sizing: border-box !important; display: flex !important; justify-content: space-between !important; align-items: center !important; gap: 20px !important; min-width: 0 !important; margin: 0 !important; padding: 22px clamp(22px, 3vw, 34px) !important; border: 0 !important; border-bottom: 5px solid #9c7a47 !important; background: #252c27 !important; color: #f0e8d8 !important; } html body #passages #passage-forest-hunt .rc-hunt-kicker, html body #passages #passage-forest-hunt .rc-hunt-status { display: block !important; color: #c9b591 !important; font: 800 .7rem/1.3 var(--ui-mono) !important; letter-spacing: .12em !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-header h1 { margin: 5px 0 0 !important; color: #f0e8d8 !important; font: 900 clamp(1.8rem, 3vw, 2.7rem)/1.06 var(--ui-display) !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-status { flex: 0 0 auto !important; padding: 8px 11px !important; border: 1px solid #a48d67 !important; text-align: center !important; } html body #passages #passage-forest-hunt .rc-hunt-ledger { box-sizing: border-box !important; display: grid !important; grid-template-columns: minmax(0, 1.55fr) repeat(2, minmax(0, 1fr)) !important; gap: 1px !important; margin: 0 !important; padding: 0 !important; background: #aa9f8c !important; } html body #passages #passage-forest-hunt .rc-hunt-metric { box-sizing: border-box !important; display: grid !important; align-content: center !important; gap: 5px !important; min-width: 0 !important; min-height: 130px !important; margin: 0 !important; padding: 18px clamp(17px, 2vw, 26px) !important; background: #e8dfcf !important; color: #292922 !important; } html body #passages #passage-forest-hunt .rc-hunt-metric-reward { background: #dce2d3 !important; border-left: 6px solid #607652 !important; } html body #passages #passage-forest-hunt .rc-hunt-metric-label { color: #5b5c50 !important; font: 800 .68rem/1.2 var(--ui-mono) !important; letter-spacing: .1em !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-metric-main { display: flex !important; align-items: center !important; gap: 10px !important; min-width: 0 !important; } html body #passages #passage-forest-hunt .rc-hunt-metric-main img { flex: 0 0 auto !important; width: 36px !important; height: 36px !important; object-fit: contain !important; } html body #passages #passage-forest-hunt .rc-hunt-metric strong { color: #2e3e2c !important; font: 900 clamp(1.4rem, 2.5vw, 2rem)/1.05 var(--ui-display) !important; overflow-wrap: anywhere !important; } html body #passages #passage-forest-hunt .rc-hunt-metric-cost strong { color: #8d3e31 !important; } html body #passages #passage-forest-hunt .rc-hunt-metric small { color: #625d52 !important; font: 600 .78rem/1.35 var(--ui-body) !important; } html body #passages #passage-forest-hunt .rc-hunt-body { box-sizing: border-box !important; display: grid !important; grid-template-columns: minmax(180px, 32%) minmax(0, 1fr) !important; min-width: 0 !important; margin: 0 !important; padding: 0 !important; background: var(--v2-paper-low) !important; background-image: var(--v2-paper-texture) !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting { box-sizing: border-box !important; min-width: 0 !important; margin: 0 !important; padding: 16px !important; border-right: 1px solid #b3a994 !important; background: #33382f !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting img { display: block !important; width: 100% !important; height: 215px !important; object-fit: contain !important; background: #222820 !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting figcaption, html body #passages #passage-forest-hunt .rc-hunt-no-sighting { display: grid !important; gap: 3px !important; padding: 10px 0 0 !important; color: #f0e8d8 !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting figcaption span, html body #passages #passage-forest-hunt .rc-hunt-no-sighting span { color: #c8b38a !important; font: 800 .65rem/1.2 var(--ui-mono) !important; letter-spacing: .1em !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting figcaption strong, html body #passages #passage-forest-hunt .rc-hunt-no-sighting strong { font: 900 .9rem/1.2 var(--ui-display) !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-no-sighting { align-content: center !important; min-height: 215px !important; padding: 20px !important; } html body #passages #passage-forest-hunt .rc-hunt-report { box-sizing: border-box !important; display: grid !important; align-content: center !important; gap: 13px !important; min-width: 0 !important; margin: 0 !important; padding: 25px clamp(22px, 3vw, 38px) !important; color: var(--v2-ink) !important; } html body #passages #passage-forest-hunt .rc-hunt-report span { color: #5c614e !important; font: 800 .68rem/1.2 var(--ui-mono) !important; letter-spacing: .1em !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-report p { max-width: 64ch !important; margin: 0 !important; color: var(--v2-ink) !important; font: 500 1rem/1.55 var(--ui-body) !important; text-align: left !important; } html body #passages #passage-forest-hunt .rc-hunt-report .rc-hunt-risk { padding: 10px 0 10px 14px !important; border-left: 4px solid #9a4737 !important; color: #803d32 !important; font-weight: 700 !important; } html body #passages #passage-forest-hunt .rc-hunt-actions { box-sizing: border-box !important; display: flex !important; justify-content: space-between !important; align-items: center !important; gap: 20px !important; width: 100% !important; min-width: 0 !important; margin: 0 !important; padding: 18px clamp(22px, 3vw, 34px) !important; border: 0 !important; border-top: 3px solid #a48d67 !important; background: #272c26 !important; } html body #passages #passage-forest-hunt .rc-hunt-actions small { color: #d2c6ae !important; font: 700 .72rem/1.3 var(--ui-mono) !important; text-transform: uppercase !important; } html body #passages #passage-forest-hunt .rc-hunt-action-list { display: flex !important; flex-wrap: nowrap !important; justify-content: flex-end !important; gap: 10px !important; min-width: 0 !important; } html body #passages #passage-forest-hunt .rc-hunt-action-list a.button { box-sizing: border-box !important; display: flex !important; align-items: center !important; justify-content: center !important; min-width: 145px !important; width: auto !important; min-height: 60px !important; height: auto !important; margin: 0 !important; padding: 10px 15px !important; border: 1px solid #c4ad7b !important; border-radius: 0 !important; background: #b48c4e !important; color: #201f1b !important; font: 900 .83rem/1.25 var(--ui-display) !important; text-align: center !important; text-transform: uppercase !important; white-space: normal !important; } html body #passages #passage-forest-hunt .rc-hunt-action-list a.button.rc-hunt-secondary { border-color: #b9ad93 !important; background: #e5dac4 !important; } html body #passages #passage-forest-hunt .rc-hunt-action-list a.button:hover, html body #passages #passage-forest-hunt .rc-hunt-action-list a.button:focus-visible { outline: 2px solid #e6c892 !important; outline-offset: 2px !important; filter: brightness(1.08) !important; } @media (max-width: 760px) { html body #passages #passage-forest-hunt .rc-hunt-ledger { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } html body #passages #passage-forest-hunt .rc-hunt-metric-reward { grid-column: 1 / -1 !important; } html body #passages #passage-forest-hunt .rc-hunt-metric { min-height: 94px !important; } html body #passages #passage-forest-hunt .rc-hunt-body { grid-template-columns: minmax(0, 1fr) !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting { border-right: 0 !important; } html body #passages #passage-forest-hunt .rc-hunt-sighting img { height: 180px !important; } html body #passages #passage-forest-hunt .rc-hunt-no-sighting { min-height: 130px !important; } } @media (max-width: 480px) { html body #passages #passage-forest-hunt .rc-hunt-header { gap: 10px !important; } html body #passages #passage-forest-hunt .rc-hunt-status { max-width: 118px !important; } html body #passages #passage-forest-hunt .rc-hunt-metric { padding: 15px !important; } html body #passages #passage-forest-hunt .rc-hunt-metric strong { font-size: 1.35rem !important; } html body #passages #passage-forest-hunt .rc-hunt-actions { align-items: stretch !important; flex-direction: column !important; gap: 12px !important; } html body #passages #passage-forest-hunt .rc-hunt-action-list, html body #passages #passage-forest-hunt .rc-hunt-action-list a.button { width: 100% !important; } html body #passages #passage-forest-hunt .rc-hunt-action-list { flex-direction: column !important; } } </style> <main class="rc-hunt-page" @data-hunt-outcome="_huntOutcome"> <header class="rc-hunt-header"> <div> <span class="rc-hunt-kicker">FOREST / HUNT</span> <h1>Hunt result</h1> </div> <span class="rc-hunt-status"><<= _huntStatus>></span> </header> <section class="rc-hunt-ledger" aria-label="Resources gained and spent"> <div class="rc-hunt-metric rc-hunt-metric-reward"> <span class="rc-hunt-metric-label">Recovered</span> <div class="rc-hunt-metric-main"> <<if _huntLoot gt 0>> <img @src="_huntLootIcon" alt=""> <strong>+<<= _huntLoot>> <<= _huntLootName>></strong> <<else>> <strong>No supplies</strong> <</if>> </div> <small><<if _huntLoot gt 0>>Added to inventory<<else>>Nothing added to inventory<</if>></small> </div> <div class="rc-hunt-metric rc-hunt-metric-cost"> <span class="rc-hunt-metric-label">Stamina spent</span> <strong><<if _huntStaminaSpent gt 0>>−<<= _huntStaminaSpent>><<else>>No cost<</if>></strong> <small><<= _huntStaminaBefore>> → <<= $player.stamina>></small> </div> <div class="rc-hunt-metric rc-hunt-metric-cost"> <span class="rc-hunt-metric-label">Health lost</span> <strong><<if _huntHealthLost gt 0>>−<<= _huntHealthLost>><<else>>No loss<</if>></strong> <small><<= _huntHealthBefore>> → <<= $player.health>></small> </div> </section> <div class="rc-hunt-body"> <figure class="rc-hunt-sighting"> <<if _huntImage>> <img @src="_huntImage" @alt="_huntTarget"> <figcaption><span>Sighting</span><strong><<= _huntTarget>></strong></figcaption> <<else>> <div class="rc-hunt-no-sighting"><span>Field note</span><strong><<= _huntTarget>></strong></div> <</if>> </figure> <section class="rc-hunt-report" aria-label="Hunt report"> <span>Field report</span> <p><<= _huntScene>></p> <<if _huntAfter>><p><<= _huntAfter>></p><</if>> <<if _huntRisk>><p class="rc-hunt-risk"><<= _huntRisk>></p><</if>> </section> </div> <nav class="rc-hunt-actions" aria-label="Hunt actions"> <<if $player.health lte 0>> <<set $player.health = 0>> <<set $player.game_status = 0>> <small>You're mortally wounded... The world fades...</small> <div class="rc-hunt-action-list"><a class="button" data-passage="Game_Over">Game Over</a></div> <<elseif _escaped>> <small>Retreat to safety</small> <div class="rc-hunt-action-list"><a class="button rc-hunt-secondary" data-passage="Forest">Escape to Forest</a></div> <<elseif _huntOutcome is "exhausted">> <small>Hunt: 20 stamina. Return: up to 10 stamina.</small> <div class="rc-hunt-action-list"><a class="button rc-hunt-secondary" data-passage="Forest">Return to Forest</a></div> <<else>> <small><<if $player.stamina gte 20>>Next hunt: 20 stamina.<<else>>Another hunt requires 20 stamina.<</if>> Return: up to 10 stamina.</small> <div class="rc-hunt-action-list"> <<if $player.stamina gte 20>><a class="button" data-passage="Forest_Hunt">Hunt Again</a><</if>> <a class="button rc-hunt-secondary" data-passage="Forest">Return to Forest</a> </div> <</if>> </nav> </main>
<<if $player.Caps < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><div><span>SETTLEMENT / PRIVATE INTERACTION</span><h1>Prostitute</h1></div></header> <div class="warning-message">10 coins required.</div> <div class="choice-container"><a class="button back-btn" data-passage="Prostitute">← Back</a></div> </div> <<elseif $player.stamina < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><div><span>SETTLEMENT / PRIVATE INTERACTION</span><h1>Prostitute</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Prostitute">← Back</a> </div> </div> <<else>> <<set $player.Caps -= 10>> <div class="scene-content rc-service-page" data-rc-service="prostitute"> <header class="rc-service-header"><div><span>SETTLEMENT / PRIVATE INTERACTION</span><h1>Prostitute</h1></div></header> <div class="scene-text"> <p> The prostitute has taken the coins and is following your instructions. </p> </div> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/prostitute/blowjob (1).mp4" type="video/mp4"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="anal" role="button" tabindex="0">Anal</a> <a class="service-btn" data-rc-video="cum" role="button" tabindex="0">Finish</a> </div> <a class="button back-btn" data-passage="Prostitute">← Back</a> </div> </div> <</if>>
<main class="rc-combat-outcome rc-defeat-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">SURVIVAL RECORD / END</span><h1>Game Over</h1></header> <div class="rc-outcome-grid"><section class="rc-outcome-report"><p>Use Restart to begin a new survival record.</p></section></div> <nav class="rc-outcome-actions"><button type="button" class="button rc-restart-action" data-rc-mobile-action="restart">Restart</button></nav> </main>
<<set $player.current_location = "Safehouse">> <<if $opening && !$opening.complete>><<set $opening.complete = true>><</if>> <div class="scene-content"> <div class="scene-text"> <div class="date-display"> <span class="day">Day: <<print $player.days_survived>></span> <span class="month">Month: <<print $player.current_month>></span> <span class="year">Year: <<print $player.current_year>></span> </div> <h2>Your Safehouse</h2> <div class="residents-container"> <h3 class="text-center">Residents</h3> <div class="characters-grid"> <<if $kenzie && ($kenzie.outcome == "camp_help" || $kenzie.outcome == "camp_slave")>> <div class="mini-character-card"><img src="assets/cast/kenzie.jpg" alt="Kenzie" class="mini-portrait"><div class="mini-info"><span class="char-name">Kenzie</span><span class="char-status"><<if $kenzie.outcome == "camp_help">>Ally<<else>>Slave<</if>><<if $kenzie.recovery_days < 3>> · recovering<</if>></span><a class="mini-btn" data-passage="Kenzie_Camp_Talk">Interact</a></div></div> <</if>> <<for _resident range setup.householdResidents>> <<print setup.safehouseResidentCard($player, _resident)>> <</for>> </div> </div> </div> <div class="actions-container"> <div class="choice-container"> <<if $player.stamina <= 0>> <div class="warning-message">You're too exhausted to go outside!</div> <a class="button dark-choice disabled" data-passage="Safehouse">Go Outside</a> <<else>> <a class="button dark-choice" data-passage="Outside">Go Outside</a> <</if>> <a class="button dark-choice" data-passage="Slave">Slave room</a> <a class="button dark-choice" data-passage="Rest">Rest</a> </div> </div> </div> <style> /* Стиль для відображення дати в неоновому зеленому стилі */ .date-display { display: flex; justify-content: space-between; background: var(--bg-medium); /* Темніший фон для контрасту */ padding: var(--space-small); border-radius: 6px; margin-bottom: var(--space-medium); border: 2px solid var(--accent-highlight); /* Зелена рамка */ box-shadow: 0 0 6px rgba(0, 255, 0, 0.5); /* Неонове світіння */ } .day, .month, .year { color: #00FF00; /* Неоновий зелений (можна замінити на var(--accent-highlight), якщо це вже зелений) */ font-family: var(--font-mono); font-size: 1.1rem; font-weight: bold; text-shadow: 0 0 4px rgba(0, 255, 0, 0.7), 0 0 8px rgba(0, 255, 0, 0.5); /* Неонове світіння тексту */ transition: text-shadow var(--transition-fast); } .day:hover, .month:hover, .year:hover { text-shadow: 0 0 6px rgba(0, 255, 0, 0.9), 0 0 12px rgba(0, 255, 0, 0.7); /* Посилене світіння при наведенні */ } /* Контейнери і + */ .actions-container { background: var(--bg-medium); border: 2px solid var(--accent-primary); border-radius: 6px; padding: var(--space-medium); margin-top: var(--space-large); box-shadow: var(--shadow-subtle), var(--glow-red); } .choice-container { display: flex; flex-wrap: wrap; gap: var(--space-small); justify-content: center; } .scene-content { margin-top: var(--space-large); padding: var(--space-large); background: var(--bg-medium); border: 2px solid var(--accent-primary); border-radius: 6px; box-shadow: var(--shadow-medium), var(--glow-red); } .scene-text h2 { font-family: var(--font-mono); color: var(--accent-highlight); text-transform: none; letter-spacing: normal; margin-bottom: var(--space-small); font-size: 1.8rem; text-shadow: 0 0 4px rgba(64, 255, 64, 0.5); } .residents-container { background: var(--bg-medium); border: 2px solid var(--accent-primary); border-radius: 6px; padding: var(--space-medium); margin: var(--space-large) 0; box-shadow: var(--shadow-subtle), var(--glow-red); } .residents-container h3 { color: var(--accent-gold); font-family: var(--font-mono); margin-bottom: var(--space-medium); text-shadow: 0 0 4px rgba(212, 160, 23, 0.5); } .characters-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--space-small); justify-items: center; } .mini-character-card { background: var(--bg-light); border: 1px solid var(--accent-primary); border-radius: 6px; padding: var(--space-small); display: flex; align-items: center; gap: var(--space-small); box-shadow: var(--shadow-subtle); transition: transform var(--transition-fast); } .mini-character-card:hover { transform: scale(1.03); box-shadow: var(--shadow-medium), var(--glow-red); } .mini-info { display: flex; flex-direction: column; gap: 4px; } .char-name { font-weight: bold; color: var(--text-light); font-size: 1.1rem; } .char-status { color: var(--text-medium); font-size: 0.9rem; } .mini-btn { background: var(--accent-blue); color: var(--text-light); padding: 6px 12px; border: 2px solid var(--accent-primary); border-radius: 6px; text-decoration: none; font-size: 0.9rem; transition: background-color var(--transition-fast), transform var(--transition-fast); box-shadow: var(--shadow-subtle); } .mini-btn:hover { background: #6b3e3c; transform: scale(1.05); box-shadow: var(--shadow-medium), var(--glow-red); } .status-message.dark { background: var(--bg-light); border: 2px solid var(--accent-primary); border-radius: 6px; padding: var(--space-small); color: var(--text-dark); text-align: center; margin: var(--space-small) 0; box-shadow: var(--shadow-subtle); } .warning-message { background: var(--bg-light); border: 2px solid var(--accent-secondary); border-radius: 6px; padding: var(--space-small); color: var(--accent-secondary); text-align: center; margin-bottom: var(--space-medium); box-shadow: var(--glow-red); } /* Анімація появи */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .scene-content, .residents-container, .actions-container { animation: fadeIn var(--transition-slow); } </style>
<div class="scene-content rc-scream-resolution"> <div class="scene-text"> <h2>Ignoring the Scream</h2> <<set $player.emily_status = "ignored">> <p> You decide not to take the risk and ignore the scream. Who knows what it could have been... </p> </div> <div class="choice-container"> <a class="button" data-passage="Outside">Return</a> </div> </div>
<main class="rc-encounter-page"> <header class="rc-encounter-header"><div><span class="rc-encounter-kicker">SAFEHOUSE / ENCOUNTER</span><h1>Sophia</h1><p>First contact</p></div><span class="rc-encounter-location">FIRST CONTACT</span></header> <aside class="rc-encounter-presence" aria-label="People present"> <img class="rc-encounter-scene-image" src="assets/cast/sophia.jpg" alt="Sophia at the safehouse"> <h2>Present</h2> <div class="rc-encounter-person"><img src="assets/cast/sophia.jpg" alt=""><div><strong>Sophia</strong><span>Survivor</span></div></div> <div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div> <p class="rc-encounter-person-detail">The kitchen window is still open behind her.</p> </aside> <section class="rc-encounter-log" aria-label="Encounter"> <h2>Encounter</h2> <p class="rc-encounter-event">You set the bottles and tins on the kitchen table. The loose board at the window taps once, then goes quiet.</p> <p class="rc-encounter-event">A woman slips inside. She puts one of the tins in her bag before she notices you standing in the doorway. She stops and raises her hands, but keeps the bag close.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Sophia</span></div><p>“I thought this place was empty.”</p></div> <p class="rc-encounter-event">She looks tired. You do not know whether she came alone.</p> </section> <nav class="choice-container rc-encounter-actions" aria-label="Available actions"><h2>What will you do with her?</h2><div class="rc-encounter-action-list"> <a class="button dark-choice" data-passage="Sophia_Enslave">Subdue her by force and make her your slave</a> <a class="button neutral-choice" data-passage="Sophia_Dominate">Dominate her and compel her to work off what she stole</a> <a class="button light-choice" data-passage="Sophia_Talk">Attempt to converse with her</a> </div></nav> </main>
<div class="inventory-panel player-inventory"> <header class="inventory-titlebar"> <div> <span class="inventory-kicker">Survivor stores</span> <h2>Inventory</h2> </div> <div class="inventory-title-meta"> <span>Stock status</span> <strong>On hand</strong> </div> </header> <section class="inventory-catalog"> <div class="inventory-section-heading"> <span>Current stock</span> <small>Only carried items are listed</small> </div> <ul class="inventory-list"> <<if $player.Caps > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/money.svg" alt="Money"> <div class="inventory-entry-copy"><strong>Money</strong><small>Currency</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Caps >></strong></div> </li> <</if>> <<if $player.Raw_meat > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/raw_meat.svg" alt="Raw meat"> <div class="inventory-entry-copy"><strong>Raw Meat</strong><small>Provision</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Raw_meat >></strong></div> </li> <</if>> <<if $player.Provisions > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/canned_food.svg" alt="Provisions"> <div class="inventory-entry-copy"><strong>Provisions</strong><small>Food and water</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Provisions >></strong></div> </li> <</if>> <<if $player.Medkit > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/medkit.svg" alt="Medkit"> <div class="inventory-entry-copy"><strong>Medkit</strong><small>Medical · +50 HP</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Medkit >></strong></div> <div class="inventory-entry-action"> <<if $player.health < $player.max_health>> <<link "Use medkit" "Inventory">> <<set $player.Medkit -= 1>> <<set $player.health = Math.min($player.max_health, $player.health + 50)>> <</link>> <<else>> <span class="inventory-unavailable">Health full</span> <</if>> </div> </li> <</if>> <<if $player.Pistol > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/pistol.svg" alt="Pistol"> <div class="inventory-entry-copy"><strong>Pistol</strong><small>Sidearm · 10 damage</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Pistol >></strong></div> <div class="inventory-entry-action"> <<link "Equip pistol">> <<if $player.Weapon_status != "Pistol">> <<if $player.Weapon_status != "none">> <<set $player[$player.Weapon_status] += 1>> <</if>> <<set $player.Pistol -= 1>> <</if>> <<set $player.Weapon_status = "Pistol">> <<set $player.Weapon_damage = 10>> <<goto "Inventory">> <</link>> </div> </li> <</if>> <<if $player.Shotgun > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/shotgun.svg" alt="Shotgun"> <div class="inventory-entry-copy"><strong>Shotgun</strong><small>Long gun · 30 damage</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Shotgun >></strong></div> <div class="inventory-entry-action"> <<link "Equip shotgun">> <<if $player.Weapon_status != "Shotgun">> <<if $player.Weapon_status != "none">> <<set $player[$player.Weapon_status] += 1>> <</if>> <<set $player.Shotgun -= 1>> <</if>> <<set $player.Weapon_status = "Shotgun">> <<set $player.Weapon_damage = 30>> <<goto "Inventory">> <</link>> </div> </li> <</if>> <<if $player.Wrench > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/wrench.svg" alt="Wrench"> <div class="inventory-entry-copy"><strong>Wrench</strong><small>Tool · 4 damage</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Wrench >></strong></div> <div class="inventory-entry-action"> <<link "Equip wrench">> <<if $player.Weapon_status != "Wrench">> <<if $player.Weapon_status != "none">> <<set $player[$player.Weapon_status] += 1>> <</if>> <<set $player.Wrench -= 1>> <</if>> <<set $player.Weapon_status = "Wrench">> <<set $player.Weapon_damage = 4>> <<goto "Inventory">> <</link>> </div> </li> <</if>> <<if $player.Knife > 0>> <li class="inventory-image inventory-entry"> <img src="assets/icons/knife.svg" alt="Knife"> <div class="inventory-entry-copy"><strong>Knife</strong><small>Blade · 8 damage</small></div> <div class="inventory-quantity"><span>Qty</span><strong><<= $player.Knife >></strong></div> <div class="inventory-entry-action"> <<link "Equip knife">> <<if $player.Weapon_status != "Knife">> <<if $player.Weapon_status != "none">> <<set $player[$player.Weapon_status] += 1>> <</if>> <<set $player.Knife -= 1>> <</if>> <<set $player.Weapon_status = "Knife">> <<set $player.Weapon_damage = 8>> <<goto "Inventory">> <</link>> </div> </li> <</if>> </ul> </section> <aside class="inventory-weapon"> <div class="equipped-heading"> <span>Active loadout</span> <strong>Equipped weapon</strong> </div> <<if $player.Weapon_status == "Pistol">> <img src="assets/icons/pistol.svg" alt="Equipped Weapon"> <div class="equipped-name">Pistol</div> <div class="equipped-stat"><span>Damage</span><strong>10</strong></div> <<elseif $player.Weapon_status == "Shotgun">> <img src="assets/icons/shotgun.svg" alt="Equipped Weapon"> <div class="equipped-name">Shotgun</div> <div class="equipped-stat"><span>Damage</span><strong>30</strong></div> <<elseif $player.Weapon_status == "Wrench">> <img src="assets/icons/wrench.svg" alt="Equipped Weapon"> <div class="equipped-name">Wrench</div> <div class="equipped-stat"><span>Damage</span><strong>4</strong></div> <<elseif $player.Weapon_status == "Knife">> <img src="assets/icons/knife.svg" alt="Equipped Weapon"> <div class="equipped-name">Knife</div> <div class="equipped-stat"><span>Damage</span><strong>8</strong></div> <<else>> <strong class="equipped-empty">No weapon equipped</strong> <span class="equipped-empty-note">Choose Equip on a weapon card</span> <</if>> </aside> </div> <<if $lastPassage != "Inventory">> <div class="inventory-close"> <<button "Close inventory" $lastPassage>><</button>> </div> <</if>>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / SOPHIA</span><h1>Accept</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-sequence-report"> <p> You tell Sophia she can stay. She leaves the tin on the table and asks where she can put her bag. </p> <<run setup.recruitResident($player, "sophia_status", "ally")>></section></div> <nav class="rc-sequence-actions"> <a class="button light-choice" data-passage="Safehouse">Show her the safehouse</a> </nav></main>
<main class="rc-rest-page rc-sophia-status-page"><header class="rc-rest-header"><span class="rc-ui-kicker">SAFE HOUSE / HOUSEHOLD</span><h1>Status Update</h1><p>Sophia is now under your complete authority. She must obey your commands, her fate entirely in your hands.</p></header> <div class="rc-rest-body"><div class="rc-rest-summary" aria-label="Household summary"><div><span>Resident</span><strong>Sophia</strong></div><div><span>Status</span><strong>Slave</strong></div><div><span>Household</span><strong>Joined</strong></div></div> <section class="status-update" aria-label="Status update"><h2>Household changes</h2><ul><li>Sophia has joined your household</li><li>New interaction options unlocked</li><li>Try interacting with her at home</li></ul></section> <nav class="rc-rest-actions"><span>Household updated</span><a class="button dark-choice" data-passage="Safehouse">Return home</a></nav></div></main>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / SOPHIA</span><h1>Banish</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-sequence-report"> <p> You tell Sophia to leave. She puts the tin back, picks up her bag, and goes through the window she opened. </p> <<set $player.sophia_status = "banished">></section></div> <nav class="rc-sequence-actions"> <a class="button neutral-choice" data-passage="Safehouse">Return to your affairs</a> </nav></main>
<main class="rc-task-page rc-task-result-page rc-task-result-cleared"> <figure class="rc-task-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Sophia</h1><p>Task canceled</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>No task assigned</strong></div> <div class="rc-task-result-copy"><p>You recall Sophia from her task. She returns home with relief.</p> <<set $player.sophia_work = "none">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<main class="rc-encounter-page rc-sophia-dominate-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">SAFEHOUSE / ENCOUNTER</span><h1>Sophia</h1><p>Terms of shelter</p></div><span class="rc-encounter-location">FIRST CONTACT</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/sophia.jpg" alt="Sophia at the safehouse"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/sophia.jpg" alt=""><div><strong>Sophia</strong><span>Survivor</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div><p class="rc-encounter-person-detail">Sophia watches you from beside the kitchen window, waiting for your answer.</p></aside> <section class="rc-encounter-log"><h2>Encounter</h2> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Put the tin back. If you want to stay, you’ll help with the work.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Sophia</span></div><p>Sophia returns it to the table. “I can do that. I know how to take care of people. Just don’t send me out tonight.”</p></div> </section><nav class="choice-container rc-encounter-actions"><h2>Available actions</h2><div class="rc-encounter-action-list"> <a class="button dark-choice" data-passage="Sophia_Work_For_Stay">Hold her to the agreement</a><a class="button neutral-choice" data-passage="Sophia_Banish">Send her away</a><a class="button danger-choice" data-passage="Sophia_Kill">End the threat</a> </div></nav></main>
<main class="rc-encounter-page rc-sophia-enslave-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">SAFEHOUSE / ENCOUNTER</span><h1>Sophia</h1><p>Make her a slave</p></div><span class="rc-encounter-location">FIRST CONTACT</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/sophia.jpg" alt="Sophia at the safehouse"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/sophia.jpg" alt=""><div><strong>Sophia</strong><span>Survivor</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div><p class="rc-encounter-person-detail">Sophia is trapped between you and the kitchen window.</p></aside> <section class="rc-encounter-log"><h2>Encounter</h2> <p class="rc-encounter-event">You catch her wrist before she reaches the window and force her back against the wall.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“You came for my supplies. You’re staying, and you’ll do what I say.”</p></div> <<set $player.sophia_status = "slave">> <<set $player.sophia_tied_unlocked = true>> <<set $player.sophia_tied_intro_pending = true>> <p class="rc-encounter-event">Sophia struggles to pull free. Then she stops. She is still looking for a way out.</p> </section> <section class="rc-sophia-encounter-media"><div class="video-container"><video id="sceneVideo" class="scene-video" autoplay muted loop playsinline><source src="assets/videos/sophia/sophia tape/extra_00-18.webm" type="video/webm"></video></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do next?</h2><div class="rc-encounter-action-list"><a class="button dark-choice" data-passage="Sophia_Tied_Service">Claim your dominance</a></div></nav></main>
<div class="scene-content"> <div class="dialog-container"> <div class="sophia-dialog"> <<if $player.sophia_status == "slave">> <p class="narrator-text">Sophia nervously fidgets with the hem of her clothing.</p> <p>"I... I've accepted my fate. Maybe this is better than starving or being killed by bandits. At least here I have a roof over my head and food. And... and you, master."</p> <p>"Thank you for giving me shelter. I'm still afraid that one day I'll wake up and find this was all a dream. That I'm back alone on the city streets. But for now... for now I feel safe."</p> <<elseif $player.sophia_status == "ally">> <p class="narrator-text">Sophia replies in a calm tone.</p> <p>"I'm okay, I'm glad you didn't kill me, that's usually what most survivors do when they have uninvited guests in their shelter, so I guess I'm just grateful to you and I think together we have a better chance of surviving."</p> <</if>> </div> </div> <div class="choice-container"> <a class="button neutral-choice" data-passage="Sophia_Talk_Menu">Return to conversation</a> </div> </div>
<<set $player.stamina = Math.max(0, $player.stamina - 30)>><<set $player.sophia_status = "slave">><<set $player.survivor_population ++>> <main class="scene-content rc-service-page rc-service-cinematic"><header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="video-container"><video id="aftermathVideo" class="scene-video" autoplay muted loop playsinline><source src="assets/videos/sophia/cum.webm" type="video/webm"></video></div> <nav class="rc-cinematic-exit"><a class="button dark-choice" data-passage="Sophia_Aftermath">Continue</a></nav></main>
<<set $player.stamina = Math.max(0, $player.stamina - 30)>><<set $player.sophia_status = "slave">><main class="scene-content rc-service-page rc-service-cinematic"><header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="video-container"><video id="cumVideo" class="scene-video" controls preload="auto" loop><source src="assets/videos/sophia/cum.webm" type="video/webm"></video></div> <nav class="rc-cinematic-exit"><a class="button dark-choice" data-passage="Sophia_Aftermath">Continue</a></nav></main>
<main class="rc-resident-page"> <header class="rc-resident-header"><div class="rc-resident-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></div> <div class="rc-resident-identity"><span class="rc-ui-kicker">SAFE HOUSE / RESIDENT</span><h1>Sophia</h1> <div class="rc-resident-facts"><div><span>Status</span><strong><<if $player.sophia_status == "slave">>Slave<<else>>Ally<</if>></strong></div> <div><span>Current task</span><strong><<if $player.sophia_work == "scavenging">>Scavenging for supplies<<elseif $player.sophia_work == "Cooking">>Cooking<<else>>None<</if>></strong></div></div> </div></header> <section class="rc-resident-options"><div class="rc-resident-options-heading"><span class="rc-ui-kicker">AVAILABLE ACTIONS</span><h2>Spend time with Sophia</h2></div> <nav class="rc-resident-actions" aria-label="Interact with Sophia"> <a class="rc-resident-action" data-passage="Sophia_Talk_Menu"><span>01 / Conversation</span><strong>Talk</strong><small>Speak with Sophia</small></a> <a class="rc-resident-action rc-resident-action-private" data-passage="Sophia_Service"><span>02 / Private</span><strong>Have sex</strong><small>Spend time together</small></a> <<if $player.sophia_tied_unlocked>> <a class="rc-resident-action rc-resident-action-private" data-passage="Sophia_Tied_Service"><span>03 / Private</span><strong>Tied sex</strong><small>Spend time with Sophia</small></a> <</if>> <a class="rc-resident-action" data-passage="Sophia_Work"><span><<if $player.sophia_tied_unlocked>>04<<else>>03<</if>> / Work</span><strong>Assign a task</strong><small>Choose a job for Sophia</small></a> </nav> </section><nav class="rc-resident-exit"><a class="button back-btn" data-passage="Safehouse">← Back</a></nav> </main>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / SOPHIA</span><h1>Kill</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-sequence-report"> <p> She moves toward the window. You strike before she reaches it. When she falls, the house is quiet again. </p> <<set $player.sophia_status = "dead">></section></div> <nav class="rc-sequence-actions"> <a class="button danger-choice" data-passage="Safehouse">Clean up the body</a> </nav></main>
<div class="scene-content"> <div class="dialog-container"> <<if $player.sophia_status == "slave">> <p class="narrator-text">Sophia lowers her gaze, her voice trembling with memories.</p> <</if>> <div class="sophia-dialog"> <p>"Before the apocalypse, I was a medical student. I dreamed of becoming a surgeon... I had a family, friends, plans for the future. But when the epidemic started, everything changed. My father was among the first to die, and my mother... she couldn't bear it and took her own life."</p> <p>"I was left alone. I had to learn to survive, to steal, to hide. For months I moved from building to building, looking for somewhere safe to sleep. And now... now I'm here."</p> </div> </div> <div class="choice-container"> <a class="button neutral-choice" data-passage="Sophia_Talk_Menu">Return to conversation</a> </div> </div>
<main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">FIRST CONTACT / SOPHIA</span><h1>Reject</h1></header> <div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-sequence-report"> <p> You open the door and wait. Sophia leaves the tin behind and walks out into the street. </p> <<set $player.sophia_status = "rejected">></section></div> <nav class="rc-sequence-actions"> <a class="button neutral-choice" data-passage="Safehouse">Return to your business</a> </nav></main>
<<if $player.stamina < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Sophia_Interact">← Back</a> </div> </div> <<else>> <div class="scene-content rc-service-page" data-rc-service="sophia"> <header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="scene-text"> <p> <<if $player.sophia_status == "slave">> Sophia obediently waits for your orders, ready to fulfill any of your desires. <<elseif $player.sophia_status == "ally">> Sophia is happy to please her saviors. <</if>> </p> </div> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/sophia/blowjob.webm" type="video/webm"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="anal" role="button" tabindex="0">Anal</a> <a class="service-btn" data-rc-video="cum" role="button" tabindex="0">Finish</a> </div> <a class="button back-btn" data-passage="Sophia_Interact">← Back</a> </div> </div> <</if>>
<<set $player.stamina = Math.max(0, $player.stamina - 20)>><main class="scene-content rc-service-page rc-service-cinematic"><header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="video-container"><video id="sexVideo" class="scene-video" controls preload="auto" loop><source src="assets/videos/sophia/vaginal (1).webm" type="video/webm"></video></div> <nav class="rc-cinematic-exit"><a class="button dark-choice" data-passage="Sophia_Final">Finish the scene</a></nav></main>
<main class="rc-task-page rc-task-result-page rc-task-result-assigned"> <figure class="rc-task-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Sophia</h1><p>Task assigned</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>Scavenging</strong></div> <div class="rc-task-result-copy"><<if $player.sophia_status == "slave">><p>You send Sophia to scavenge for supplies in the city. You see fear in her eyes, but she does not dare to refuse.</p><<else>><p>You tell Sophia to search the nearby buildings for supplies tomorrow. She asks which streets you have already checked, then marks a route on a scrap of paper.</p><</if>> <<set $player.sophia_work = "scavenging">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<main class="rc-encounter-page"> <header class="rc-encounter-header"> <div> <span class="rc-encounter-kicker">SAFEHOUSE / ENCOUNTER</span> <h1>Sophia</h1> <p>Conversation</p> </div> <span class="rc-encounter-location">FIRST CONTACT</span> </header> <aside class="rc-encounter-presence" aria-label="People present"> <img class="rc-encounter-scene-image" src="assets/cast/sophia.jpg" alt="Sophia at the safehouse"> <h2>Present</h2> <div class="rc-encounter-person"> <img src="assets/cast/sophia.jpg" alt=""> <div><strong>Sophia</strong><span>Survivor</span></div> </div> <div class="rc-encounter-person rc-encounter-person-player"> <div><strong><<print $player.name>></strong><span>You</span></div> </div> </aside> <section class="rc-encounter-log" aria-label="Encounter"> <h2>Encounter</h2> <p class="rc-encounter-event">You keep your distance and ask her to put the tin back. She does, then waits beside the window.</p> <div class="rc-encounter-statement"> <div class="rc-encounter-speaker"><span>Sophia</span></div> <p>“I needed food. I saw the window and thought no one lived here yet. I’m sorry.” She looks at the room you cleared. “I can help here, if you let me stay.”</p> </div> </section> <nav class="choice-container rc-encounter-actions" aria-label="Available actions"> <h2>Available actions</h2> <div class="rc-encounter-action-list"> <a class="button light-choice" data-passage="Sophia_Accept">Accept her offer</a> <a class="button neutral-choice" data-passage="Sophia_Reject">Refuse</a> </div> </nav> </main>
<div class="scene-content"> <div class="dialog-container"> <<if $player.sophia_status == "slave">> <p class="narrator-text">Sophia looks at you with a mix of fear and submission.</p> <div class="sophia-dialog"> <p>"Yes... master? What would you like to know?"</p> </div> <<elseif $player.sophia_status == "ally">> <p class="narrator-text">Sophia looks at you with grateful eyes, but you do not see fear in her eyes, only gratitude"</p> <div class="sophia-dialog"> <p>"Hi, I was just cleaning up, what's new?"</p> </div> <</if>> <div class="dialog-options"> <a class="button light-choice" data-passage="Sophia_Past">Ask about her past</a> <a class="button light-choice" data-passage="Sophia_Feelings">Ask how she's feeling</a> <a class="button neutral-choice" data-passage="Sophia_Interact">End conversation</a> </div> </div> </div>
<main class="rc-task-page"><figure class="rc-task-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-task-body"><header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Sophia</h1><p>Assign a task</p></header> <<if $player.sophia_work != "none">> <div class="rc-task-current"><span>Current assignment</span><strong><<print $player.sophia_work>></strong> <a class="button danger-choice" data-passage="Sophia_Cancel_Work">Cancel task</a></div> <<else>> <nav class="rc-task-options" aria-label="Tasks for Sophia"> <a class="rc-task-option" data-passage="Sophia_Start_Scavenging"><span>01 / Outside</span><strong>Start scavenging</strong><small>Search for supplies on the next day</small></a> <a class="rc-task-option" data-passage="Sophia_Cooks"><span>02 / Safe house</span><strong>Cooking</strong><small>Prepare food when raw meat is available</small></a> </nav> <</if>> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Sophia_Interact">← Return to Sophia</a></nav> </section> </main>
<main class="rc-task-page rc-task-result-page rc-task-result-assigned"> <figure class="rc-task-portrait"><img src="assets/cast/sophia.jpg" alt="Sophia"></figure> <section class="rc-task-body"> <header class="rc-task-heading"><span class="rc-ui-kicker">SAFE HOUSE / WORK ROSTER</span><h1>Sophia</h1><p>Task assigned</p></header> <div class="rc-task-result-details"> <div class="rc-task-current"><span>Current assignment</span><strong>Cooking</strong></div> <div class="rc-task-result-copy"><p>Sophia tries to cook something edible.</p> <<set $player.sophia_work = "Cooking">></div> </div> <nav class="rc-task-exit"><a class="button back-btn" data-passage="Safehouse">Return to the house</a></nav> </section> </main>
<main class="main-menu rc-main-menu"> <div class="menu-content rc-menu-shell"> <header class="rc-menu-brand"> <div class="rc-menu-kicker"><span>Survival record</span><span>RC-2037</span></div> <div class="logo-container"> <h1 class="game-logo"><span>Risen</span> City</h1> <p class="logo-subtitle">The world after the fall</p> </div> <div class="rc-menu-stamp" aria-label="Alpha build">Alpha<br>0.1</div> </header> <section class="world-info rc-menu-world" aria-label="Game premise"> <div class="rc-city-mark" aria-hidden="true"> <span></span><span></span><span></span><span></span><span></span><span></span><span></span> </div> <div class="rc-world-copy"> <div class="info-title">City status: collapsed</div> <p class="info-text">Civilization is gone. The streets are hostile. Every alliance, resource, and decision can keep you alive for one more day.</p> </div> </section> <nav class="menu-buttons rc-menu-nav" aria-label="Main menu"> <a class="rc-menu-action rc-menu-action-primary" data-passage="Choose_Name"> <span class="rc-action-index">01</span> <span class="rc-action-copy"><strong>Play</strong><small>Begin a new survival record</small></span> <span class="rc-action-arrow" aria-hidden="true">→</span> </a> <a class="rc-menu-action" data-passage="Changelog"> <span class="rc-action-index">02</span> <span class="rc-action-copy"><strong>Changelog</strong><small>Contents of the first build</small></span> <span class="rc-action-arrow" aria-hidden="true">→</span> </a> <a class="rc-menu-action" href="#" data-rc-open-saves> <span class="rc-action-index">03</span> <span class="rc-action-copy"><strong>Saves</strong><small>Load, save, import, or export</small></span> <span class="rc-action-arrow" aria-hidden="true">→</span> </a> <a class="rc-menu-action" data-passage="About"> <span class="rc-action-index">04</span> <span class="rc-action-copy"><strong>About</strong><small>World, premise, and features</small></span> <span class="rc-action-arrow" aria-hidden="true">→</span> </a> <a class="rc-menu-action" data-passage="Credits"> <span class="rc-action-index">05</span> <span class="rc-action-copy"><strong>Credits</strong><small>The actresses behind the characters</small></span> <span class="rc-action-arrow" aria-hidden="true">→</span> </a> <a class="rc-menu-action" data-passage="Settings"> <span class="rc-action-index">06</span> <span class="rc-action-copy"><strong>Settings</strong><small>Audio and playback controls</small></span> <span class="rc-action-arrow" aria-hidden="true">→</span> </a> <a class="rc-menu-action rc-menu-patreon" href="https://www.patreon.com/cw/ruinhouse" target="_blank" rel="noopener noreferrer"> <span class="rc-action-index">+</span> <span class="rc-action-copy"><strong>My Patreon</strong><small>Support continued development</small></span> <span class="rc-action-arrow" aria-hidden="true">↗</span> </a> </nav> <aside class="menu-warning rc-menu-warning"> <div class="warning-icon" aria-hidden="true">18+</div> <p><strong>Mature content warning</strong> Sexual content, dominance, violence, and brutality. By continuing, you confirm that you are at least 18 years old.</p> </aside> <footer class="version-info rc-menu-footer"> <span class="version">Version 0.1 Alpha</span> <span class="rc-footer-rule"></span> <span class="engine">Powered by SugarCube 2.37.3</span> </footer> </div> </main>
<div class="choice-container"> <<silently>> /* Initialize player inventory if not exists */ <<if not $player.hasOwnProperty("Provisions")>><<set $player.Provisions = 0>><</if>> <<if not $player.hasOwnProperty("Raw_meat")>><<set $player.Raw_meat = 0>><</if>> <<if not $player.hasOwnProperty("Medkit")>><<set $player.Medkit = 0>><</if>> <<if not $player.hasOwnProperty("Pistol")>><<set $player.Pistol = 0>><</if>> <<if not $player.hasOwnProperty("Shotgun")>><<set $player.Shotgun = 0>><</if>> <<if not $player.hasOwnProperty("Wrench")>><<set $player.Wrench = 0>><</if>> <<if not $player.hasOwnProperty("Knife")>><<set $player.Knife = 0>><</if>> <<if not $player.hasOwnProperty("Caps")>><<set $player.Caps = 0>><</if>> <</silently>> <div class="shop-container"> <h1>Trader</h1> <div class="player-info"> <div>Name: $player.name</div> <div>Health: $player.health/$player.max_health</div> <div>Stamina: $player.stamina/$player.max_stamina</div> <div>Days Survived: $player.days_survived</div> <div class="caps-display">Money: $player.Caps</div> </div> <div class="shop-section"> <h2>Buy Items</h2> <<for _item range Object.keys(setup.marketCatalog)>> <div class="item-row"> <span class="item-name"><<print _item.replace("_", " ")>></span> <span class="item-price"><<print setup.marketCatalog[_item].buy>> coins</span> <div class="rc-market-actions" aria-label="Buy actions"> <!-- Buy 1 --> <<if $player.Caps >= setup.marketCatalog[_item].buy>> <<capture _item>> <<button "Buy">> <<run setup.tradeItem($player, _item, "buy", 1)>> <<goto "Market">> <</button>> <</capture>> <<else>> <span class="disabled">[Not enough money]</span> <</if>> <!-- Buy 10 --> <<set _cost10 = setup.marketCatalog[_item].buy * 10>> <<if $player.Caps >= _cost10>> <<capture _item>> <<button "Buy 10">> <<run setup.tradeItem($player, _item, "buy", 10)>> <<goto "Market">> <</button>> <</capture>> <<else>> <span class="disabled">[Not enough money]</span> <</if>> <!-- Buy Max --> <<set _maxBuy = Math.floor($player.Caps / setup.marketCatalog[_item].buy)>> <<if _maxBuy > 0>> <<capture _item>> <<button "Buy Max">> <<run setup.tradeItem($player, _item, "buy", "max")>> <<goto "Market">> <</button>> <</capture>> <<else>> <span class="disabled">[Not enough money]</span> <</if>> </div> </div> <</for>> </div> <div class="shop-section"> <h2>Sell Items</h2> <<for _item range Object.keys(setup.marketCatalog)>> <div class="item-row"> <span class="item-name"><<print _item.replace("_", " ")>></span> <span class="item-price"><<print setup.marketCatalog[_item].sell>> coins</span> <span class="item-count">(you have: $player[_item])</span> <div class="rc-market-actions" aria-label="Sell actions"> <!-- Sell 1 --> <<if $player[_item] > 0>> <<capture _item>> <<button "Sell">> <<run setup.tradeItem($player, _item, "sell", 1)>> <<goto "Market">> <</button>> <</capture>> <<else>> <span class="disabled">[No items]</span> <</if>> <!-- Sell 10 --> <<if $player[_item] >= 10>> <<capture _item>> <<button "Sell 10">> <<run setup.tradeItem($player, _item, "sell", 10)>> <<goto "Market">> <</button>> <</capture>> <<elseif $player[_item] > 0>> <span class="disabled">[Need 10 items]</span> <<else>> <span class="disabled">[No items]</span> <</if>> <!-- Sell All --> <<set _sellAll = $player[_item]>> <<if _sellAll > 0>> <<capture _item>> <<button "Sell All">> <<run setup.tradeItem($player, _item, "sell", "all")>> <<goto "Market">> <</button>> <</capture>> <<else>> <span class="disabled">[No items]</span> <</if>> </div> </div> <</for>> </div> <div id="transaction-message" class="transaction-message"></div> <div class="inventory-section market-inventory"> <header class="market-inventory-header"> <div> <span>Trader ledger</span> <h2>Your Inventory</h2> </div> <strong>Current stock</strong> </header> <div class="inventory-grid"> <<for _item range Object.keys(setup.marketCatalog)>> <div class="inventory-item market-inventory-item"> <div class="market-inventory-icon"> <img @src="setup.marketCatalog[_item].icon" alt=""> </div> <div class="market-inventory-name"><<print _item.replace("_", " ")>></div> <div class="inventory-count"><span>Qty</span><strong>$player[_item]</strong></div> </div> <</for>> </div> </div> <a class="button back-btn" data-passage="Settlement">← Return</a> </div> </div> <style> /* Стилі для кнопок магазину */ .buy-btn, .sell-btn { /* Структура та розміри */ display: inline-flex; align-items: center; justify-content: center; min-width: 80px; height: 36px; padding: 6px 12px; margin: 0 4px; position: relative; overflow: visible; /* Фон та рамки */ background: linear-gradient(135deg, var(--bg-light), var(--bg-medium)); border: 1px solid var(--accent-secondary); border-radius: 4px; /* Світіння та ефекти */ box-shadow: var(--glow-red); /* Текст */ color: var(--accent-highlight); font-family: var(--font-mono); font-size: 0.9rem; font-weight: 500; letter-spacing: 0.5px; text-shadow: 0 0 5px rgba(154, 59, 48, 0.8); text-align: center; text-transform: uppercase; /* Анімація та переходи */ transition: all 0.25s ease-out; cursor: pointer; /* Додатковий декор */ clip-path: polygon( 0% 10%, 5px 0%, calc(100% - 5px) 0%, 100% 10%, 100% calc(100% - 5px), calc(100% - 5px) 100%, 5px 100%, 0% calc(100% - 5px) ); } /* Спеціальні стилі для кнопок купівлі */ .buy-btn { background: linear-gradient(135deg, var(--accent-blue), var(--bg-medium)); border-color: var(--accent-primary); box-shadow: var(--glow-neon-blue); } /* Спеціальні стилі для кнопок продажу */ .sell-btn { background: linear-gradient(135deg, var(--accent-primary), var(--bg-medium)); border-color: var(--accent-secondary); box-shadow: var(--glow-neon-pink); } /* Ефект наведення для всіх кнопок */ .buy-btn:hover, .sell-btn:hover { transform: scale(1.05); box-shadow: var(--glow-neon-white); border-color: var(--accent-highlight); } /* Ефект натискання */ .buy-btn:active, .sell-btn:active { transform: scale(0.98) translateY(1px); box-shadow: 0 0 8px rgba(154, 59, 48, 0.7), inset 0 0 15px rgba(154, 59, 48, 0.4); } /* Стилі для неактивних кнопок */ .buy-btn:disabled, .sell-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; } /* Стилі для тексту "Not enough money" та "No items" */ .disabled { color: var(--text-dark); font-style: italic; padding: 6px 12px; opacity: 0.7; } /* Анімація пульсації для кнопок */ @keyframes buttonPulse { 0% { box-shadow: var(--glow-red); } 50% { box-shadow: var(--glow-neon-pink); } 100% { box-shadow: var(--glow-red); } } .buy-btn, .sell-btn { animation: buttonPulse 2s infinite; } /* Стилі для контейнера з кнопками */ .item-row { display: flex; align-items: center; gap: 10px; padding: 8px; background: var(--bg-medium); border-radius: 4px; margin-bottom: 4px; transition: all 0.3s ease; } .item-row:hover { background: var(--bg-light); box-shadow: var(--glow-neon-blue); } /* Стилі для назви предмета */ .item-name { flex: 2; color: var(--text-light); font-weight: bold; text-shadow: 0 0 3px rgba(154, 59, 48, 0.4); } /* Стилі для ціни */ .item-price { flex: 1; color: var(--accent-gold); text-shadow: 0 0 3px rgba(240, 196, 32, 0.4); } /* Стилі для кількості */ .item-count { flex: 1; color: var(--text-medium); font-style: italic; } </style>
<main class="rc-settlement-page rc-place-page rc-service-counter"> <header class="rc-settlement-heading"> <div><span>Settlement / Service</span><h1>Prostitute</h1></div> <p>Paid services are available here for 10 coins.</p> </header> <section class="rc-npc-panel rc-service-counter-panel"> <div class="rc-npc-copy"> <span>Service / 10 coins</span><h2>Prostitute</h2> <p>The prostitute offers a private service.</p> <nav class="rc-npc-actions choice-container"> <<if $player.Caps > 9>><a class="button dark-choice" data-passage="Prostitute_Service">Pay 10 coins</a> <<else>><span class="rc-action-unavailable">10 coins required</span><</if>> <a class="button back-btn" data-passage="Settlement">Return to Settlement</a> </nav> </div> </section> </main>
<<if $musicEnabled>> <<link "Turn Off">> <<set $musicEnabled = false>> <<replace "#music-status">>Off<</replace>> <<replace "#music-toggle">> <<link "Turn On">> <<set $musicEnabled = true>> <<replace "#music-status">>On<</replace>> <<replace "#music-toggle">><<include "MusicToggle">><</replace>> <<run document.getElementById('bg-music').play()>> <</link>> <</replace>> <<run document.getElementById('bg-music').pause()>> <</link>> <<else>> <<link "Turn On">> <<set $musicEnabled = true>> <<replace "#music-status">>On<</replace>> <<replace "#music-toggle">> <<link "Turn Off">> <<set $musicEnabled = false>> <<replace "#music-status">>Off<</replace>> <<replace "#music-toggle">><<include "MusicToggle">><</replace>> <<run document.getElementById('bg-music').pause()>> <</link>> <</replace>> <<run document.getElementById('bg-music').play()>> <</link>> <</if>>
<<set $player.current_location = "Outside">><div class="scene-content"> <div class="scene-text"> <h2>Outside</h2> <p>You stand in the middle of a devastated city. Broken windows and abandoned cars serve as reminders of the catastrophe that occurred. The air is heavy with the smell of decay and dust.</p> </div> <!-- Локації --> <div class="locations-section"> <h3>Locations</h3> <div class="locations-grid"> <<if $discovered_bunker>><a class="location-btn" data-passage="Bunker"><span class="location-icon">🔒</span><span>Bunker</span></a><</if>> <<if $discovered_mistral_mansion and $mistral_route_opened and ($bunker_quest_progress == "Phase 1" or $bunker_quest_progress == "Complete" or $bunker_quest_progress == "END")>><a class="location-btn" data-passage="Mistral_Mansion"><span class="location-icon">🏰</span><span>Mistral Mansion</span></a><</if>> <<if $discovered_city_center>><a class="location-btn" data-passage="City_Center"><span class="location-icon">🏙️</span><span>City center</span></a><</if>> <<if $discovered_farm>><a class="location-btn" data-passage="Farm"><span class="location-icon">🌾</span><span>Farm</span></a><</if>> <<if $discovered_settlement>><a class="location-btn" data-passage="Settlement"><span class="location-icon">🏚️</span><span>Settlement</span></a><</if>> <<if $discovered_forest>><a class="location-btn" data-passage="Forest"><span class="location-icon">🌲</span><span>Forest</span></a><</if>> </div> </div> <!-- Дії --> <div class="actions-section"> <div class="choice-container"> <<if $player.emily_status == "unknown">><a class="button dark-choice enabled" data-passage="Search_Supplies">Scream</a><</if>> <<if $player.stamina lt 20>> <span class="warning-message rc-action-warning">20 energy is required to search or explore.</span> <<else>> <<if !$player.first_search>> <<set $player.first_search = true>><<set $found_food = true>><<set $found_meds = random(1, 100) lte 5>> <a class="button dark-choice" data-passage="Search_Result">Search for supplies</a> <<else>> <<set $found_food = random(1, 100) lte 50>><<set $found_meds = random(1, 100) lte 5>> <a class="button dark-choice" data-passage="Search_Result">Search for supplies</a> <</if>> <a class="button dark-choice" data-passage="Explore_Area">Explore area</a> <</if>> <a class="button back-btn" data-passage="Safehouse">Return home</a> </div> </div> </div>
<<if !setup.ignoredPassages.has(State.passage)>> <<set $lastPassage = State.passage>> <</if>>
<div class="scene-content"> <div class="encounter-header"> <h2>Dangerous Encounter</h2> </div> <div class="character-encounter"> <div class="encounter-image"> <img src="assets/cast/raider.png" alt="Raider" class="character-image"> </div> <div class="encounter-text"> <p>A woman with a gun and a cold look is standing in front of you, and she is clearly not going to back down.</p> <div class="dialog"> <p class="raider-dialog">"Are you a real man? You're worth a fortune, surrender and I'll take care of you."</p> </div> <p>She aims her weapon at you and steps closer. You can fight or try to run before she gets a clear shot.</p> </div> </div> <div class="choice-container"> <a class="button danger-choice" data-passage="Combat_Raider">Fight</a> <a class="button" data-passage="Outside">Try to escape</a> </div> </div>
<main class="rc-combat-outcome rc-capture-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / AFTERMATH</span><h1>Subjugating Raider</h1></header> <div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><img src="assets/cast/raider.png" alt=""><figcaption>Subjugating Raider</figcaption></figure><section class="rc-outcome-report"> <h2>Subjugating Raider</h2> <p> "Now get on your knees, whore, you're my property now. Now show me your submission." </p> <<set $player.slaves += 1>> <p> "Now you are my slave," you say, binding her hands. "And you will believe your own fate..." </p></section></div> <nav class="rc-outcome-actions"> <a class="button dark-choice" data-passage="Slaves_Service">Secure the subjugation</a> <a class="button" data-passage="Safehouse">Take her home</a> </nav> </main>
<main class="rc-combat-outcome rc-execution-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / AFTERMATH</span><h1>Execution of Raider</h1></header> <div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><img src="assets/cast/raider.png" alt=""><figcaption>Execution of Raider</figcaption></figure><section class="rc-outcome-report"> <h2>Execution of Raider</h2> <p> You decide not to spare her. One strike ends it. You search her belongings and find some useful supplies. </p> <section class="loot rc-loot" aria-label="Recovered supplies"> <header class="rc-loot-header"><span>RECOVERED / RAIDER'S GEAR</span><h3>Supplies secured</h3></header> <ul> <<set $player.Provisions += 5>> <<set $player.Medkit ++>> <<set $player.Pistol ++>> <li><img src="assets/icons/canned_food.svg" alt=""><span>Provisions</span><strong>+5</strong></li> <li><img src="assets/icons/medkit.svg" alt=""><span>Medkit</span><strong>+1</strong></li> <li><img src="assets/icons/pistol.svg" alt=""><span>Pistol</span><strong>+1</strong></li> </ul> </section></section></div> <nav class="rc-outcome-actions"> <<if $player.current_location == "City_Center">> <a class="button" data-passage="City_Center">Return</a> <</if>> </nav> </main>
<main class="rc-settlement-page rc-place-page"><header class="rc-settlement-heading"><div><span>Settlement / Residents</span><h1>Residential District</h1></div><p>A row of improvised homes marked with their occupants' names.</p></header> <<if !$kenzie || $kenzie.outcome == "none" || $kenzie.outcome == "saved">> <section class="rc-npc-panel"><div class="rc-npc-portrait"><img src="assets/cast/kenzie.jpg" alt="Kenzie"></div><div class="rc-npc-copy"><span>Available NPC / Scout</span><h2>Kenzie</h2><p><<if $kenzie && $kenzie.outcome == "saved">>Kenzie is back at her door, shotgun within reach. She greets you before you can knock.<<else>>Kenzie is repairing her shotgun on the steps of her home. She looks up when you approach.<</if>></p><nav class="rc-npc-actions choice-container"><a class="button" data-passage="Kenzie_Talk">Talk with Kenzie</a><a class="button back-btn" data-passage="Settlement">Return to Settlement</a></nav></div></section> <<else>><div class="status-message">Kenzie's home is empty.</div><nav class="choice-container"><a class="button back-btn" data-passage="Settlement">Return to Settlement</a></nav><</if>></main>
<main class="rc-rest-page"> <header class="rc-rest-header"><span class="rc-ui-kicker">SAFE HOUSE / END OF DAY</span><h1>Rest</h1> <p>You decide to rest and recover your strength. The day comes to an end...</p></header> <div class="rc-rest-body"> <<set $player.stamina = $player.max_stamina>> <<set $player.health = $player.max_health>> <<set $player.days_survived += 1>> <<if $kenzie && ($kenzie.outcome == "camp_help" || $kenzie.outcome == "camp_slave")>> <<set $kenzie.recovery_days = Math.min(3, (Number($kenzie.recovery_days) || 0) + 1)>> <</if>> <div class="rc-rest-summary" aria-label="Rest summary"> <div><span>Day</span><strong><<print $player.days_survived>></strong></div> <div><span>Health</span><strong><<print $player.health>> / <<print $player.max_health>></strong></div> <div><span>Energy</span><strong><<print $player.stamina>> / <<print $player.max_stamina>></strong></div> </div> <section class="status-update" aria-label="Status update"><h2>Status Update</h2> <ul> <li class="success">Energy fully restored!</li> <li class="success">Health fully restored!</li> <<set _cooking = setup.prepareProvisions($player)>> <<if _cooking > 0>><li>Prepared provisions: <<print _cooking>>.</li><</if>> <<set _meal = setup.consumeProvisions($player)>> <li>Provisions used: <<print _meal.consumed>></li> <<run setup.updateResidentHunger($player, _meal.shortOnFood)>> <<if $player.sophia_status == "starving">><h4>Sophia is starving!</h4><</if>> <<if $player.emily_status == "starving">><h4>Emily is starving!</h4><</if>> <<if $player.lena_status == "starving">><h4>Lena is starving!</h4><</if>> <li>Another day has passed...</li> <<set _scavenging = setup.scavengeForSupplies($player, random)>> <<for _result range _scavenging>> <<if _result.provisions>><li class="success"><<print _result.name>> found provisions!</li><</if>> <<if _result.medkit>><li class="success"><<print _result.name>> found medical supplies!</li><</if>> <</for>> </ul> </section> <nav class="rc-rest-actions"><span>Provisions remaining: <<print $player.Provisions>></span> <a class="button dark-choice" data-passage="Safehouse">Wake Up</a></nav> </div> </main>
<<set _searchStaminaBefore = $player.stamina>> <<set $player.stamina = Math.max(0, $player.stamina - 20)>> <<set _searchFood = 0>> <<set _searchMedkits = 0>> <<if $found_food>> <<set _searchFood = random(1, 4)>> <<set $player.Provisions += _searchFood>> <</if>> <<if $found_meds>> <<set _searchMedkits = random(0, 2)>> <<if _searchMedkits gt 0>><<set $player.Medkit += _searchMedkits>><</if>> <</if>> <style> html[data-rc-passage=search-result] body #passages #passage-search-result > br { display: none !important; } html body #passages #passage-search-result .rc-search-page { box-sizing: border-box !important; width: 100% !important; max-width: 840px !important; min-width: 0 !important; margin: 0 auto !important; padding: 0 !important; overflow: hidden !important; border: 1px solid #696354 !important; border-radius: 2px !important; background: #e7ddc8 !important; box-shadow: 0 14px 38px rgba(0, 0, 0, .25) !important; } html body #passages #passage-search-result .rc-search-page br { display: none !important; } html body #passages #passage-search-result .rc-search-header { box-sizing: border-box !important; display: flex !important; justify-content: space-between !important; align-items: center !important; gap: 16px !important; margin: 0 !important; padding: 18px clamp(20px, 3vw, 30px) !important; border-bottom: 4px solid #9c7a47 !important; background: #252c27 !important; } html body #passages #passage-search-result .rc-search-kicker, html body #passages #passage-search-result .rc-search-status { color: #c9b591 !important; font: 800 .7rem/1.3 var(--ui-mono) !important; letter-spacing: .12em !important; text-transform: uppercase !important; } html body #passages #passage-search-result .rc-search-header h1 { margin: 4px 0 0 !important; color: #f0e8d8 !important; font: 900 clamp(1.6rem, 3vw, 2.25rem)/1.08 var(--ui-display) !important; text-transform: uppercase !important; } html body #passages #passage-search-result .rc-search-status { flex: 0 0 auto !important; padding: 7px 10px !important; border: 1px solid #a48d67 !important; text-align: center !important; } html body #passages #passage-search-result .rc-search-body { box-sizing: border-box !important; display: grid !important; gap: 10px !important; margin: 0 !important; padding: clamp(18px, 3vw, 28px) !important; background: var(--v2-paper-low) !important; background-image: var(--v2-paper-texture) !important; } html body #passages #passage-search-result .rc-search-label { margin: 0 0 3px !important; color: #5c614e !important; font: 800 .68rem/1.2 var(--ui-mono) !important; letter-spacing: .1em !important; text-transform: uppercase !important; } html body #passages #passage-search-result .rc-search-find { box-sizing: border-box !important; display: flex !important; align-items: center !important; gap: 13px !important; min-width: 0 !important; min-height: 70px !important; margin: 0 !important; padding: 11px 16px !important; border-left: 5px solid #607652 !important; background: #dce2d3 !important; } html body #passages #passage-search-result .rc-search-find img { flex: 0 0 auto !important; width: 40px !important; height: 40px !important; object-fit: contain !important; } html body #passages #passage-search-result .rc-search-find strong { color: #2e3e2c !important; font: 900 clamp(1.3rem, 2.5vw, 1.8rem)/1.15 var(--ui-display) !important; overflow-wrap: anywhere !important; } html body #passages #passage-search-result .rc-search-find-empty { border-left-color: #8f8778 !important; background: #e7dfd0 !important; } html body #passages #passage-search-result .rc-search-find-empty strong { color: #383831 !important; } html body #passages #passage-search-result .rc-search-note { margin: 2px 0 0 !important; color: #504e45 !important; font: 500 .92rem/1.4 var(--ui-body) !important; } html body #passages #passage-search-result .rc-search-actions { box-sizing: border-box !important; display: flex !important; justify-content: space-between !important; align-items: center !important; gap: 14px !important; margin: 0 !important; padding: 16px clamp(20px, 3vw, 30px) !important; border-top: 3px solid #a48d67 !important; background: #272c26 !important; } html body #passages #passage-search-result .rc-search-cost { color: #d2c6ae !important; font: 700 .72rem/1.3 var(--ui-mono) !important; text-transform: uppercase !important; } html body #passages #passage-search-result .rc-search-action-list { display: flex !important; justify-content: flex-end !important; gap: 10px !important; min-width: 0 !important; } html body #passages #passage-search-result .rc-search-action-list a { box-sizing: border-box !important; display: flex !important; align-items: center !important; justify-content: center !important; min-width: 145px !important; min-height: 56px !important; width: auto !important; height: auto !important; margin: 0 !important; padding: 10px 15px !important; border: 1px solid #c4ad7b !important; border-radius: 0 !important; background: #b48c4e !important; color: #201f1b !important; font: 900 .83rem/1.25 var(--ui-display) !important; text-align: center !important; text-decoration: none !important; text-transform: uppercase !important; } html body #passages #passage-search-result .rc-search-action-list a.rc-search-return { border-color: #b9ad93 !important; background: #e5dac4 !important; } html body #passages #passage-search-result .rc-search-action-list a:hover, html body #passages #passage-search-result .rc-search-action-list a:focus-visible { outline: 2px solid #e6c892 !important; outline-offset: 2px !important; filter: brightness(1.08) !important; } @media (max-width: 640px) { html body #passages #passage-search-result .rc-search-header, html body #passages #passage-search-result .rc-search-actions { flex-wrap: wrap !important; } html body #passages #passage-search-result .rc-search-action-list { width: 100% !important; } html body #passages #passage-search-result .rc-search-action-list a { flex: 1 1 0 !important; min-width: 0 !important; } } </style> <main class="rc-search-page"> <header class="rc-search-header"> <div><span class="rc-search-kicker">OUTSIDE / SCAVENGING</span><h1>Search result</h1></div> <span class="rc-search-status"><<if _searchFood + _searchMedkits gt 0>>SUPPLIES FOUND<<else>>NO SUPPLIES<</if>></span> </header> <section class="rc-search-body" aria-label="Supplies found"> <p class="rc-search-label">Recovered</p> <<if _searchFood gt 0>> <div class="rc-search-find"><img src="assets/icons/canned_food.svg" alt=""><strong>+<<= _searchFood>> <<if _searchFood is 1>>Provision<<else>>Provisions<</if>></strong></div> <</if>> <<if _searchMedkits gt 0>> <div class="rc-search-find"><img src="assets/icons/medkit.svg" alt=""><strong>+<<= _searchMedkits>> <<if _searchMedkits is 1>>First aid kit<<else>>First aid kits<</if>></strong></div> <</if>> <<if _searchFood + _searchMedkits is 0>> <div class="rc-search-find rc-search-find-empty"><strong>Nothing found</strong></div> <</if>> <<if $found_meds and _searchMedkits is 0>> <p class="rc-search-note">You found an empty first aid kit.</p> <<elseif !$found_food and !$found_meds>> <p class="rc-search-note">You found no usable provisions this time.</p> <</if>> </section> <nav class="rc-search-actions" aria-label="Search actions"> <span class="rc-search-cost">−<<= _searchStaminaBefore - $player.stamina>> stamina · <<print $player.stamina>> left</span> <div class="rc-search-action-list"> <<if $player.stamina gte 20>> <<link "Search again" "Search_Result">><<set $found_food = random(1, 100) lte 50>><<set $found_meds = random(1, 100) lte 5>><</link>> <</if>> <a class="button rc-search-return" data-passage="Outside">Return to Outside</a> </div> </nav> </main>
<main class="rc-scream-page rc-scream-lead"><header class="rc-scream-header"> <span class="rc-ui-kicker">OUTSIDE / ABANDONED SUPERMARKET</span><span class="rc-scream-alert">DISTRESS CALL</span> <h1>A scream in the ruins</h1><p class="rc-scream-context">Scavenging for Provisions</p></header> <div class="rc-scream-copy"> <<set $player.first_search = true>> <<set $player.stamina = Math.max(0, $player.stamina - 20)>> <p> A cry for help comes from an abandoned supermarket. Then you hear someone rattling a metal gate. </p> </div> <nav class="rc-scream-actions"><a class="button dark-choice" data-passage="Emily_Event">Investigate the scream</a> <a class="button" data-passage="Ignore_Scream">Ignore it</a></nav> </main>
<<if $player.slaves > 0>> <<set $player.Caps += 200>> <<set $player.slaves -= 1>> <<goto "Slave_Market">> <<else>> <<goto "Slave_Market">> <</if>>
<<set $soundVolume = $soundVolume ?? (localStorage.getItem('soundVolume') ? Number(localStorage.getItem('soundVolume')) : 50)>> <<set $musicVolume = $musicVolume ?? (localStorage.getItem('musicVolume') ? Number(localStorage.getItem('musicVolume')) : 50)>> <<set $musicEnabled = $musicEnabled ?? (localStorage.getItem('musicEnabled') ? JSON.parse(localStorage.getItem('musicEnabled')) : true)>> <<set $currentTrackIndex = $currentTrackIndex ?? 0>> <!-- Індекс поточного треку --> <div class="settings-page"> <div class="settings-header"> <h1>Settings</h1> <a class="back-button" data-passage="MainMenu"> <span class="back-icon">←</span> Return to menu </a> </div> <div class="settings-section"> <h3>Sound Volume: <span id="sound-volume-display"><<print $soundVolume>></span></h3> <div class="volume-controls"> <<link "-">> <<set $soundVolume = Math.max(0, $soundVolume - 10)>> <<replace "#sound-volume-display">><<print $soundVolume>><</replace>> <<run localStorage.setItem('soundVolume', $soundVolume)>> <</link>> <<link "+">> <<set $soundVolume = Math.min(100, $soundVolume + 10)>> <<replace "#sound-volume-display">><<print $soundVolume>><</replace>> <<run localStorage.setItem('soundVolume', $soundVolume)>> <</link>> </div> </div> <div class="settings-section"> <h3>Music Volume: <span id="music-volume-display"><<print $musicVolume>></span></h3> <div class="volume-controls"> <<link "-">> <<set $musicVolume = Math.max(0, $musicVolume - 10)>> <<replace "#music-volume-display">><<print $musicVolume>><</replace>> <<run localStorage.setItem('musicVolume', $musicVolume)>> <<run document.getElementById('bg-music').volume = $musicVolume / 100>> <</link>> <<link "+">> <<set $musicVolume = Math.min(100, $musicVolume + 10)>> <<replace "#music-volume-display">><<print $musicVolume>><</replace>> <<run localStorage.setItem('musicVolume', $musicVolume)>> <<run document.getElementById('bg-music').volume = $musicVolume / 100>> <</link>> </div> </div> <div class="settings-section"> <h3>Music: <span id="music-status"><<if $musicEnabled>>On<<else>>Off<</if>></span></h3> <div class="toggle-controls" id="music-toggle"> <<if $musicEnabled>> <<link "Turn Off">> <<set $musicEnabled = false>> <<replace "#music-status">>Off<</replace>> <<replace "#music-toggle">> <<link "Turn On">> <<set $musicEnabled = true>> <<replace "#music-status">>On<</replace>> <<replace "#music-toggle">><<include "MusicToggle">><</replace>> <<run localStorage.setItem('musicEnabled', JSON.stringify($musicEnabled))>> <<run document.getElementById('bg-music').play()>> <</link>> <</replace>> <<run localStorage.setItem('musicEnabled', JSON.stringify($musicEnabled))>> <<run document.getElementById('bg-music').pause()>> <</link>> <<else>> <<link "Turn On">> <<set $musicEnabled = true>> <<replace "#music-status">>On<</replace>> <<replace "#music-toggle">> <<link "Turn Off">> <<set $musicEnabled = false>> <<replace "#music-status">>Off<</replace>> <<replace "#music-toggle">><<include "MusicToggle">><</replace>> <<run localStorage.setItem('musicEnabled', JSON.stringify($musicEnabled))>> <<run document.getElementById('bg-music').pause()>> <</link>> <</replace>> <<run localStorage.setItem('musicEnabled', JSON.stringify($musicEnabled))>> <<run document.getElementById('bg-music').play()>> <</link>> <</if>> </div> </div> <div class="settings-section"> <h3>Current Track: <span id="current-track-display">track <<print $currentTrackIndex + 1>></span></h3> <div class="volume-controls"> <<link "Previous">> <<set $currentTrackIndex = Math.max(0, $currentTrackIndex - 1)>> <<run window.rcMusic.sync()>> <<replace "#current-track-display">>track <<print $currentTrackIndex + 1>><</replace>> <</link>> <<link "Next">> <<set $currentTrackIndex = Math.min(2, $currentTrackIndex + 1)>> <<run window.rcMusic.sync()>> <<replace "#current-track-display">>track <<print $currentTrackIndex + 1>><</replace>> <</link>> </div> </div> <!-- The music player is initialized for the whole story. --> <<script>>window.rcMusic.sync();<</script>> </div> <style> /* CSS Custom Properties for consistency */ :root { --space-xs: 0.5rem; --space-small: 0.75rem; --space-medium: 1rem; --space-large: 1.5rem; --transition-fast: 0.2s ease; --transition-slow: 0.5s ease; --shadow-subtle: 0 2px 4px rgba(0, 0, 0, 0.1); --shadow-medium: 0 4px 8px rgba(0, 0, 0, 0.15); --glow-red: 0 0 6px rgba(154, 59, 48, 0.6), 0 0 12px rgba(154, 59, 48, 0.3); --glow-green: 0 0 6px rgba(0, 255, 102, 0.7), 0 0 12px rgba(0, 255, 102, 0.4); --glow-neon-blue: 0 0 8px rgba(154, 59, 48, 0.7), 0 0 16px rgba(154, 59, 48, 0.4); --glow-neon-pink: 0 0 8px rgba(154, 59, 48, 0.7), 0 0 16px rgba(154, 59, 48, 0.4); --font-mono: 'Fira Code', 'Consolas', monospace; --bg-dark: #191a17; --bg-medium: #191a17; --bg-light: #292a25; --text-light: #f1ecde; --text-medium: #c4bcaa; --text-dark: #9a3b30; --accent-primary: #292a25; --accent-secondary: #9a3b30; --accent-highlight: #9a3b30; --accent-gold: #f0c420; --accent-blue: #292a25; --accent-green: #00ff66; --accent-white: #ffffff; } /* Settings page container */ .settings-page { margin: var(--space-large) auto; padding: var(--space-large); max-width: 800px; background: linear-gradient(145deg, var(--bg-medium), var(--bg-dark)); border: 2px solid var(--accent-primary); border-radius: 8px; box-shadow: var(--shadow-medium), var(--glow-red); animation: fadeIn var(--transition-slow); } /* Header styling */ .settings-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-large); flex-wrap: wrap; gap: var(--space-medium); } .settings-header h1 { font-family: var(--font-mono); color: var(--accent-highlight); font-size: clamp(1.5rem, 5vw, 2rem); text-shadow: 0 0 4px rgba(64, 255, 64, 0.5); margin: 0; } /* Back button */ .back-button { display: inline-flex; align-items: center; gap: var(--space-xs); color: var(--text-light); text-decoration: none; font-family: var(--font-mono); font-size: 1rem; padding: var(--space-small) var(--space-medium); border: 2px solid var(--accent-secondary); border-radius: 6px; background: var(--bg-dark); transition: all var(--transition-fast); box-shadow: var(--shadow-subtle), var(--glow-neon-blue); text-shadow: 0 0 2px rgba(0, 0, 0, 0.5); } .back-button:hover, .back-button:focus-visible { background: var(--bg-medium); color: var(--accent-white); transform: translateY(-2px); box-shadow: var(--shadow-medium), var(--glow-neon-pink); text-shadow: 0 0 4px rgba(0, 0, 0, 0.7); outline: none; } .back-icon { font-size: 1.2rem; transition: transform var(--transition-fast); } .back-button:hover .back-icon, .back-button:focus-visible .back-icon { transform: translateX(-2px); } /* Settings section */ .settings-section { background: var(--bg-light); border: 2px solid var(--accent-secondary); border-radius: 6px; padding: var(--space-medium); margin-bottom: var(--space-large); box-shadow: var(--shadow-subtle), var(--glow-neon-blue); transition: transform var(--transition-fast); } .settings-section:hover { transform: translateY(-2px); } .settings-section h3 { color: var(--accent-highlight); font-family: var(--font-mono); font-size: 1.25rem; margin-bottom: var(--space-small); text-shadow: var(--glow-neon-pink); } /* Control groups */ .volume-controls, .toggle-controls { display: flex; flex-wrap: wrap; gap: var(--space-small); justify-content: center; margin: var(--space-small) 0; } .volume-controls a, .toggle-controls a { display: inline-flex; align-items: center; justify-content: center; padding: var(--space-small) var(--space-medium); border-radius: 6px; font-family: var(--font-mono); font-size: 1rem; text-decoration: none; transition: all var(--transition-fast); cursor: pointer; text-shadow: 0 0 2px rgba(0, 0, 0, 0.5); } /* Volume controls */ .volume-controls a { background: var(--bg-dark); color: var(--text-light); border: 2px solid var(--accent-secondary); box-shadow: var(--shadow-subtle), var(--glow-neon-blue); } .volume-controls a:hover, .volume-controls a:focus-visible { background: var(--bg-medium); color: var(--accent-white); transform: translateY(-2px); box-shadow: var(--shadow-medium), var(--glow-neon-pink); text-shadow: 0 0 4px rgba(0, 0, 0, 0.7); outline: none; } /* Toggle controls */ .toggle-controls a { background: var(--bg-dark); color: var(--text-light); border: 2px solid var(--accent-green); box-shadow: var(--shadow-subtle), var(--glow-neon-green); } .toggle-controls a:hover, .toggle-controls a:focus-visible { background: var(--bg-medium); color: var(--accent-white); transform: translateY(-2px); box-shadow: var(--shadow-medium), var(--glow-neon-green); text-shadow: 0 0 4px rgba(0, 0, 0, 0.7); outline: none; } /* Fade-in animation */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* Responsive design */ @media (max-width: 600px) { .settings-page { margin: var(--space-medium); padding: var(--space-medium); } .settings-header { flex-direction: column; align-items: flex-start; } .volume-controls, .toggle-controls { flex-direction: column; align-items: center; } } /* High contrast mode for accessibility */ @media (prefers-contrast: high) { .settings-page { background: var(--bg-dark); border-color: var(--accent-white); } .settings-section { background: var(--bg-medium); border-color: var(--accent-white); } .back-button, .volume-controls a, .toggle-controls a { border-color: var(--accent-white); color: var(--accent-white); } } /* Reduced motion for accessibility */ @media (prefers-reduced-motion: reduce) { .settings-page, .settings-section, .back-button, .volume-controls a, .toggle-controls a { animation: none; transition: none; } } </style>
<<set $player.current_location = "Settlement">> <main class="rc-settlement-page rc-settlement-hub"> <header class="rc-settlement-heading"> <div><span>District / Occupied Zone</span><h1>Survivor Settlement</h1></div> <p>A defended community built from salvaged materials. Trade, local services, work and residents are organized across six districts.</p> </header> <nav class="rc-settlement-grid" aria-label="Settlement areas"> <a class="rc-area-card" data-passage="Market"><span>Trade</span><strong>Market</strong><small>Buy and sell supplies</small></a> <a class="rc-area-card" data-passage="Slave_Market"><span>Exchange</span><strong>Slave Market</strong><small>Review available transactions</small></a> <a class="rc-area-card" data-passage="Bar"><span>Social</span><strong>Bar</strong><small>Meet Lesana at the Matriarch</small></a> <a class="rc-area-card" data-passage="Administration"><span>Civic</span><strong>Administration</strong><small>Speak with Cory about work</small></a> <a class="rc-area-card" data-passage="Prostitute"><span>Service</span><strong>Prostitute</strong><small>Paid services for 10 coins</small></a> <a class="rc-area-card" data-passage="Residential_District"><span>Residents</span><strong>Residential District</strong><small><<if $kenzie && ($kenzie.outcome == "camp_help" || $kenzie.outcome == "camp_slave" || $kenzie.outcome == "dead")>>Visit the residential area<<else>>Visit Kenzie at her home<</if>></small></a> </nav> <nav class="rc-settlement-actions choice-container"><a class="button back-btn" data-passage="Outside">Return Outside</a></nav> </main>
<<set $player.lesana_status = "Familiar">> <p class="rc-encounter-event">You pull up a stool. Lesana puts down the glass she's drying.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“New face. I'm Lesana. What should I call you?”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“<<print $player.name>>.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“All right. You staying around here?”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Found a house outside town. The door still closes, mostly.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“That's a start.” She folds the cloth over her shoulder. “How'd you end up there?”</p></div> <nav class="choice-container"><a class="button light-choice" data-passage="Lesana_Tell_Story">Tell her how you got there</a><a class="button neutral-choice" data-passage="Bar">Leave it there</a></nav>
<p class="rc-encounter-event">Lesana gives the counter a quick wipe as you sit down.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“Back again. How's the house?”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Still standing.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“Good enough for me.” She reaches for a clean glass. “Drink? Ten caps.”</p></div> <nav class="choice-container"><<if $player.Caps >= 10>><a class="button light-choice" data-passage="Lesana_Drink">Buy a drink (10 caps)</a><<else>><a class="button disabled" aria-disabled="true" tabindex="-1">Buy a drink (need 10 caps)</a><</if>><a class="button neutral-choice" data-passage="Bar">Return to the bar</a></nav>
<<set $player.lesana_status = "Familiar">> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“I stayed inside for six months. I had food for a while. Then it ran low.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“Six months?” She rests her elbows on the counter. “Go on.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Went out with a wrench. Found an empty house and started clearing it. Still needs work.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“They all do. You eating all right?”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“I'm managing. Came in to see what the settlement's like.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“Sit a while, then. A drink's ten caps. The stool's free.”</p></div> <nav class="choice-container"><<if $player.Caps >= 10>><a class="button light-choice" data-passage="Lesana_Drink">Buy a drink (10 caps)</a><<else>><a class="button disabled" aria-disabled="true" tabindex="-1">Buy a drink (need 10 caps)</a><</if>><a class="button neutral-choice" data-passage="Bar">No, thanks</a></nav>
<<if $player.Caps >= 10>> <<set $player.Caps -= 10>> <p class="rc-encounter-event">You put ten caps on the counter. Lesana counts them with her thumb, pours from a brown bottle, and slides the glass over. You take a sip. It burns.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“Give it a second.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Does it get better?”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“You get used to it.” She takes the empty glass when you're done.</p></div> <<else>> <p class="rc-encounter-event">You check your caps. There aren't enough for a drink.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Lesana</span></div><p>“It's ten caps. Come back when you've got them.”</p></div> <</if>> <nav class="choice-container"><a class="button neutral-choice" data-passage="Lesana_Talk_Menu">Keep talking</a><a class="button neutral-choice" data-passage="Bar">Return to the bar</a></nav>
<main class="rc-roster-page"> <section class="rc-roster-card"> <div class="rc-roster-portrait"> <img src="assets/cast/slave.png" alt="Slave roster"> </div> <div class="rc-roster-copy"> <span>Safehouse / Slave Room</span> <h2>Slave Room</h2> <div class="rc-roster-count"> <strong><<print $player.slaves>></strong> <small><<if $player.slaves is 1>>slave available<<else>>slaves available<</if>></small> </div> <p><<if $player.slaves > 0>>Choose an interaction with the members of your household.<<else>>No slaves are currently registered in the safehouse.<</if>></p> <nav class="rc-roster-actions choice-container" aria-label="Slave room actions"> <<if $player.slaves > 0>><a class="button dark-choice" data-passage="Slaves_Service">Use Slaves</a> <<else>><a class="button dark-choice disabled" aria-disabled="true">Use Slaves</a><</if>> <a class="button back-btn" data-passage="Safehouse">Return to Safe House</a> </nav> </div> </section> </main>
<main class="rc-settlement-page rc-slave-market-page"> <header class="rc-settlement-heading"> <div><span>Settlement / Exchange</span><h1>Slave Market</h1></div> <div class="rc-resource-strip"> <span><img src="assets/icons/money.svg" alt=""><small>Money</small><strong><<print $player.Caps>></strong></span> <span><img src="assets/cast/slave.png" alt=""><small>Owned</small><strong><<print $player.slaves>></strong></span> </div> </header> <section class="rc-market-offer"> <div class="rc-offer-portrait"><img src="assets/cast/slave.png" alt="Available slave"></div> <div class="rc-offer-copy"> <span>Available Character</span><h2>Slave</h2> <dl><div><dt>Purchase price</dt><dd>400 coins</dd></div><div><dt>Sale value</dt><dd>200 coins</dd></div></dl> <nav class="rc-offer-actions choice-container"> <<if $player.Caps >= 400>><a class="button market-btn buy" data-passage="Buy_Slave">Buy Slave (400 coins)</a> <<else>><span class="rc-action-unavailable">400 coins required to buy</span><</if>> <<if $player.slaves > 0>><a class="button market-btn sell" data-passage="Sell_Slave">Sell One Slave (200 coins)</a> <<else>><span class="rc-action-unavailable">No slaves available to sell</span><</if>> </nav> </div> </section> <nav class="rc-settlement-actions choice-container"><a class="button back-btn" data-passage="Settlement">Return to Settlement</a></nav> </main> <style> :root { --bg-dark: #191a17; --bg-medium: #191a17; --bg-light: #292a25; --text-light: #f1ecde; --text-medium: #c4bcaa; --text-dark: #9a3b30; --accent-primary: #292a25; --accent-secondary: #9a3b30; --accent-highlight: #9a3b30; --accent-gold: #f0c420; --accent-blue: #292a25; --accent-green: #00ff66; --accent-white: #ffffff; --font-main: 'Courier New', monospace; --font-mono: 'Courier New', monospace; --space-small: 0.5rem; --space-medium: 1rem; --space-large: 2rem; --shadow-subtle: 0 3px 6px rgba(0, 0, 0, 0.5); --shadow-medium: 0 4px 8px rgba(0, 0, 0, 0.7); --glow-red: 0 0 6px rgba(154, 59, 48, 0.6), 0 0 12px rgba(154, 59, 48, 0.3); --glow-gold: 0 0 6px rgba(240, 196, 32, 0.6), 0 0 12px rgba(240, 196, 32, 0.3); --glow-green: 0 0 6px rgba(0, 255, 102, 0.7), 0 0 12px rgba(0, 255, 102, 0.4); --glow-white: 0 0 6px rgba(255, 255, 255, 0.8), 0 0 12px rgba(255, 255, 255, 0.4); --transition-fast: 0.3s ease; --transition-slow: 0.5s ease; --glow-neon-blue: 0 0 8px rgba(154, 59, 48, 0.7), 0 0 16px rgba(154, 59, 48, 0.4); --glow-neon-pink: 0 0 8px rgba(154, 59, 48, 0.7), 0 0 16px rgba(154, 59, 48, 0.4); --glow-neon-green: 0 0 8px rgba(0, 255, 102, 0.7), 0 0 16px rgba(0, 255, 102, 0.4); --glow-neon-white: 0 0 8px rgba(255, 255, 255, 0.7), 0 0 16px rgba(255, 255, 255, 0.4); --container-width: 1200px; } body { background: var(--bg-dark); color: var(--text-light); font-family: var(--font-main); line-height: 1.6; text-shadow: 0 0 5px rgba(255, 255, 255, 0.3); } /* Стилі для ринку рабів */ .market-actions { background: var(--bg-medium); border: 2px solid var(--accent-primary); border-radius: 6px; padding: var(--space-medium); margin: var(--space-large) 0; box-shadow: var(--shadow-subtle), var(--glow-red); } .market-actions h3 { color: var(--accent-gold); font-family: var(--font-mono); margin-bottom: var(--space-medium); text-shadow: var(--glow-gold); animation: pulse 3s infinite; } .market-btn { display: inline-flex; align-items: center; justify-content: center; padding: 12px 24px; border-radius: 6px; font-family: var(--font-mono); font-size: 1.1rem; text-decoration: none; transition: background-color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast); min-width: 180px; text-align: center; } .market-btn.buy { background: var(--accent-highlight); color: #000; border: 2px solid var(--accent-highlight); box-shadow: var(--glow-green); font-weight: bold; text-shadow: 0 0 2px rgba(255,255,255,0.7); } .market-btn.buy:hover { background: var(--bg-light); color: var(--accent-highlight); transform: scale(1.05); box-shadow: var(--shadow-medium), 0 0 15px rgba(34, 255, 136, 0.7); } .market-btn.sell { background: var(--accent-secondary); color: #fff; border: 2px solid var(--accent-secondary); box-shadow: var(--glow-red); font-weight: bold; text-shadow: 0 0 2px rgba(0,0,0,0.7); } .market-btn.sell:hover { background: var(--bg-light); color: var(--accent-secondary); transform: scale(1.05); box-shadow: var(--shadow-medium), 0 0 15px rgba(154, 59, 48, 0.7); } .market-btn.disabled { pointer-events: none; opacity: 0.8; background: var(--bg-light); color: var(--text-dark); border: 2px solid var(--text-dark); box-shadow: none; font-weight: bold; text-shadow: 0 0 2px rgba(255,255,255,0.3); cursor: not-allowed; } /* Попередні стилі для сцени, інвентарю тощо */ .scene-content { margin-top: var(--space-large); padding: var(--space-large); background: var(--bg-medium); border: 2px solid var(--accent-primary); border-radius: 6px; box-shadow: var(--shadow-medium), var(--glow-red); } .scene-text h2 { font-family: var(--font-mono); color: var(--accent-white); text-transform: none; letter-spacing: normal; margin-bottom: var(--space-small); font-size: 1.8rem; text-shadow: var(--glow-neon-white); animation: glow 3s infinite; } .inventory-panel { background: var(--bg-medium); border: 2px solid var(--accent-secondary); border-radius: 6px; padding: var(--space-medium); margin: var(--space-large) 0; box-shadow: var(--shadow-medium), var(--glow-neon-blue); } .inventory-panel h3 { color: var(--accent-gold); font-family: var(--font-mono); margin-bottom: var(--space-medium); text-shadow: var(--glow-gold); animation: pulse 3s infinite; } .inventory-list { display: flex; flex-wrap: wrap; gap: var(--space-medium); justify-content: center; } .inventory-image { display: flex; align-items: center; gap: var(--space-small); } .inventory-image img { width: 60px; height: 60px; filter: drop-shadow(0 0 8px var(--accent-highlight)); transition: filter var(--transition-fast); } .inventory-image:hover img { filter: drop-shadow(0 0 12px var(--accent-highlight)); } .choice-container { display: flex; flex-wrap: wrap; gap: var(--space-small); justify-content: center; margin-top: var(--space-large); } .choice-container .button { padding: 10px 20px; background: var(--bg-light); color: var(--text-light); text-decoration: none; border: 2px solid var(--accent-primary); border-radius: 5px; transition: all 0.3s; box-shadow: var(--shadow-subtle), var(--glow-red); min-width: 150px; text-align: center; } .choice-container .button:hover { background: var(--accent-primary); transform: scale(1.05); box-shadow: var(--shadow-medium), 0 0 15px rgba(154, 59, 48, 0.7); text-shadow: 0 0 5px #ffffff; } .hunt-message { background: var(--bg-medium); border-left: 4px solid var(--accent-primary); padding: 10px; margin: 10px 0; border-radius: 5px; box-shadow: var(--shadow-subtle), var(--glow-red); } .hunt-message span { display: block; margin: 5px 0; } .hunt-message .damage { color: var(--accent-secondary); font-weight: bold; text-shadow: 0 0 8px rgba(154, 59, 48, 0.6); animation: pulse 2s infinite; } .hunt-message .reward { color: var(--accent-highlight); font-weight: bold; text-shadow: 0 0 8px rgba(34, 255, 136, 0.6); animation: glow 3s infinite; } .tired-message { color: #ffffff; text-align: center; font-size: 1.5em; margin: 20px 0; text-shadow: var(--glow-white); animation: flicker 4s infinite; } .game-over { color: var(--accent-secondary); text-align: center; font-size: 1.2em; margin: 20px 0; text-shadow: 0 0 10px rgba(154, 59, 48, 0.8); animation: fadeInOut 2s infinite; } /* Анімація появи */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.7; } 100% { opacity: 1; } } @keyframes glow { 0% { text-shadow: 0 0 5px rgba(34, 255, 136, 0.6); } 50% { text-shadow: 0 0 15px rgba(34, 255, 136, 0.8), 0 0 30px rgba(34, 255, 136, 0.4); } 100% { text-shadow: 0 0 5px rgba(34, 255, 136, 0.6); } } @keyframes flicker { 0% { opacity: 1; } 3% { opacity: 0.8; } 6% { opacity: 1; } 9% { opacity: 0.9; } 12% { opacity: 1; } 70% { opacity: 1; } 73% { opacity: 0.7; } 76% { opacity: 1; } 100% { opacity: 1; } } @keyframes fadeInOut { 0% { opacity: 0.7; } 50% { opacity: 1; } 100% { opacity: 0.7; } } .scene-content, .market-actions { animation: fadeIn var(--transition-slow); } /* Оновлені стилі для кнопок купівлі/продажу */ .buy-btn, .sell-btn { /* Структура та розміри */ display: inline-flex; align-items: center; justify-content: center; min-width: 80px; height: 36px; padding: 6px 12px; margin: 0 4px; position: relative; overflow: visible; /* Текст */ color: var(--accent-highlight); font-family: var(--font-mono); font-size: 0.9rem; font-weight: 500; letter-spacing: 0.5px; text-shadow: 0 0 2px rgba(154, 59, 48, 0.8); text-align: center; text-transform: uppercase; /* Анімація та переходи */ transition: all 0.25s ease-out; cursor: pointer; /* Додатковий декор */ clip-path: polygon( 0% 10%, 5px 0%, calc(100% - 5px) 0%, 100% 10%, 100% calc(100% - 5px), calc(100% - 5px) 100%, 5px 100%, 0% calc(100% - 5px) ); } .buy-btn { background: linear-gradient(135deg, var(--accent-blue), var(--bg-medium)); border: 1px solid var(--accent-primary); box-shadow: var(--glow-neon-blue); } .buy-btn:hover { background: linear-gradient(135deg, #9a3b30, var(--bg-medium)); box-shadow: var(--glow-neon-pink); border-color: var(--accent-highlight); color: var(--accent-white); text-shadow: 0 0 2px rgba(255, 255, 255, 0.9); transform: scale(1.05); } .sell-btn { background: linear-gradient(135deg, var(--accent-primary), var(--bg-medium)); border: 1px solid var(--accent-secondary); box-shadow: var(--glow-neon-pink); } .sell-btn:hover { background: linear-gradient(135deg, #9a3b30, var(--bg-medium)); box-shadow: var(--glow-neon-pink); border-color: var(--accent-highlight); color: var(--accent-white); text-shadow: 0 0 2px rgba(255, 255, 255, 0.9); transform: scale(1.05); } /* Стилі для неактивних кнопок */ .buy-btn:disabled, .sell-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; animation: none; color: var(--text-dark); text-shadow: none; } /* Стилі для тексту "Not enough money" та "No items" */ .disabled { color: var(--text-dark); font-style: italic; padding: 6px 12px; opacity: 0.7; text-shadow: none; } /* Анімації для ефектів */ @keyframes pulseNeon { 0% { box-shadow: 0 0 10px rgba(154, 59, 48, 0.6), 0 0 20px rgba(154, 59, 48, 0.3), inset 0 0 8px rgba(154, 59, 48, 0.2); } 50% { box-shadow: 0 0 12px rgba(0, 255, 102, 0.7), 0 0 24px rgba(0, 255, 102, 0.4), inset 0 0 10px rgba(0, 255, 102, 0.3); } 100% { box-shadow: 0 0 12px rgba(154, 59, 48, 0.7), 0 0 24px rgba(154, 59, 48, 0.4), inset 0 0 10px rgba(154, 59, 48, 0.3); } } @keyframes scanline { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } </style>
<<if $player.stamina < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><img src="assets/cast/slave.png" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Slave</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Slave">← Back</a> </div> </div> <<else>> <div class="scene-content rc-service-page" data-rc-service="slaves"> <header class="rc-service-header"><img src="assets/cast/slave.png" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Slave</h1></div></header> <div class="scene-text"> <p> Slave obediently waits for your orders, ready to fulfill any of your desires. </p> </div> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/slaves/blowjob (1).webm" type="video/webm"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="anal" role="button" tabindex="0">Anal</a> <a class="service-btn" data-rc-video="cum" role="button" tabindex="0">Finish</a> </div> <a class="button back-btn" data-passage="Safehouse">← Finish</a> </div> </div> <</if>>
<<if $player.game_status == 1>> <div class="status-container"> <h3 class="text-center">$player.name</h3> <div class="status-row"> <span class="status-item"> <img src="assets/icons/money.svg" alt="Money" class="status-icon"> <span><<print $player.Caps>></span> </span> <span class="status-item"> <img src="assets/icons/population.svg" alt="Population" class="status-icon"> <span><<print $player.survivor_population>></span> </span> </div> <div class="bars-container"> <div class="status-row"> <span class="stat-label">❤️</span> <div class="bar-wrapper"> <progress id="playerHealthBar" @value="$player.health" @max="$player.max_health"></progress> </div> </div> <div class="status-row"> <span class="stat-label">⚡</span> <div class="bar-wrapper"> <progress id="playerStaminaBar" @value="$player.stamina" @max="$player.max_stamina"></progress> </div> </div> </div> </div> <</if>>
<<set $player = { name: "Alex", health: 100, max_health: 100, stamina: 100, max_stamina: 100, current_month: "March", current_year: 2037, days_survived: 180, inventory: [], Provisions: 2, Raw_meat: 0, Medkit: 1, Caps: 100, Pistol: 0, Shotgun: 0, Wrench: 1, Knife: 0, slaves: 0, Weapon_status: "none", Weapon_damage: 2, Weapon_icon: "none", game_status: 0, survivor_population: 1, sophia_status: "unknown", sophia_tied_unlocked: false, sophia_tied_intro_pending: false, emily_status: "unknown", lena_status: "unknown", lesana_status: "unknown", sophia_work: "none", emily_work: "none", lena_work: "none", wolf_mutant_damage: 25, rat_mutant_damage: 10, met_cory: false, quests: [], meat_quest_active: false, slave_quest_active: false, cory_dialogue_state: "initial", current_location: "" }>> <<set $slave_quest_completed = 0>> <<set $bunker_quest_progress = "none">> <<set $kenzie = { met: false, offered: false, outcome: "none", saved_visits: 0, camp_visits: 0, romance: false, attitude: "friendly" }>> <<set $mistral = { Mistral_Basement: 3, Mistral_Living_room: 1, Mistral_Door_Kitchen: 2, Mistral_Door_Kitchen_loot: 1, Mistral_Stairs_Second_Floor: 6 }>> <<set $discovered_bunker = false>> <<set $discovered_mistral_mansion = false>> <<set $mistral_route_opened = false>> <<set $discovered_farm = false>> <<set $discovered_city_center = false>> <<set $discovered_settlement = false>> <<set $discovered_forest = false>> <<set $discovered_lena = false>> <<set $lastPassage = "Safehouse">> <<set $opening = { entered: false, room: false, water: false, food: false, complete: false }>>
<<if $player.game_status == 1>> [[Inventory]] <</if>>
<a class="button back-btn" data-passage="Bar">Return to the bar</a>
<<if $bunker_quest_progress == "none" or !$mistral_route_opened>><<goto "Outside">><</if>> <<if !$kenzie>><<set $kenzie = { met: true, offered: true, outcome: "none", saved_visits: 0, camp_visits: 0, romance: false, attitude: "friendly" }>><</if>> <<if $kenzie.outcome == "decision_pending">><<goto "Kenzie_Final_Grab">><<elseif $kenzie.outcome == "injured_pending">><<goto "Kenzie_Try_Help">><</if>> <<set $player.current_location = "Mistral_Mansion">> <div class="scene-content"><div class="scene-text"><h2>Mistral Mansion</h2> <p>The mansion rises beyond the old bunker ridge. Collapsed ground and bodies mark the approach.</p> <<if $bunker_quest_progress == "Phase 1">> <<if !$kenzie.gate_talk>><p>Kenzie joins you at the gate, shotgun loaded. “I checked the path twice. The holes have not moved. The things inside probably have.”</p> <<else>><p>Kenzie waits by the open gate, watching the windows while you cross the broken ground.</p><</if>> <<else>><p>The gate hangs open. The route you cleared is still passable.</p><</if>> </div><div class="choice-container"> <<if $bunker_quest_progress == "Phase 1" && !$kenzie.gate_talk>> <a class="button" data-passage="Kenzie_Gate_Joke">Joke with Kenzie</a><a class="button" data-passage="Kenzie_Gate_Focus">Stay focused</a> <<else>><a class="button" data-passage="Mistral_Entered">Enter the mansion</a><</if>> <a class="button back-btn" data-passage="Outside">Return Outside</a></div></div>
<<if !$kenzie>><<set $kenzie = { met: false, offered: false, outcome: "none", saved_visits: 0, camp_visits: 0, romance: false, attitude: "friendly" }>><</if>> <<if $bunker_quest_progress == "Phase 1" && !$kenzie.met>><<set $kenzie.met = true>><<set $kenzie.offered = true>><</if>> <<if $bunker_quest_progress == "END" || $bunker_quest_progress == "Complete">><<if $kenzie.outcome == "none">><<set $kenzie.outcome = "saved">><</if>><</if>> <<if $kenzie.outcome == "saved">><<goto "Kenzie_Settlement_Talk">> <<elseif $kenzie.outcome == "camp_help" || $kenzie.outcome == "camp_slave" || $kenzie.outcome == "dead">><<goto "Residential_District">> <<elseif $bunker_quest_progress == "Phase 1">><<goto "Kenzie_Quest_Talk">> <<elseif $kenzie.offered>><<goto "Kenzie_Investigation">> <<else>><<goto "Kenzie_First_Meeting">><</if>>
<<set $kenzie.met = true>><<set $kenzie.offered = true>><<set $kenzie.offer_visits = (Number($kenzie.offer_visits) || 0) + 1>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / INVESTIGATION</span><h1>An unmarked place</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><<if $kenzie.offer_visits > 1>><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Changed your mind about helping me? Good. I was running out of ways to ask without sounding desperate.”</p></div><<else>><p class="rc-encounter-event">Kenzie unfolds the worn map and pins one corner with an empty shell.</p><</if>><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“There’s something built near the old bunker. Roofline, maybe an estate. I can see it from the ridge, but the ground between is full of holes and worse things.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Do you know what it is?”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“No. Not what happened there, either. I found a faded name on a survey marker: Mistral. Could be a mansion, could be the world’s least welcoming hotel.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I can get us as far as the outer gate. Past that, I need someone watching my back. I’ll watch yours.”</p></div><p class="rc-encounter-event">She taps a possible route along the ridge, then looks up for your answer.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button light-choice" data-passage="Kenzie_Quest_Accept">Offer to help</a><a class="button neutral-choice" data-passage="Residential_District">Leave it alone</a></div></nav></main>
<<if $bunker_quest_progress == "none">><<goto "Outside">><</if>> <<if $kenzie && $kenzie.outcome == "decision_pending">><<goto "Kenzie_Final_Grab">><<elseif $kenzie && $kenzie.outcome == "injured_pending">><<goto "Kenzie_Try_Help">><</if>> <<set $player.current_location = "Mistral_Entered">> <div class="scene-content"><div class="scene-text"><h2>Mistral Mansion</h2> <p>Dust coats the cracked floor. Most doorways have collapsed; two routes remain open.</p> <<if $bunker_quest_progress == "Phase 1">> <<if $mistral.Mistral_Basement <= 0 && $mistral.Mistral_Door_Kitchen <= 0>> <<if !$kenzie.living_room_open_comment>><<set $kenzie.living_room_open_comment = true>><p>Kenzie pulls the bent support away from the Living Room door. She stops when something heavy shifts on the other side. “That wasn't the door.”</p><</if>> <<elseif $mistral.Mistral_Basement <= 0>> <<if !$kenzie.basement_clear_comment>><<set $kenzie.basement_clear_comment = true>><p>Kenzie glances back toward the basement stairs. “Nothing left down there. Kitchen's still making noise.”</p><</if>> <<elseif $mistral.Mistral_Door_Kitchen <= 0>> <<if !$kenzie.kitchen_clear_comment>><<set $kenzie.kitchen_clear_comment = true>><p>Kenzie points her shotgun toward the basement door. “Kitchen's clear. I heard something under the floor while we were in there.”</p><</if>> <<elseif !$kenzie.hall_intro>><<set $kenzie.hall_intro = true>><p>Kenzie sweeps the hall with her shotgun. <<if $kenzie.attitude == "dry">>“Two ways in. I'll cover whichever you take.”<<else>>“Kitchen's closer. Basement's darker. Your call.”<</if>></p><</if>> <<if $mistral.Mistral_Basement > 0 || $mistral.Mistral_Door_Kitchen > 0>><p>The Living Room door is pinned by a bent support. The adjoining rooms need to be cleared before you can shift it safely.</p> <<else>><p>The support is gone. The Living Room is open.</p><</if>> <</if>> </div><div class="choice-container"><a class="button" data-passage="Mistral_Basement">Basement</a><a class="button" data-passage="Mistral_Door_Kitchen">Kitchen</a> <<if $mistral.Mistral_Basement <= 0 && $mistral.Mistral_Door_Kitchen <= 0>><a class="button danger-choice" data-passage="Mistral_Living_room">Living Room</a><</if>> <a class="button back-btn" data-passage="Mistral_Mansion">Return to the gate</a></div></div>
<<if $mistral.Mistral_Basement > 0 || $mistral.Mistral_Door_Kitchen > 0>><<goto "Mistral_Entered">><</if>><<if $kenzie && $kenzie.outcome == "decision_pending">><<goto "Kenzie_Final_Grab">><<elseif $kenzie && $kenzie.outcome == "injured_pending">><<goto "Kenzie_Try_Help">><</if>><<set $player.current_location = "Mistral_Living_room">><<if $mistral.Mistral_Living_room > 0>><<goto "Scarbourg_Encounter">><</if>><div class="scene-content"><div class="scene-text"><h2>Mistral Mansion / Living Room</h2><p>The creature is gone. On the wall, behind a fallen frame, someone scratched <span class="rc-inscription">A2B4C977</span>. It may be a code for the old bunker, though the lock still has no power.</p></div><div class="choice-container"><a class="button back-btn" data-passage="Mistral_Entered">Return to the hall</a></div></div>
<div class="scene-content"> <div class="scene-text"> <h2>Mistral Mansion: Second Floor</h2> <div class="status-message rc-area-unavailable">This area is not available in the current build.</div> </div> <div class="choice-container"> <a class="button back-btn" data-passage="Mistral_Entered">← Return</a> </div> </div>
<<set $player.current_location = "Mistral_Door_Kitchen">> <<if $mistral.Mistral_Door_Kitchen > 0>><<goto "Zombie_Encounter">><</if>> <div class="scene-content"><div class="scene-text"><h2>Mistral Mansion / Kitchen</h2> <p>Broken marble counters and overturned pans fill the quiet kitchen.</p> <<if $mistral.Mistral_Door_Kitchen_loot == 0>> <div class="rc-kitchen-loot-result" role="status"><span>Cabinets searched</span><strong>10 Provisions recovered</strong></div> <<if $bunker_quest_progress == "Phase 1" && !$kenzie.kitchen_loot_comment>><<set $kenzie.kitchen_loot_comment = true>><p>Kenzie finds two intact tins behind a fallen shelf. “Okay. Coming here wasn't completely stupid.” She puts them in your bag.</p><</if>> <</if>> </div><div class="choice-container"> <<if $mistral.Mistral_Door_Kitchen_loot > 0>><<link "Search the kitchen cabinets" "Mistral_Door_Kitchen">><<set $player.Provisions += 10>><<set $mistral.Mistral_Door_Kitchen_loot = 0>><</link>><</if>> <a class="button back-btn" data-passage="Mistral_Entered">Return to the hall</a></div></div>
<<set $player.current_location = "Mistral_Basement">> <<if $mistral.Mistral_Basement > 0>><<goto "Zombie_Encounter">><</if>> <div class="scene-content"><div class="scene-text"><h2>Mistral Mansion / Basement</h2> <p>Spent shells lie near the stairs. Drag marks end at a broken drain; nothing else moves below.</p> </div><div class="choice-container"><a class="button back-btn" data-passage="Mistral_Entered">Return to the hall</a></div></div>
<div class="scene-content"><div class="scene-text"><h2>Something in the dark</h2> <div class="character-encounter"><div class="encounter-image"><img src="assets/monsters/mutant/Zombie.png" alt="Zombie" class="character-image"></div><div class="encounter-text"> <<if $player.current_location == "Mistral_Basement">> <<if $mistral.Mistral_Basement >= 3>><p>A figure pulls itself out from beneath the stairs.</p> <<elseif $mistral.Mistral_Basement == 2>><p>Another figure pushes through the hanging pipes at the far wall.</p> <<else>><p>The last shape in the basement rises beside the boiler.</p><</if>> <<if $bunker_quest_progress == "Phase 1" && !$kenzie.basement_contact_seen>><<set $kenzie.basement_contact_seen = true>><p>Kenzie touches your arm and points her shotgun beneath the stairs. “There.”</p><</if>> <<elseif $player.current_location == "Mistral_Door_Kitchen">> <<if $mistral.Mistral_Door_Kitchen >= 2>><p>A figure stumbles up behind the broken counters.</p> <<else>><p>A second figure knocks a pan aside as it comes through the pantry.</p><</if>> <<if $bunker_quest_progress == "Phase 1" && !$kenzie.kitchen_contact_seen>><<set $kenzie.kitchen_contact_seen = true>><p>Kenzie catches its reflection in a hanging pan. “Behind the counter.” She raises her shotgun beside you.</p><</if>> <<else>><p>A twisted figure rushes from behind the debris.</p><</if>> </div></div></div><div class="choice-container"><a class="button danger-choice" data-passage="Combat_Zombie">Fight</a> <<if $player.current_location == "Mistral_Basement" || $player.current_location == "Mistral_Door_Kitchen">><a class="button" data-passage="Mistral_Entered">Retreat to the hall</a> <<else>><a class="button" data-passage="Outside">Try to escape</a><</if>></div></div>
<<set $combat = { enemy_name: "Zombie", enemy_health: 120, enemy_max_health: 120, enemy_damage: 5, player_damage: $player.Weapon_damage + (($bunker_quest_progress == "Phase 1" && ($player.current_location == "Mistral_Basement" || $player.current_location == "Mistral_Door_Kitchen" || $player.current_location == "Mistral_Living_room")) ? 30 : 0), kenzie_bonus: ($bunker_quest_progress == "Phase 1" && ($player.current_location == "Mistral_Basement" || $player.current_location == "Mistral_Door_Kitchen" || $player.current_location == "Mistral_Living_room")) ? 30 : 0, turn: "player", is_defending: false, last_action: "start", last_player_damage: 0, last_enemy_damage: 0, last_enemy_defended: false, last_heal: 0 }>> <main class="rc-battle-page"><header class="rc-battle-header"><div><span class="rc-ui-kicker">HOSTILE CONTACT / COMBAT</span><h1>Battle with <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></h1></div> <span class="rc-battle-threat">INCOMING HIT · <<print $combat.enemy_damage>> HP</span></header> <div class="rc-battle-grid"><figure class="rc-battle-portrait"><<if $combat.enemy_name == 'Lena'>><img src="assets/cast/lena.jpg" alt="Lena"> <<elseif $combat.enemy_name == 'Raider'>><img src="assets/cast/raider.png" alt="Raider"> <<elseif $combat.enemy_name == 'Scarbourg'>><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"> <<else>><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><</if>><figcaption><span>OPPONENT</span><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong></figcaption></figure> <section class="rc-battle-panel" aria-label="Combat status and actions"><div class="rc-battle-vitals"> <div class="rc-battle-vital player"><div class="rc-battle-vital-head"><strong>You</strong><span><<print $player.health>> / <<print $player.max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Your health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> <div class="rc-battle-vital enemy"><div class="rc-battle-vital-head"><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong><span><<print $combat.enemy_health>> / <<print $combat.enemy_max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Opponent health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> </div><div class="rc-battle-tactic"><strong>When to defend</strong><p>Defend halves the next incoming hit: <<print Math.floor($combat.enemy_damage / 2)>> HP instead of <<print $combat.enemy_damage>> HP. Use it when you need to survive a hit before your next turn.</p></div> <div class="rc-battle-log" aria-live="polite"><span class="rc-ui-kicker">TURN REPORT</span><<if $combat.kenzie_bonus>><p><strong>Kenzie fights beside you.</strong> Her shotgun adds 30 damage to every attack.</p><</if>><p>Combat begins. <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> is in front of you.</p></div><<if $player.health <= 0>><nav class="rc-battle-actions"><a class="combat-btn attack" data-passage="Combat_Defeat">Continue</a></nav> <<else>><<set $combat.turn = "player">><nav class="rc-battle-actions" aria-label="Combat actions"> <a class="combat-btn attack" data-passage="Combat_Attack"><strong>Attack</strong><small>Deal <<print $combat.player_damage>> damage</small></a> <a class="combat-btn defend" data-passage="Combat_Defend"><strong>Defend</strong><small>Take <<print Math.floor($combat.enemy_damage / 2)>> instead of <<print $combat.enemy_damage>> damage</small></a> <<if $player.Medkit > 0>><a class="combat-btn heal" data-passage="Combat_Heal"><strong>Use Medkit</strong><small>Recover up to 50 HP · <<print $player.Medkit>> left</small></a> <<else>><span class="combat-btn heal disabled"><strong>Medkit</strong><small>None available</small></span><</if>> </nav><</if>></section></div></main>
<<if $player.current_location == "Mistral_Basement">><<set $mistral.Mistral_Basement = Math.max(0, $mistral.Mistral_Basement - 1)>> <<elseif $player.current_location == "Mistral_Door_Kitchen">><<set $mistral.Mistral_Door_Kitchen = Math.max(0, $mistral.Mistral_Door_Kitchen - 1)>><</if>> <<if $bunker_quest_progress == "Phase 1" && ($player.current_location == "Mistral_Basement" || $player.current_location == "Mistral_Door_Kitchen")>> <main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / AFTERMATH</span><h1>The room falls quiet</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Shotgun support</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside> <section class="rc-encounter-log"><h2>After the fight</h2><<if $player.current_location == "Mistral_Basement">> <<if $mistral.Mistral_Basement == 2>><p class="rc-encounter-event">The creature falls near the stairs. Kenzie works the shotgun action and watches the pipes.</p> <<elseif $mistral.Mistral_Basement == 1>><p class="rc-encounter-event">The next creature drops beside the boiler. Kenzie keeps her barrel trained on the far wall.</p> <<else>><p class="rc-encounter-event">The last body hits the basement floor. Kenzie waits until the scraping stops before she lowers her gun.</p><</if>> <<else>> <<if $mistral.Mistral_Door_Kitchen == 1>><p class="rc-encounter-event">The figure crashes against the counter. Kenzie covers the pantry while you catch your breath.</p> <<else>><p class="rc-encounter-event">The pantry door bangs against the wall as the last creature falls. Kenzie checks the dark shelves.</p><</if>> <</if>> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p> <<if $player.current_location == "Mistral_Basement">> <<if $mistral.Mistral_Basement == 2>> <<if $kenzie.attitude == "dry">>“You're still standing. I've got the stairs.”<<else>>“You okay? Good. Stay close; I heard another one.”<</if>> <<elseif $mistral.Mistral_Basement == 1>>“One more behind the boiler. I saw it move.” <<else>>“Basement's clear.” She waits a moment. “Something heavier is moving upstairs.”<</if>> <<else>> <<if $mistral.Mistral_Door_Kitchen == 1>>“Another one in the pantry.” She steps between you and the doorway. “I'll draw it out.” <<else>>“Kitchen's clear.” Kenzie listens, then lowers the barrel. “Let's see if anything survived in those cupboards.”<</if>> <</if>> </p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"> <<if $player.current_location == "Mistral_Basement">><a class="button" data-passage="Mistral_Basement">Continue through the basement</a> <<else>><a class="button" data-passage="Mistral_Door_Kitchen">Continue through the kitchen</a><</if>> </div></nav></main> <<else>> <main class="rc-combat-outcome rc-execution-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">MISTRAL / AFTERMATH</span><h1>The room falls quiet</h1></header><div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><img src="assets/monsters/mutant/Zombie.png" alt="Defeated creature"></figure><section class="rc-outcome-report"><p>The creature stops moving.</p></section></div><nav class="rc-outcome-actions"><<if $player.current_location == "Mistral_Basement">><a class="button" data-passage="Mistral_Basement">Continue through the basement</a><<elseif $player.current_location == "Mistral_Door_Kitchen">><a class="button" data-passage="Mistral_Door_Kitchen">Continue through the kitchen</a><<else>><a class="button" data-passage="Outside">Return Outside</a><</if>></nav></main> <</if>>
<<set $combat = { enemy_name: "Scarbourg", enemy_health: 350, enemy_max_health: 350, enemy_damage: 25, player_damage: $player.Weapon_damage + (($bunker_quest_progress == "Phase 1" && ($player.current_location == "Mistral_Basement" || $player.current_location == "Mistral_Door_Kitchen" || $player.current_location == "Mistral_Living_room")) ? 30 : 0), kenzie_bonus: ($bunker_quest_progress == "Phase 1" && ($player.current_location == "Mistral_Basement" || $player.current_location == "Mistral_Door_Kitchen" || $player.current_location == "Mistral_Living_room")) ? 30 : 0, turn: "player", is_defending: false, last_action: "start", last_player_damage: 0, last_enemy_damage: 0, last_enemy_defended: false, last_heal: 0 }>> <main class="rc-battle-page"><header class="rc-battle-header"><div><span class="rc-ui-kicker">HOSTILE CONTACT / COMBAT</span><h1>Battle with <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></h1></div> <span class="rc-battle-threat">INCOMING HIT · <<print $combat.enemy_damage>> HP</span></header> <div class="rc-battle-grid"><figure class="rc-battle-portrait"><<if $combat.enemy_name == 'Lena'>><img src="assets/cast/lena.jpg" alt="Lena"> <<elseif $combat.enemy_name == 'Raider'>><img src="assets/cast/raider.png" alt="Raider"> <<elseif $combat.enemy_name == 'Scarbourg'>><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg"> <<else>><img src="assets/monsters/mutant/Zombie.png" alt="Zombie"><</if>><figcaption><span>OPPONENT</span><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong></figcaption></figure> <section class="rc-battle-panel" aria-label="Combat status and actions"><div class="rc-battle-vitals"> <div class="rc-battle-vital player"><div class="rc-battle-vital-head"><strong>You</strong><span><<print $player.health>> / <<print $player.max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Your health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> <div class="rc-battle-vital enemy"><div class="rc-battle-vital-head"><strong><<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>></strong><span><<print $combat.enemy_health>> / <<print $combat.enemy_max_health>> HP</span></div> <div class="health-bar-wrapper" role="progressbar" aria-label="Opponent health" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"><div class="health-bar-fill" style="width: 0%"></div></div></div> </div><div class="rc-battle-tactic"><strong>When to defend</strong><p>Defend halves the next incoming hit: <<print Math.floor($combat.enemy_damage / 2)>> HP instead of <<print $combat.enemy_damage>> HP. Use it when you need to survive a hit before your next turn.</p></div> <div class="rc-battle-log" aria-live="polite"><span class="rc-ui-kicker">TURN REPORT</span><<if $combat.kenzie_bonus>><p><strong>Kenzie fights beside you.</strong> Her shotgun adds 30 damage to every attack.</p><</if>><p>Combat begins. <<print $combat.enemy_name === "Lena" ? "Lena" : $combat.enemy_name>> is in front of you.</p></div><<if $player.health <= 0>><nav class="rc-battle-actions"><a class="combat-btn attack" data-passage="Combat_Defeat">Continue</a></nav> <<else>><<set $combat.turn = "player">><nav class="rc-battle-actions" aria-label="Combat actions"> <a class="combat-btn attack" data-passage="Combat_Attack"><strong>Attack</strong><small>Deal <<print $combat.player_damage>> damage</small></a> <a class="combat-btn defend" data-passage="Combat_Defend"><strong>Defend</strong><small>Take <<print Math.floor($combat.enemy_damage / 2)>> instead of <<print $combat.enemy_damage>> damage</small></a> <<if $player.Medkit > 0>><a class="combat-btn heal" data-passage="Combat_Heal"><strong>Use Medkit</strong><small>Recover up to 50 HP · <<print $player.Medkit>> left</small></a> <<else>><span class="combat-btn heal disabled"><strong>Medkit</strong><small>None available</small></span><</if>> </nav><</if>></section></div></main>
<div class="scene-content"><div class="scene-text"><h2>The Living Room</h2><div class="character-encounter"><div class="encounter-image"><img src="assets/monsters/mutant/Scarbourg.png" alt="Scarbourg" class="character-image"></div><div class="encounter-text"><p>A huge creature uncurls from behind the ruined furniture, blocking the only clear way out.</p> <<if $bunker_quest_progress == "Phase 1">><p>Kenzie steps in beside you, shotgun trained on its head. Her voice is quieter now. “That's what we heard through the wall. I'm ready.”</p><</if>> </div></div></div><div class="choice-container"><a class="button danger-choice" data-passage="Combat_Scarbourg">Fight together</a><a class="button" data-passage="Mistral_Entered">Retreat to the hall</a></div></div>
<<if $player.current_location == "Mistral_Living_room" && $bunker_quest_progress == "Phase 1">><<goto "Kenzie_Final_Grab">><<else>><<set $mistral.Mistral_Living_room = 0>><div class="scene-content"><div class="scene-text"><h2>The creature is dead</h2></div><div class="choice-container"><a class="button" data-passage="Mistral_Living_room">Search the Living Room</a></div></div><</if>>
<<if !$kenzie || $kenzie.outcome != "saved" || !$kenzie.romance>><<goto "Residential_District">><</if>> <<if $player.stamina < 10>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><img src="assets/cast/kenzie.jpg" alt=""><div><span>SETTLEMENT / PRIVATE INTERACTION</span><h1>Kenzie</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Kenzie_Talk">← Back</a> </div> </div> <<else>> <div class="scene-content rc-service-page" data-rc-service="kenzie"> <header class="rc-service-header"><img src="assets/cast/kenzie.jpg" alt=""><div><span>SETTLEMENT / PRIVATE INTERACTION</span><h1>Kenzie</h1></div></header> <div class="scene-text"> <p> Kenzie closes the door after you enter. She takes your hand and draws you closer. </p> </div> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/kenzie/blowjob.mp4" type="video/mp4"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="anal" role="button" tabindex="0">Anal</a> <a class="service-btn" data-rc-video="cum" role="button" tabindex="0">Finish</a> </div> <a class="button back-btn" data-passage="Residential_District">← Finish</a> </div> </div> <</if>>
<<if $kenzie && $kenzie.outcome == "saved">><<goto "Kenzie_Settlement_Talk">><<elseif $kenzie && ($kenzie.outcome == "camp_help" || $kenzie.outcome == "camp_slave")>><<goto "Kenzie_Camp_Talk">><<else>><<goto "Residential_District">><</if>>
<main class="rc-credits-page"> <header class="rc-credits-header"> <div> <p class="rc-credits-kicker">Risen City / Cast file</p> <h1>Credits</h1> <p class="rc-credits-intro">The faces behind the characters you meet in Risen City.</p> </div> <div class="rc-credits-count" aria-label="Six cast members"><strong>06</strong>Cast members</div> </header> <section class="rc-credits-list" aria-label="Cast credits"> <article class="rc-credit-card"> <figure class="rc-credit-photo"><img src="assets/cast/sophia.jpg" alt="Portrait of Sweetie Fox" loading="lazy"></figure> <div class="rc-credit-info"> <span class="rc-credit-index">Cast / 01</span> <span class="rc-credit-label">Character</span> <h2 class="rc-credit-character">Sophia</h2> <span class="rc-credit-rule" aria-hidden="true"></span> <span class="rc-credit-label">Actress</span> <strong class="rc-credit-actress">Sweetie Fox</strong> </div> </article> <article class="rc-credit-card"> <figure class="rc-credit-photo"><img src="assets/cast/emily.jpg" alt="Portrait of Baby Kitten" loading="lazy"></figure> <div class="rc-credit-info"> <span class="rc-credit-index">Cast / 02</span> <span class="rc-credit-label">Character</span> <h2 class="rc-credit-character">Emily</h2> <span class="rc-credit-rule" aria-hidden="true"></span> <span class="rc-credit-label">Actress</span> <strong class="rc-credit-actress">Baby Kitten</strong> </div> </article> <article class="rc-credit-card"> <figure class="rc-credit-photo"><img src="assets/cast/lena.jpg" alt="Portrait of Lena Paul" loading="lazy"></figure> <div class="rc-credit-info"> <span class="rc-credit-index">Cast / 03</span> <span class="rc-credit-label">Character</span> <h2 class="rc-credit-character">Lena</h2> <span class="rc-credit-rule" aria-hidden="true"></span> <span class="rc-credit-label">Actress</span> <strong class="rc-credit-actress">Lena Paul</strong> </div> </article> <article class="rc-credit-card"> <figure class="rc-credit-photo"><img src="assets/cast/lesana.jpg" alt="Portrait of Lesana Mild" loading="lazy"></figure> <div class="rc-credit-info"> <span class="rc-credit-index">Cast / 04</span> <span class="rc-credit-label">Character</span> <h2 class="rc-credit-character">Lesana</h2> <span class="rc-credit-rule" aria-hidden="true"></span> <span class="rc-credit-label">Actress</span> <strong class="rc-credit-actress">Lesana Mild</strong> </div> </article> <article class="rc-credit-card"> <figure class="rc-credit-photo"><img src="assets/cast/kenzie.jpg" alt="Portrait of Kenzie Reeves" loading="lazy"></figure> <div class="rc-credit-info"> <span class="rc-credit-index">Cast / 05</span> <span class="rc-credit-label">Character</span> <h2 class="rc-credit-character">Kenzie</h2> <span class="rc-credit-rule" aria-hidden="true"></span> <span class="rc-credit-label">Actress</span> <strong class="rc-credit-actress">Kenzie Reeves</strong> </div> </article> <article class="rc-credit-card"> <figure class="rc-credit-photo"><img src="assets/cast/cory.jpg" alt="Portrait of Cory Chase" loading="lazy"></figure> <div class="rc-credit-info"> <span class="rc-credit-index">Cast / 06</span> <span class="rc-credit-label">Character</span> <h2 class="rc-credit-character">Cory</h2> <span class="rc-credit-rule" aria-hidden="true"></span> <span class="rc-credit-label">Actress</span> <strong class="rc-credit-actress">Cory Chase</strong> </div> </article> </section> <nav class="rc-credits-actions" aria-label="Credits actions"> <a class="back-button" data-passage="MainMenu"><span class="back-icon">←</span> Return to menu</a> </nav> </main>
<main class="rc-search-page rc-explore-page rc-opening-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">THE FIRST REPORTS / TELEVISION</span><h1>The first reports</h1></div><span class="rc-search-status">DAY ONE</span></header> <section class="rc-search-body" aria-label="The first reports"> <div class="rc-opening-prose"> <p>The first report came from a cemetery outside the city. A groundskeeper said he had seen a man walking between the graves. The man had been buried two days earlier.</p> <p>You watched the presenter call it an isolated incident. The next morning, there were reports from three more cities.</p> <blockquote>“Authorities are investigating aggressive new entities found in recently deceased bodies. Stay indoors. Do not approach them. Further guidance will follow.”</blockquote> <p>You left the television on. The guidance changed every day. The instruction to stay inside did not.</p> </div> </section> <nav class="rc-search-actions"><div class="rc-search-action-list"><a class="button light-choice" data-passage="Opening_SixMonths">Keep watching</a></div></nav> </main>
<main class="rc-search-page rc-explore-page rc-opening-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">SIX MONTHS / INSIDE</span><h1>Six months later</h1></div><span class="rc-search-status">DAY 180</span></header> <section class="rc-search-body" aria-label="Six months later"> <div class="rc-opening-prose"> <p>At first, they called it a virus. One of the last doctors you saw on television said it could not take hold in a living body. Death came first. Then the organism spread through the nervous system, using the brain and the rest of the body to make something new.</p> <p>There was footage of a dog from an animal shelter. It had died that morning. When it moved again, its legs no longer bent the way a dog’s should.</p> <p>People called them zombies, monsters, whatever word came quickest. The names did not change what they did. Every death could leave another aggressive creature behind. Roadblocks failed. Whole neighborhoods emptied. Emergency calls stopped going through. Then the broadcasts stopped too.</p> <p>You stayed home while you had enough to eat and drink. Six months passed that way. Outside, the streets have grown quieter. Inside, your supplies are nearly gone. You take your bag and a wrench and open the door.</p> </div> </section> <nav class="rc-search-actions"><div class="rc-search-action-list"><a class="button light-choice" data-passage="Opening_Safehouse">Go outside</a></div></nav> </main>
<main class="rc-search-page rc-explore-page rc-opening-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">FIRST DAY OUT / NEW SHELTER</span><h1>A place to stay</h1></div><span class="rc-search-status">DAY 180</span></header> <section class="rc-search-body" aria-label="First day outside"> <<if !$opening.entered>> <div class="rc-opening-prose"> <p>Cars still block the road. Weeds have pushed through the pavement, and most of the houses stand open to the weather. You keep moving whenever you hear something behind a wall.</p> <p>Near the end of the street, you find a small house with a door that still closes. You check every room. No one is inside. It will need work, but you could sleep here.</p> </div> <<set $opening.entered = true>> <<else>> <div class="rc-opening-prose"><p>The house is still quiet. There is more to do before you can settle in.</p></div> <</if>> <div class="rc-opening-progress" aria-label="Safehouse progress"> <span class="<<if $opening.room>>is-ready<</if>>"><small>01 / ROOM</small><strong><<if $opening.room>>Ready<<else>>Needs work<</if>></strong></span> <span class="<<if $opening.water>>is-ready<</if>>"><small>02 / WATER</small><strong><<if $opening.water>>Found<<else>>Needed<</if>></strong></span> <span class="<<if $opening.food>>is-ready<</if>>"><small>03 / FOOD</small><strong><<if $opening.food>>Found<<else>>Needed<</if>></strong></span> </div> </section> <nav class="rc-search-actions rc-opening-actions" aria-label="First day tasks"> <<if !$opening.room>><a class="button neutral-choice" data-passage="Opening_Room">Clear a room</a><</if>> <<if !$opening.water>><a class="button neutral-choice" data-passage="Opening_Water">Look for water</a><</if>> <<if !$opening.food>><a class="button neutral-choice" data-passage="Opening_Food">Search for food</a><</if>> <<if $opening.room && $opening.water && $opening.food>><a class="button light-choice" data-passage="Intro">Count your supplies</a><</if>> </nav> </main>
<<if !$opening.room>><<set $opening.room = true>><</if>> <main class="rc-search-page rc-explore-page rc-opening-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">NEW SHELTER / FIRST DAY</span><h1>Clear a room</h1></div><span class="rc-search-status">ROOM READY</span></header> <section class="rc-search-body"><div class="rc-opening-prose"><p>You sweep broken glass into a corner and make space to sleep. The front door holds when you push it shut. A board over the kitchen window moves in the wind; you mean to fix it before dark.</p></div></section> <nav class="rc-search-actions"><div class="rc-search-action-list"><a class="button light-choice" data-passage="Opening_Safehouse">Return to the house</a></div></nav> </main>
<<if !$opening.water>><<set $opening.water = true>><<set $player.Provisions += 1>><</if>> <main class="rc-search-page rc-explore-page rc-opening-page rc-opening-supply-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">NEARBY SHOPS / FIRST DAY</span><h1>Look for water</h1></div><span class="rc-search-status">SUPPLIES FOUND</span></header> <section class="rc-search-body" aria-label="Supplies found"> <div class="rc-opening-prose"><p>Behind a closed shop, you find sealed bottles in an old delivery van. You carry what you can back to the house.</p></div> <div class="rc-opening-recovered"><span class="rc-search-label">Recovered</span><div class="rc-search-find"><img src="assets/icons/water_bottle.svg" alt=""><strong>+1 Provisions</strong></div></div> </section> <nav class="rc-search-actions"><div class="rc-search-action-list"><a class="button light-choice" data-passage="Opening_Safehouse">Return to the house</a></div></nav> </main>
<<if !$opening.food>><<set $opening.food = true>><<set $player.Provisions += 1>><</if>> <main class="rc-search-page rc-explore-page rc-opening-page rc-opening-supply-page"> <header class="rc-search-header"><div><span class="rc-search-kicker">CORNER STORE / FIRST DAY</span><h1>Search for food</h1></div><span class="rc-search-status">SUPPLIES FOUND</span></header> <section class="rc-search-body" aria-label="Supplies found"> <div class="rc-opening-prose"><p>The corner store has been picked over. Two tins are still wedged behind a fallen shelf, their lids intact. You put them in your bag and head home.</p></div> <div class="rc-opening-recovered"><span class="rc-search-label">Recovered</span><div class="rc-search-find"><img src="assets/icons/canned_food.svg" alt=""><strong>+1 Provisions</strong></div></div> </section> <nav class="rc-search-actions"><div class="rc-search-action-list"><a class="button light-choice" data-passage="Opening_Safehouse">Return to the house</a></div></nav> </main>
<main class="rc-encounter-page rc-sophia-work-for-stay-page"> <header class="rc-encounter-header"><div><span class="rc-encounter-kicker">SAFEHOUSE / ENCOUNTER</span><h1>Sophia</h1><p>Terms of stay</p></div><span class="rc-encounter-location">FIRST CONTACT</span></header> <aside class="rc-encounter-presence" aria-label="People present"> <img class="rc-encounter-scene-image" src="assets/cast/sophia.jpg" alt="Sophia at the safehouse"> <h2>Present</h2> <div class="rc-encounter-person"><img src="assets/cast/sophia.jpg" alt=""><div><strong>Sophia</strong><span>Survivor</span></div></div> <div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div> <p class="rc-encounter-person-detail">The tin is back on the table. Sophia still has her bag over one shoulder.</p> </aside> <section class="rc-encounter-log" aria-label="Encounter"> <h2>Encounter</h2> <p class="rc-encounter-event">You leave the tin between you and keep your voice firm.</p> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“You can stay tonight. Tomorrow, you work here or go out for supplies. You owe me for the food you tried to take. If you take anything else without asking, you leave.”</p></div> <div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Sophia</span></div><p>“All right.” She sets her bag by the wall. “I can work.”</p></div> <<run setup.recruitResident($player, "sophia_status", "ally")>> </section> <nav class="choice-container rc-encounter-actions" aria-label="Available actions"><h2>Give her a first task</h2><div class="rc-encounter-action-list"><a class="button neutral-choice" data-passage="Sophia_Start_Scavenging">Start scavenging</a><a class="button light-choice" data-passage="Sophia_Cooks">Assign cooking</a></div></nav> </main>
<main class="rc-combat-outcome rc-execution-page"><header class="rc-outcome-header"><span class="rc-ui-kicker">HOSTILE CONTACT / AFTERMATH</span><h1>Lena's pistol</h1></header> <div class="rc-outcome-grid"><figure class="rc-outcome-portrait"><img src="assets/cast/lena.jpg" alt=""><figcaption>Execution of Lena</figcaption></figure><section class="rc-outcome-report"> <<if !$player.lena_pistol_taken>> <<set $player.Pistol += 1>> <<set $player.lena_pistol_taken = true>> <p>You hurry around the car and pick up Lena's pistol. More metal rattles farther down the street. You put the gun in your bag and move before anything comes into view.</p> <section class="loot rc-loot" aria-label="Recovered weapon"><header class="rc-loot-header"><span>RECOVERED / STREET</span><h3>Weapon secured</h3></header><ul><li><img src="assets/icons/pistol.svg" alt=""><span>Pistol</span><strong>+1</strong></li></ul></section> <<else>> <p>You've already taken Lena's pistol. The street is getting louder.</p> <</if>> </section></div> <nav class="rc-outcome-actions"><a class="button" data-passage="City_Center">Return</a></nav> </main>
<<set $kenzie.met = true>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / FIRST MEETING</span><h1>Kenzie</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">Kenzie has a shotgun in pieces across her front step. She waves you over without looking up.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“If you came to complain about the noise, the spring did that on its own. I only screamed at it.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“You always work on weapons outside?”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Scout work, fence repairs, finding the things people swear they didn’t lose. This is my day off. So, naturally, the gun broke.” She fits the spring back into place and grins. “Kenzie. You?”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“<<print $player.name>>.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Good to meet you. If I find anything with your name on it, I’ll charge a very reasonable finder’s fee.”</p></div><p class="rc-encounter-event">She tests the action, then starts packing her tools. There is a folded map under her elbow.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Working on anything now?”</p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button " data-passage="Kenzie_Investigation">Hear about her investigation</a><a class="button back-btn" data-passage="Residential_District">Leave her to her work</a></div></nav></main>
<<set $bunker_quest_progress = "Phase 1">><<set $discovered_bunker = true>><<set $kenzie.met = true>><<set $kenzie.offered = true>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / QUEST START</span><h1>A route to Mistral</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“I’ll go with you.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“That sounded dangerously like a yes. Start at the old bunker. The route past it leads to the estate. I’ll bring the shotgun and my best terrible jokes.”</p></div><p class="rc-encounter-event">Kenzie marks the bunker on your map. Follow the route from there to reach Mistral Mansion.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button back-btn" data-passage="Residential_District">Return to the district</a></div></nav></main>
<main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / INVESTIGATION</span><h1>Kenzie</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I’ve got shells and a route. Still working on a joke good enough for whatever’s inside that place.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Save it for the walk.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Deal. Take the route past the bunker. I’ll meet you at Mistral.”</p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button back-btn" data-passage="Residential_District">Return to the district</a></div></nav></main>
<<set $kenzie.gate_talk = true>><<set $kenzie.attitude = "friendly">><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / APPROACH</span><h1>At the gate</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“If the holes move, you shoot first.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Deal. If the house moves, we both run.” She laughs, then checks your footing before leading you inside.</p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button " data-passage="Mistral_Entered">Enter together</a></div></nav></main>
<<set $kenzie.gate_talk = true>><<set $kenzie.attitude = "dry">> <main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / APPROACH</span><h1>At the gate</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“Watch the entrances. We can talk inside.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Got it.” She checks the shotgun and moves ahead to cover the doorway.</p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button" data-passage="Mistral_Entered">Enter together</a></div></nav></main>
<<if !$kenzie>><<set $kenzie = { met: true, offered: true, outcome: "none", saved_visits: 0, camp_visits: 0, romance: false, attitude: "friendly" }>><</if>><<set $kenzie.outcome = "decision_pending">><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / LIVING ROOM</span><h1>One last movement</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">The creature crashes into the furniture. You think it is finished. Its arm lashes out and catches Kenzie by the shoulder, dragging her against the broken frame.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Hey. Little help?” She tries to bring the shotgun around, but the barrel is pinned.</p></div><p class="rc-encounter-event">You have one clear moment to act.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button light-choice" data-passage="Kenzie_Stop_Monster">Stop the monster first</a><a class="button neutral-choice" data-passage="Kenzie_Try_Help">Rush to Kenzie (she gets hurt)</a><a class="button danger-choice" data-passage="Kenzie_Let_Die">Let her die</a></div></nav></main>
<<set $mistral.Mistral_Living_room = 0>><<set $bunker_quest_progress = "Complete">><<set $kenzie.outcome = "saved">><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / AFTERMATH</span><h1>Both of you make it out</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">You strike before the creature can tighten its grip. It falls away from Kenzie and does not move again.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I had it completely under control.” She looks at the marks on her jacket. “Okay. I had maybe ten percent of it under control.”</p></div><p class="rc-encounter-event">Her smile comes back slowly. She stays close while you search the wall and find a scratched code: A2B4C977. It may belong to the bunker, though its lock still has no power.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I’ll head home. Come by when you’re back? I’d like to see you somewhere with fewer teeth.”</p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button back-btn" data-passage="Outside">Return Outside</a></div></nav></main>
<<set $mistral.Mistral_Living_room = 0>><<set $kenzie.outcome = "injured_pending">><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / AFTERMATH</span><h1>Too late</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">You rush to pull Kenzie free. The creature's claws tear into her before you break its grip. You drive your weapon into it, and it finally stops moving. Kenzie drops to the floor, conscious and bleeding badly.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“You got it. Just... give me a second.” She tries to stand and cannot.</p></div><p class="rc-encounter-event">She cannot make the trip to the Settlement alone. Behind the fallen frame is a scratched code, A2B4C977, but there is no time to investigate the bunker now.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button light-choice" data-passage="Kenzie_Help_Her">Help her</a><a class="button dark-choice" data-passage="Kenzie_Enslave">Offer to make her a slave</a></div></nav></main>
<<set $bunker_quest_progress = "Complete">><<run setup.recruitKenzie($player, $kenzie, "camp_help")>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / AFTERMATH</span><h1>Bring Kenzie home</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">You bind the wound, take her weight, and guide her out through the cleared rooms. At your safehouse, you give her a place to rest and fresh dressings.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I know you tried. If you say ‘walk it off,’ I’m throwing a pillow at you. Once I can lift one.”</p></div><p class="rc-encounter-event">Kenzie joins your safehouse as an ally while she recovers.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button light-choice" data-passage="Safehouse">Take her to the safehouse</a></div></nav></main>
<<set $bunker_quest_progress = "Complete">><<run setup.recruitKenzie($player, $kenzie, "camp_slave")>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">MISTRAL / AFTERMATH</span><h1>Terms at the doorway</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">Kenzie needs help to walk. You tell her you will take her to your safehouse only if she agrees to serve you there.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“That’s your price?” Her usual joke dies before it reaches her mouth. She looks at the blood soaking through the bandage. “I can’t get back alone. Fine. Get me out.”</p></div><p class="rc-encounter-event">You carry her to the safehouse. Kenzie joins the household as a slave. She remembers the condition you imposed.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button dark-choice" data-passage="Safehouse">Take her to the safehouse</a></div></nav></main>
<<set $mistral.Mistral_Living_room = 0>><<set $bunker_quest_progress = "Complete">><<set $kenzie.outcome = "dead">><main class="rc-sequence-page"><header class="rc-sequence-header"><span class="rc-ui-kicker">MISTRAL / AFTERMATH</span><h1>Kenzie</h1></header><div class="rc-sequence-grid"><figure class="rc-sequence-portrait"><img src="assets/cast/kenzie.jpg" alt="Kenzie"></figure><section class="rc-sequence-report"><p>You hold back. The creature drags Kenzie down. By the time it goes still, she is dead.</p><p>You find A2B4C977 scratched behind a fallen frame. The bunker lock still has no power.</p></section></div><nav class="rc-sequence-actions"><a class="button back-btn" data-passage="Outside">Leave the mansion</a></nav></main>
<<set $kenzie.saved_visits += 1>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / AFTER MISTRAL</span><h1>Kenzie</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><<if $kenzie.saved_visits == 1>><p class="rc-encounter-event">Kenzie opens the door before you knock. The shotgun is on the table, cleaned and unloaded.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I keep thinking about that thing grabbing me. Then I remember you were there.” She tries a grin. “Also, my jacket is ruined. Tragic.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Thanks for getting us both home. Really.”</p></div><<elseif $kenzie.saved_visits == 2>><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I saved you a seat. The one that isn’t under the leak.” She shifts her chair closer.</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“So... how exactly am I supposed to repay someone for saving my life?”</p></div><p class="rc-encounter-event">She watches your face, still smiling, but waits for your answer.</p><<else>><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“There you are. I was about to pretend I needed help with the shotgun again.”</p></div><<if $kenzie.romance>><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“You could stay a while. I’d like that.”</p></div><</if>><</if>></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><<if $kenzie.saved_visits >= 2 && !$kenzie.romance>><a class="button light-choice" data-passage="Kenzie_Flirt">Flirt back</a><</if>><<if $kenzie.romance>><a class="button light-choice" data-passage="Kenzie_Sex">Be intimate</a><</if>><a class="button " data-passage="Kenzie_Reminisce">Talk about the mansion</a><a class="button back-btn" data-passage="Residential_District">Return to the district</a></div></nav></main>
<<set $kenzie.romance = true>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / KENZIE</span><h1>A little closer</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“You could start by letting me visit without making up an excuse.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Dangerous offer. I might actually take you up on it.”</p></div><p class="rc-encounter-event">She catches your hand for a moment, then lets you decide whether to stay.</p><p class="rc-encounter-event">Kenzie welcomes you back. More personal time together is now available when you visit.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button back-btn" data-passage="Residential_District">Return to the district</a></div></nav></main>
<main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">RESIDENTIAL DISTRICT / KENZIE</span><h1>What happened at Mistral</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I can still hear the kitchen pans falling over. You were trying to listen for monsters, and I was trying not to laugh.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>You</span></div><p>“You kept shooting.”</p></div><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“Of course. Jokes are for after the reload.”</p></div></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button " data-passage="Kenzie_Settlement_Talk">Continue talking</a><a class="button back-btn" data-passage="Residential_District">Return to the district</a></div></nav></main>
<<if $kenzie.outcome != "camp_help" && $kenzie.outcome != "camp_slave">><<goto "Safehouse">><</if>><<set $kenzie.camp_visits += 1>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">SAFEHOUSE / RECOVERY</span><h1>Kenzie</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><<if $kenzie.outcome == "camp_help">><p class="rc-encounter-event"><<if $kenzie.recovery_days >= 3>>Kenzie can move around the safehouse again. She still favors her injured shoulder.<<else>>Kenzie is sitting up now, her bandages changed. Her shotgun rests out of reach until her shoulder heals.<</if>></p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><<if $kenzie.camp_visits == 1>><p>“Next time I suggest exploring a mansion, remind me the last one got one star.” She shifts, winces, then looks at you. “Thanks for getting me out. And for letting me stay.”</p><<elseif $kenzie.recovery_days < 3>><p>“I made it to the door today. Getting back was less impressive.” She nods toward the chair. “Stay a minute?”</p><<else>><p>“Made it to the kitchen without an escort.” She nudges a chair toward you with her foot. “Sit. I found something that claims to be coffee.”</p><</if>></div><<else>><p class="rc-encounter-event"><<if $kenzie.recovery_days >= 3>>Kenzie is back on her feet, but keeps her distance when you enter.<<else>>Kenzie sits near the window, keeping her injured shoulder still. She goes quiet when you enter.<</if>></p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><<if $kenzie.camp_visits == 1>><p>“The dressings are on the shelf. Go ahead, since you're here.” She keeps her eyes on the window. “Don't get comfortable. I haven't forgotten what you made me agree to.”</p><<elseif $kenzie.recovery_days < 3>><p>“You can change the bandage. I still can't reach it properly.” She pulls away as soon as you finish. “Leave the rest where I can get it.”</p><<else>><p>“If there's work, tell me what needs doing. I'll do it.” She folds her arms. “Doesn't mean I have to like you.”</p><</if>></div><</if>></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><<if $kenzie.outcome == "camp_help" && $kenzie.camp_visits >= 2 && !$kenzie.romance>><a class="button light-choice" data-passage="Kenzie_Camp_Closer">Stay and get closer</a><</if>><<if $kenzie.outcome == "camp_help" && $kenzie.romance>><a class="button light-choice" data-passage="Kenzie_Camp_Closer">Spend time together</a><</if>><a class="button back-btn" data-passage="Safehouse">Return to the safehouse</a></div></nav></main>
<<if $kenzie.outcome != "camp_help">><<goto "Safehouse">><</if>><<set $kenzie.romance = true>><main class="rc-encounter-page"><header class="rc-encounter-header"><div><span class="rc-encounter-kicker">SAFEHOUSE / KENZIE</span><h1>An afternoon together</h1></div><span class="rc-encounter-location">KENZIE / MISTRAL</span></header> <aside class="rc-encounter-presence"><img class="rc-encounter-scene-image" src="assets/cast/kenzie.jpg" alt="Kenzie"><h2>Present</h2><div class="rc-encounter-person"><img src="assets/cast/kenzie.jpg" alt=""><div><strong>Kenzie</strong><span>Scout</span></div></div><div class="rc-encounter-person rc-encounter-person-player"><div><strong><<print $player.name>></strong><span>You</span></div></div></aside><section class="rc-encounter-log"><h2>Encounter</h2><p class="rc-encounter-event">You pull up a chair. Kenzie tells you how she learned to scout by taking wrong turns until she could find her way back. When she laughs, she has to hold her side.</p><div class="rc-encounter-statement"><div class="rc-encounter-speaker"><span>Kenzie</span></div><p>“I like you here. Next time, bring a story that doesn’t involve a monster trying to eat me.”</p></div><p class="rc-encounter-event">The two of you keep talking. Kenzie’s recovery and your relationship can continue through visits at the safehouse.</p></section> <nav class="choice-container rc-encounter-actions"><h2>What will you do?</h2><div class="rc-encounter-action-list"><a class="button back-btn" data-passage="Safehouse">Return to the safehouse</a></div></nav></main>
<<if !$player.sophia_tied_unlocked>> <<goto "Sophia_Interact">> <<elseif $player.stamina < 10 && !$player.sophia_tied_intro_pending>> <div class="scene-content rc-service-unavailable"> <header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="warning-message">You do not have enough stamina for sexual actions!</div> <div class="choice-container"> <a class="button back-btn" data-passage="Sophia_Interact">← Back</a> </div> </div> <<else>> <div class="scene-content rc-service-page" data-rc-service="sophiaTied"> <header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="video-container"> <video class="scene-video" autoplay muted loop playsinline> <source src="assets/videos/sophia/sophia tape/Blowjob_1.webm" type="video/webm"> </video> </div> <div class="service-menu"> <div class="menu-title">Choose an action:</div> <div class="service-buttons"> <a class="service-btn" data-rc-video="blowjob" role="button" tabindex="0">Blowjob</a> <a class="service-btn" data-rc-video="vaginal" role="button" tabindex="0">Vaginal</a> <a class="service-btn" data-rc-video="finish" role="button" tabindex="0">Finish</a> </div> <<if $player.sophia_tied_intro_pending>> <a class="button dark-choice" data-passage="Sophia_Tied_Intro_Finish">Continue</a> <<else>> <a class="button back-btn" data-passage="Sophia_Interact">← Back</a> <</if>> </div> </div> <</if>>
<<if !$player.sophia_tied_intro_pending>> <<goto "Sophia_Interact">> <<else>> <<set $player.stamina = Math.max(0, $player.stamina - 30)>> <<set $player.sophia_status = "slave">> <<set $player.sophia_tied_intro_pending = false>> <<set $player.survivor_population ++>> <main class="scene-content rc-service-page rc-service-cinematic"><header class="rc-service-header"><img src="assets/cast/sophia.jpg" alt=""><div><span>SAFE HOUSE / PRIVATE INTERACTION</span><h1>Sophia</h1></div></header> <div class="video-container"><video id="tiedIntroFinishVideo" class="scene-video" autoplay muted loop playsinline><source src="assets/videos/sophia/sophia tape/Finish.webm" type="video/webm"></video></div> <nav class="rc-cinematic-exit"><a class="button dark-choice" data-passage="Sophia_Aftermath">Continue</a></nav></main> <</if>>
<<if $bunker_quest_progress == "Phase 1" or $bunker_quest_progress == "Complete" or $bunker_quest_progress == "END">> <<set $discovered_mistral_mansion = true>><<set $mistral_route_opened = true>><<goto "Mistral_Mansion">> <<else>> <<goto "Bunker">> <</if>>